微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RPi.GPIO 多按钮一个回调函数:管理队列和忽略按钮按下?

如何解决RPi.GPIO 多按钮一个回调函数:管理队列和忽略按钮按下?

我有四个按钮连接到我的 RaspBerry Pi 上的回调函数。按其中一个按钮启动回调函数,打印引脚编号并休眠 2 秒。

import RPi.GPIO as GPIO
from time import sleep
from signal import pause
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
try:
    def handleBtnPress(pinNum):   
            switcher = {
                5: "Button 1 pressed",6: "Button 2 pressed",13: "Button 3 pressed",19: "Button 4 pressed"
            }
            print(switcher.get(pinNum,"Error,pin number for button press not defined"))
            sleep(2)
            print("2sec passed,work is done")


    GPIO.setup(5,GPIO.IN,GPIO.PUD_UP)
    GPIO.setup(6,GPIO.PUD_UP)
    GPIO.setup(13,GPIO.PUD_UP)
    GPIO.setup(19,GPIO.PUD_UP)

    GPIO.add_event_detect(5,GPIO.FALLING,handleBtnPress,bouncetime=300)
    GPIO.add_event_detect(6,bouncetime=300)
    GPIO.add_event_detect(13,bouncetime=300)
    GPIO.add_event_detect(19,bouncetime=300)

    pause()
except KeyboardInterrupt:
    GPIO.cleanup()

当我快速连续按下从 1 到 4 的所有四个按钮时(在回调函数传递内的 2 秒之前),我得到输出

Button 1 pressed
2sec passed,work is done
Button 2 pressed
2sec passed,work is done
Button 3 pressed
2sec passed,work is done
Button 4 pressed
2sec passed,work is done

所以我的理解是,这些按钮按下被放入某种队列中(至少从我的测试看来是按时间顺序排列的)并且线程回调函数连续执行四次,因为只有一个额外的线程正在管理所有回调.我的问题是如何管理此队列,以便在回调函数仍在从第一次按钮按下开始执行其 2 秒程序时忽略进一步的按钮按下并且不排队。 不幸的是,我无法使用 gpiozero 按钮,因为我有其他依赖 RPi.GPIO 的模块,并且它们与 gpiozeros 清理发生冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。