Python RPi.GPIO按钮激活中继 - 需要解决按钮保持

时间:2016-05-04 19:28:31

标签: python arduino 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)

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

最佳,

布赖恩

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检查并只使用上升沿函数。 (我的上述代码将在按钮被按下时打开继电器,并在释放按钮时将其关闭。)