我写了一些代码,可以在按下按钮时打开和关闭继电器。当我按下一次按钮时,世界一切都好了,继电器第一次按下就会打开,第二次按下就会关闭,等等。我的问题是,当我按下按钮时,继电器只是打开、关闭、打开和关闭,直到按钮松开。这不是一个理想的结果。我只想每次按下继电器一次。
这是我的代码:
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)
如何修改此代码以达到我想要的结果。
最佳,
Bryan
我找到了解决问题的方法。。。
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()函数
wait_for_edge()函数用于阻止程序的执行,直到检测到边缘为止。换句话说,上面等待按钮按下的示例可以重写为:GPIO.wait_for_edge(通道,GPIO.RISING)请注意,您可以检测GPIO类型的边缘。正在上升,GPIO。跌倒或GPIO。两者都有。这样做的好处是,它使用的CPU数量可以忽略不计,因此还有很多其他任务要做。
您在第二个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 == False
应该是input_state == True
,否则每当input_state
为False时,您就会在"ON"one_answers"OFF"之间来回切换solenoid
。
编辑:我现在明白了,当你按下按钮时,你试图让它切换一次。在这种情况下,应该完全删除input_state检查,只使用上升沿函数。(我上面的代码会在按住按钮时打开继电器,松开时关闭)。