按下按钮时,我写了一些代码来打开和关闭继电器。当我按下按钮一次时,一切都与世界一致,继电器在第一次按下时打开,在第二次按下时关闭,等等。我的问题是,当我按住按钮时,继电器只是打开和关闭然后打开和关闭,直到按钮松开。这不是期望的结果。我只希望每次按下时继电器开启一次。
这是我的代码:
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 :(得分: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()函数
wait_for_edge()函数用于阻止程序执行,直到检测到边缘。换句话说,上面等待按下按钮的例子可以改写为: GPIO.wait_for_edge(channel,GPIO.RISING) 请注意,您可以检测GPIO.RISING,GPIO.FALLING或GPIO.BOTH类型的边缘。这样做的好处是它使用的CPU数量可以忽略不计,因此还有很多其他任务。
答案 1 :(得分: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 == False
应为input_state == True
,否则只要input_state
为假,您就会在“开启”和“关闭”之间来回切换solenoid
。
编辑:我现在看到,当你按下按钮时,你试图让它切换一次。在这种情况下,您应该完全删除input_state检查并只使用上升沿函数。 (我的上述代码将在按钮被按下时打开继电器,并在释放按钮时将其关闭。)