Python GPIO等待按下两个按钮中的任何一个

时间:2016-04-13 12:57:30

标签: python

我的Python代码目前正在循环,在我想要它重新循环之前,我真的希望能够检测到两个按钮中的一个。根据按下的按钮,应该执行代码的不同部分。

对于一个按钮,这将是这样的:

while True:
        time.sleep(0.2)
        GPIO.wait_for_edge(button_1, GPIO.FALLING)
        run_button_1_code()

我如何才能为两个按钮执行此操作?我正在思考这个问题:

while True:
        time.sleep(0.2)
        GPIO.wait_for_edge(button_1, button_2, GPIO.FALLING)
        if button_1 is pressed:
             run_button_1_code()
        elif button_2 is pressed:
             run_button_2_code()

或许可选择:

def button_1():
    GPIO.remove_event_detect(button1)
    print "doing my code here"
    GPIO.add_event_detect(button1, GPIO.BOTH, callback=button_1, bouncetime=800)

def button_2():
    GPIO.remove_event_detect(button2)
    print "doing my code here"
    GPIO.add_event_detect(button2, GPIO.BOTH, callback=button_2, bouncetime=800)

While True:
    time.sleep(0.05)
        print "waiting for button"

我想不出任何其他选择..请指教!

1 个答案:

答案 0 :(得分:1)

一般来说,与硬件交互时,有两种方法可以实现。如果计算机/操作系统允许中断跟踪,这将是您最好的选择。你基本上设置了一个子程序,让操作系统知道如果发生了一些有趣的事情,它就会等待被唤醒。

如果你在Raspberry PI上开发它,那么有一个Python库可以帮助完成这项工作:

GPIO.add_event_detect(GPIO_ONOFF, GPIO.FALLING, callback=quit_loop, bouncetime=300)

如果您使用的是其他系统,或者您希望获得更多控制权,那么设置第二个线程/进程是显而易见的选择。线程的工作方式与中断处理的工作方式大致相同。您设置了一个方法,然后让操作系统知道它应该独立运行。关键的区别在于线程/进程始终处于活动状态,必须被视为独立程序,而中断例程处于空闲状态直到需要它为止。

Process(target=processMessages).start()

这两个解决方案都在一个相关的问题中进行了讨论:

Raspberry Pi Python pause a loop sequence, when button pushed