【发布时间】:2017-02-08 16:20:51
【问题描述】:
我目前有 2 个按钮连接到我的 Raspberry Pi(这些按钮带有环形 LED),我正在尝试执行此代码
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.OUT) #green LED
GPIO.setup(18, GPIO.OUT) #red LED
GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) #green button
GPIO.setup(27, GPIO.IN, GPIO.PUD_UP) #red button
def remove_events():
GPIO.remove_event_detect(4)
GPIO.remove_event_detect(27)
def add_events():
GPIO.add_event_detect(4, GPIO.FALLING, callback=green, bouncetime=800)
GPIO.add_event_detect(27, GPIO.FALLING, callback=red, bouncetime=800)
def red(pin):
remove_events()
GPIO.output(17, GPIO.LOW)
print "red pushed"
time.sleep(2)
GPIO.output(17, GPIO.HIGH)
add_events()
def green(pin):
remove_events()
GPIO.output(18, GPIO.LOW)
print "green pushed"
time.sleep(2)
GPIO.output(18, GPIO.HIGH)
add_events()
def main():
while True:
print "waiting"
time.sleep(0.5)
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)
GPIO.add_event_detect(4, GPIO.FALLING, callback=green, bouncetime=800)
GPIO.add_event_detect(27, GPIO.FALLING, callback=red, bouncetime=800)
if __name__ == "__main__":
main()
从表面上看,它看起来像是一个相当简单的脚本。当检测到按钮按下时:
- 删除事件
- 打印消息
- 在添加事件并重新打开 LED 之前等待 2 秒
当我按下绿色按钮时,通常效果很好。我连续试了好几次,都成功了。然而,对于红色,它第一次运行良好,第二次运行良好,但在完成第二次红色(pin)循环后,脚本就停止了。
考虑到这两个事件非常相似,我无法解释为什么它在第二个红色按钮的末尾失败。
编辑:我已分别将引脚从红色和绿色更改(完全更改为不同的引脚或交换它们)。无论哪种方式,它总是红色按钮代码(实际上现在是绿色按钮)导致错误。所以看起来它不是物理红色按钮问题,也不是引脚问题,这只会让代码出错......
【问题讨论】:
-
也许其中一个
GPIO.output调用引发了异常,然后add_events()再也没有被调用? -
感谢您对此事的看法。我添加了 except 子句,但它们没有被触发。看起来不是这个。
-
它也无法解释为什么它一次运行良好但在第二个周期结束时总是失败......
-
此代码没有显示我可以看到的任何其他可能性。这就是你拥有的所有代码吗?您是否尝试过其他输出引脚(17 和 18 除外)?您是否尝试过其他输入引脚(4 和 27 除外)?如果您交替点击 1 次绿色点击 - 1 次红色点击等会发生什么。在第二次点击红色或第二次绿色点击后它是否仍然停止响应?你能看到一些串行监视器上的打印吗?如果是,请添加更多(例如,在每一行之后),以便您知道问题之前的确切路径。
-
这就是我拥有的所有代码。我也试过不同的别针,是的。结果似乎惊人地相同。我也交替了,无论我尝试什么,它似乎总是停在红色的第二个周期(即 1 个红色,10 个绿色,然后再有 1 个红色)我还添加了打印行以查看它出错的地方和它一直到最后一行代码,所以我真的很困惑......
标签: python raspberry-pi gpio