按钮 GPIO.FALLING 事件被触发两次
Push button GPIO.FALLING event getting triggered twice
这是我第一次尝试在面包板上编写 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()
我找到了解决办法。使用代码 here,解决了我的问题。
如果您像我一样,在使用 GPIO.add_event_detect 时遇到随机重复的按钮按下事件,请尝试使用链接代码。
尝试为您的事件检测调用添加去抖动值。单位是毫秒。
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light, bouncetime = 250)
就像@DanGoodrick 提到的那样,您需要添加反弹时间,但它需要大于回调完成计算所需的时间。
例如。如果您的回调需要 1 秒才能退出,则您的反弹时间需要更长,所以可能需要 1.5 秒。
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light bouncetime=1500)
这是我第一次尝试在面包板上编写 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()
我找到了解决办法。使用代码 here,解决了我的问题。
如果您像我一样,在使用 GPIO.add_event_detect 时遇到随机重复的按钮按下事件,请尝试使用链接代码。
尝试为您的事件检测调用添加去抖动值。单位是毫秒。
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light, bouncetime = 250)
就像@DanGoodrick 提到的那样,您需要添加反弹时间,但它需要大于回调完成计算所需的时间。
例如。如果您的回调需要 1 秒才能退出,则您的反弹时间需要更长,所以可能需要 1.5 秒。
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=Light bouncetime=1500)