2016-06-11 17 views
3

これは、ブレッドボード上のラズベリーパイとハードウェアプッシュボタンをコーディングする最初の試みです。プログラムは簡単です。ボタンが押されたときは、ブレッドボードのLEDを1秒間オンにします。私のコードはうまくいくと思われますが、奇妙なことに、たいていの場合、ボタンを1回押すだけでコールバック関数が2回トリガされます。私は全面的なプログラミングのnoobだから、私のコードに問題があるかどうか、またはHWやボタンが何とか実際に2回落ちているかどうかはわかりません。ここの誰かがこの奇妙な問題のトラブルシューティングを手助けできることを願っています。ここに私のコードです:プッシュボタンGPIO.FALLINGイベントが2回トリガされる

#!/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を使用しているときにランダムな重複ボタンプレスイベントが発生する場合は、リンクされたコードを代わりに試してください。

関連する問題