2016-06-11 308 views
3

这是我第一次尝试在面包板上编码Raspberry Pi和硬件按钮。该程序很简单,当检测到按钮按下时,打开面包板上的LED 1秒钟。我的代码似乎工作,但奇怪的是每经常一个按钮推动触发回调函数两次。我是一个总编程noob,所以我不确定问题是否与我的代码,或者如果硬件或按钮实际上下降两次。我希望这里有人能帮我解决这种奇怪的问题。这里是我的代码:按钮GPIO.FALLING事件触发两次

#!/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() 
+0

为什么你永远循环循环? –

+0

我需要我的代码连续运行。如果你有更好的方法来做到这一点,我很乐意尝试另一种方法.. – szaske

+0

但是,你应该不是在听循环中的事件吗? –

回答

1

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

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