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)

如何修改此代码以达到我想要的结果。

最佳,

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检查,只使用上升沿函数。(我上面的代码会在按住按钮时打开继电器,松开时关闭)。

最新更新