2016-05-26 5 views
0

ボタンを押したままで私の瞬間的なボタンコントロールをPythonでリレーすることは可能でしょうか?GPIO瞬間的なボタンコントロールリレー

本質的に、ボタンを押すとリレーがオンになり、ボタンが離されるとリレーがオフになります。

現在、私は5 secondesの期間のためにそれをスイッチオン、小さなPythonスクリプトでリレーを制御することができるよ:

relay.py:

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(4, GPIO.OUT) 

GPIO.output(4, GPIO.LOW) 
time.sleep(5) 
GPIO.output(4, GPIO.HIGH) 
GPIO.cleanup() 

print "Done!" 

とすることが可能

button.py:

0123追跡瞬間的なボタンをホールドダウンされているとき

私はこの流行っ二つを組み合わせることを試みた:

import os 
from time import sleep 
import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(25, GPIO.IN) 
GPIO.setup(4, GPIO.OUT) 

while True: 
     if (GPIO.input(25) == False): 
       print "Button being pushed!" 
       GPIO.output(4, GPIO.LOW) 
     sleep(0.025) 
     GPIO.output(4, GPIO.HIGH) 

しかし無駄に。どんな助けでも本当にありがとう!

答えて

1

確かに、このトリックを行う必要があります。私はそれをテストしていないので、マイナーな編集が​​必要かもしれません。

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 

# Added a software pull-up here for increased stability 
GPIO.setup(25, GPIO.IN, GPIO.PUD_UP) 
GPIO.setup(4, GPIO.OUT) 
# The relay seems to be active low. Default to off. 
GPIO.output(4, GPIO.HIGH) 

# This function is run every time the button state changes 
# from low to high or high to low (GPIO.BOTH) 
def callback_func(pin): 
    # The button transitioned to high (released) 
    if GPIO.input(pin): 
     # Relay off 
     GPIO.output(4, GPIO.HIGH) 
    else: 
     # The button went low (it was pressed). Relay on. 
     GPIO.output(4, GPIO.LOW) 

# Set up threaded event detection (no constant polling of pin states). 
# Fires on both high-to-low and low-to-high state changes. 
GPIO.add_event_detect(25, GPIO.BOTH, callback=callback_func) 

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

if __name__ == "__main__": 
    main() 

ボタンが離されたときにGPIO.PUD_UPは、立ち上がりエッジが発生しない場合は、VCCに抵抗を追加する必要があります。とにかく、たとえソフトウェアが失敗しても、リレーがデフォルト状態のままであることを保証するので、これを行うことをお勧めします。

常にボタンが押されたときに、リレーGPIOに書き込みますが、プルアップなしで動作するはず醜いバージョン:

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 

GPIO.setup(25, GPIO.IN, GPIO.PUD_UP) 
GPIO.setup(4, GPIO.OUT) 
GPIO.output(4, GPIO.HIGH) 

def callback_func(pin): 
    while not GPIO.input(pin): 
     GPIO.output(4, GPIO.LOW) 
    GPIO.output(4, GPIO.HIGH) 

GPIO.add_event_detect(25, GPIO.FALLING, callback=callback_func, bouncetime=100) 

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

if __name__ == "__main__": 
    main() 
関連する問題