【问题标题】:Push button GPIO.FALLING event getting triggered twice按钮 GPIO.FALLING 事件被触发两次
【发布时间】:2016-06-11 23:43:47
【问题描述】:

这是我第一次尝试编写 Raspberry Pi 和面包板上的硬件按钮。程序很简单,当检测到按下按钮时,打开面包板上的 LED 1 秒钟。我的代码似乎可以工作,但奇怪的是,每按一次按钮就会触发两次回调函数。我是一个完全编程的菜鸟,所以我不确定问题是否出在我的代码上,或者硬件或按钮是否实际上以某种方式下降了两次。我希望这里有人可以帮助我解决这个奇怪的问题。这是我的代码:

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time


LedPin = 11    # pin11 --- led
BtnPin = 12    # pin12 --- button

def setup():
    GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
    GPIO.setup(LedPin, GPIO.OUT)   # Set LedPin's mode is output
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Set BtnPin's mode is input, and pull up to high level(3.3V)
    GPIO.output(LedPin, GPIO.HIGH) # Set LedPin high(+3.3V) to off led

def Light(ev=None):
        print 'A button press was detected'
        GPIO.output(LedPin, 0)  # switch led status on
        time.sleep(1)
        GPIO.output(LedPin, 1)  # switch led status off

def loop():
    GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light) # wait for Button Press (GPIO Falling)
    while True:
        pass   # Don't do anything, sit forever 

def destroy():
        GPIO.output(LedPin, GPIO.HIGH)     # led off
        GPIO.cleanup()                     # Release resource

if __name__ == '__main__':     # Program start from here
    setup()
    try:
        loop()
    except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
        destroy()

【问题讨论】:

  • 你为什么一直在循环中循环?
  • 我需要我的代码连续运行。如果您有更好的方法来做到这一点,我很乐意尝试另一种方法..
  • 但是你不应该在循环中监听事件吗?

标签: python raspberry-pi raspberry-pi2 gpio


【解决方案1】:

尝试在事件检测调用中添加去抖动值。单位是毫秒。

GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light, bouncetime = 250) 

【讨论】:

    【解决方案2】:

    我找到了解决方案。使用代码here,解决了我的问题。

    如果你和我一样,并且在使用 GPIO.add_event_detect 时得到随机重复的按钮按下事件,请尝试使用链接代码。

    【讨论】:

    • 不起作用。 GPIO.input(PIN_VAL) 永远不会是假的。
    【解决方案3】:

    就像@DanGoodrick 提到的那样,您需要添加反弹时间,但它需要大于您的回调完成其计算所需的时间。

    例如。如果您的回调需要 1 秒才能退出,那么您的反弹时间需要更长,所以可能需要 1.5 秒。
    GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light bouncetime=1500)

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多