2016-05-28 38 views
0

與瞬時按鈕的繼電器,我能夠與下面的代碼瞬時按鈕來控制繼電器:控制在Python

#!/usr/bin/env python 

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(17, GPIO.IN, GPIO.PUD_UP) 
GPIO.setup(4, GPIO.OUT) 

GPIO.output(4, GPIO.HIGH) 

def callback_func(pin): 
    if GPIO.input(17): 
     GPIO.output(4, GPIO.HIGH) 
    else: 
     GPIO.output(4, GPIO.LOW) 

GPIO.add_event_detect(17, GPIO.BOTH, callback=callback_func, bouncetime=200) 

def main(): 
    while True: 
     print "Not blocking! You're free to do other stuff here" 
     time.sleep(5) 

if __name__ == "__main__": 
    main() 

然而這似乎是隻有一次。一旦我釋放botton並再次嘗試,無論多少時間之間都無法工作。是否有一個特定的原因,它只會運行一次?

最好我希望能夠繼續使用這個按鈕,而不必停止python腳本並重新啓動它以獲得一次性按鈕中繼操作。

謝謝!

+0

快速瀏覽,這兩種可能性是:你需要添加更多的代碼到你的while循環,和/或你需要的GPIO引腳復位輸出到初始狀態。當按下按鈕時,你想要什麼?順便說一下,我建議把所有的設置語句放到一個設置函數中... – Projski

+0

OP,我寫了你從內存中使用的代碼,並且當時無法測試它。我現在看到,反彈使腳本錯過了釋放按鈕時出現的上升沿 - 至少如果你快速釋放它的話。我已經相應地更新了我對原來問題的回答。如果你在沒有任何反彈的情況下得到抖動,可以考慮重新添加「反彈時間」,但將其設置爲非常低的值 - 這是需要調整和測試的事情之一,因爲所有按鈕和手指都略有不同。無論如何,很高興你找到了它,並得到它的工作:) – jDo

回答

1

刪除彈跳時間完全解決了問題。所以:

GPIO.add_event_detect(17, GPIO.BOTH, callback=callback_func, bouncetime=200) 

GPIO.add_event_detect(17, GPIO.BOTH, callback=callback_func)