【问题标题】:Python GPIO wait for either of two buttons to be pressedPython GPIO等待两个按钮中的任何一个被按下
【发布时间】:2016-04-13 23:18:59
【问题描述】:

我的 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"

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

【问题讨论】:

    标签: python


    【解决方案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

    【讨论】:

    • 感谢您的回答!但是,添加两个事件检测器不能一个接一个地启动吗?当它仍在处理第一次按下的代码时,我不能按下按钮。我不明白这是如何防止这种情况发生的?
    • 如果您查看链接页面上的示例,您会看到它是如何使用进程队列在进程之间传递消息的。然后,您可以使用它来根据需要设置标志来处理起搏。例如,如果您为每个按钮设置一个单独的进程...在按钮 1 的循环中,您将有一个语句说类似“如果 buttonTwoPress == false”,然后是一个设置自己的标志的赋值“ buttonOnePress = true"。按钮两个过程将有相反的情况:“if buttonOnePress = false”和“buttonTwoPress = true”。
    • 重要的安全提示:同时按下两个按钮的可能性很小,但确实存在。为了帮助处理这种可能性,大多数语言都有类和工具来建立互斥体和信号量。这将防止两个单一进程同时发生。
    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2013-08-02
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多