【发布时间】:2015-10-02 03:23:16
【问题描述】:
我在树莓派上运行一段 python 代码。
代码的作用是将GPIO 5设置为上拉电阻,并附有瞬时开关。当按下开关时,它会将上拉电阻接地。我正在尝试使用按钮推送来触发回调。
回调的工作方式如下:
如果按钮被按下并检测到仍被按下,它将定义一个名为“t1”的变量作为当前时间。
如果检测到按钮不再按下,则定义一个名为“t2”的变量,然后从“t2”中减去“t1”以找到时间差(按下按钮的时间量)。然后将该值转换为定义为变量“deltaseconds”的整数。然后它根据按钮被按住的长度采取行动。如果超过 7 秒,重新启动树莓派,如果超过 1 秒但小于 7 秒,它会在高低之间切换输出 GPIO(12)。
我遇到的问题是这样的:
代码运行
按下按钮时,我看到“按下按钮 5”
释放按钮时,我看到打印“按钮 5 已释放”
然后错误显示为"UnboundLocalError: local variable 't1' referenced before assignment"
错误参考第 21 行 delta = t2-t1
完整代码如下所示:
import os
import RPi.GPIO as GPIO
import webiopi
import time
import datetime
from datetime import datetime
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
BUTTON_5 = 5
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,1)
#Just to visually distinguish between setup steps and main program
def pressed(BUTTON_5):
if GPIO.input(5) == False:
t1 = datetime.now()
print "Button 5 pressed"
elif GPIO.input(5) == True:
print "Button 5 released"
t2 = datetime.now()
delta = t2-t1
deltaseconds = delta.total_seconds()
if (deltaseconds > 7) : # pressed for > 7 seconds
print "Restarting System"
subprocess.call(['shutdown -r now "System halted by GPIO action" &'], shell=True)
elif (deltaseconds > 1) : # press for > 1 < 7 seconds
print "Toggling GPIO 12"
GPIO.output(12, not GPIO.input(12))
GPIO.add_event_detect(BUTTON_5, GPIO.BOTH, bouncetime=200)
GPIO.add_event_callback(BUTTON_5, pressed)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup() # clean up GPIO on CTRL+C exit
【问题讨论】:
-
您在上面的
if语句中将t1设置为datetime.now(),然后您尝试在下面的elif语句中访问它。 -
是的! @dursk 是对的!您的 elif 条件正在运行,其中 t1 变量未定义。
-
有道理,谢谢。话虽如此,我已经尝试过移动它,但我想我已经达到了我在这方面的专业知识的极限,因为我找不到将它放在它工作的地方。你能告诉我在哪里可以定义变量以保持值吗?
标签: python variables time callback gpio