2016-05-04 7 views
0

ボタンを押したときにリレーをオン/オフするコードを書きました。私がボタンを一度押すと、すべてが世界で正しいです。最初のプレスでリレーがオンになり、2番目のプレスでオフになります。私の問題は、ボタンを押したままにすると、リレーがただちにオン/オフすることですボタンが押されるまでオン/オフします。これは望ましい結果ではありません。私はリレーが一度押すごとに一度オンにしたいだけです。私は私の望ましい結果を達成するために、このコードを変更するにはどうすればよいPython RPi.GPIOボタンはリレーを有効にします - ボタンのホールドに対処する必要があります

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
# GPIO.setwarnings(False) 

GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
GPIO.setup(17, GPIO.OUT) 

print "GPIO STATE OF PIN 17" 
print GPIO.input(17) 
print "GPIO STATE OF PIN 22" 
print GPIO.input(22) 

# MAKE SURE SOLENOID IS OFF 
solenoid = "OFF" 
GPIO.output(17,True) 

print "Push button to open and close solenoid." 

while True: 
input_state = GPIO.input(22) 
if input_state == False and solenoid == "ON": 
    print('SOLENOID OFF') 
    solenoid = "OFF" 
    GPIO.output(17,True) 
    time.sleep(0.2) 
elif input_state == False and solenoid == "OFF": 
    print('SOLENOID ON') 
    solenoid = "ON" 
    GPIO.output(17,False) 
    time.sleep(0.2) 

は、ここに私のコードです。

ベスト、

ブライアン

+0

'input_state'は物理的に何を表していますか?ボタンが押されていますか? – tknickman

答えて

0

私は私の問題への解決を見つけた...

GPIO.wait_for_edge(22、GPIO.RISING)

whileループに追加されました。

while True: 
    GPIO.wait_for_edge(22, GPIO.RISING) 
    input_state = GPIO.input(22) 
    if input_state == False and solenoid == "ON": 
     print('SOLENOID OFF') 
     solenoid = "OFF" 
     GPIO.output(17,True) 
     time.sleep(0.2) 
    elif input_state == False and solenoid == "OFF": 
     print('SOLENOID ON') 
     solenoid = "ON" 
     GPIO.output(17,False) 
     time.sleep(0.2) 

wait_for_edge()function

wait_for_edge()関数は、エッジが検出されるまでプログラムの実行をブロックするように設計されています。言い換えれば、上記のボタンの押下を待つ例は、次のように書き換えられます。 GPIO.wait_for_edge(channel、GPIO.RISING) タイプGPIO.RISING、GPIO.FALLING、またはGPIO.BOTHのエッジを検出できることに注意してください。このようにする利点は、CPUの使用量がごくわずかなため、他の作業には十分な余裕があります。

0

あなたは第二のelifにタイプミスがあります

if input_state == False and solenoid == "ON": 
    print('SOLENOID OFF') 
    solenoid = "OFF" 
    GPIO.output(17,True) 
    time.sleep(0.2) 
elif input_state == False and solenoid == "OFF": 
    print('SOLENOID ON') 
    solenoid = "ON" 
    GPIO.output(17,False) 
    time.sleep(0.2) 

具体的には、input_state == Falseinput_state == Trueする必要があり、input_stateがFalseの時はいつでもそうでない場合は、あなたが「ON」と「OFF」の間で前後にsolenoidをトグルしておこう。

編集:ボタンを押したときに一度切り替えるようにしようとしています。その場合は、input_stateチェックを完全に削除して、立ち上がりエッジ機能を使用するだけです。 (私の上記のコードは、ボタンが押されている間はリレーをオンにし、リリースされるとオフにする)。

+0

何らかの理由で私のリレーが逆に振る舞います。そのためinput_state == Falseの場合、それをtrueに設定します。 – evolution9

+0

@ evolution9どちらの場合も同じことを比較していますが、それは意味をなさないものです。 ifの2つの節は異なる必要があります。そうでなければ、whileループでそれらの間を交互に切り替えます。 – mbrig

+0

@ evolution9、私の編集を参照して、私はあなたがボタンが開催されている間、リレーをオンにしたいと思ったが、代わりにそれをトグルしたいと思う。この場合は、input_stateを確認する必要はありません。 – mbrig

関連する問題