Python 带有许多用于 GPIO 输入和输出的 elif 的脚本

Python script with many elif for GPIO in and out

我写了一个 python 脚本来检测瞬时按钮按下并将每个按钮记录到一个文件中。每按一次,LED 也会点亮 GPIO.OUT。 原始文件效果很好,但我目前需要在组合中再添加两个按钮(现在总共 4 个),每个按钮也会写入文件并点亮 LED。当我执行我认为应该起作用的脚本时,只有按钮 1 起作用。感谢任何有关如何调试非工作代码的帮助。

非工作代码(4 个按钮):

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
import serial
import syslog
import MySQLdb as mdb
import subprocess

poursdir = '/var/www/RPints'
path = '/var/www/RPints/includes/pours.php'

outpin1 = 26
inpin1 = 18
outpin2 = 16
inpin2 = 23
outpin3 = 6
inpin3 = 17
outpin4 = 5
inpin4 = 22

GPIO.setmode(GPIO.BCM)
GPIO.setup(outpin1, GPIO.OUT)
GPIO.setup(inpin1, GPIO.IN)
GPIO.setup(outpin2, GPIO.OUT)
GPIO.setup(inpin2, GPIO.IN)
GPIO.setup(outpin3, GPIO.OUT)
GPIO.setup(inpin3, GPIO.IN)
GPIO.setup(outpin4, GPIO.OUT)
GPIO.setup(inpin4, GPIO.IN)

while True:
    value1 = GPIO.input(inpin1) 
    value2 = GPIO.input(inpin2)
    value3 = GPIO.input(inpin3)
    value4 = GPIO.input(inpin4)
    if not value1 or value2 or value3 or value4:     
        GPIO.output(outpin1, 0)
        GPIO.output(outpin2, 0)
        GPIO.output(outpin3, 0)
        GPIO.output(outpin4, 0)
    else:
        if value1:
            GPIO.output(outpin1, 1)
            subprocess.call(["php", path, "1", "1"])
        elif value2:
            GPIO.output(outpin2, 1)
            subprocess.call(["php", path, "2", "1"])
        elif value3:
            GPIO.output(outpin3, 1)
            subprocess.call(["php", path, "3", "1"])
        elif value4:
            GPIO.output(outpin4, 1)
            subprocess.call(["php", path, "4", "1"])
    time.sleep(.3)
GPIO.cleanup()

工作代码(2 个按钮):

 #!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import serial
import syslog
import MySQLdb as mdb
import subprocess

poursdir = '/var/www/RPints'
path = '/var/www/RPints/includes/pours.php'

outpin1 = 26
inpin1 = 18
outpin2 = 16
inpin2 = 23

GPIO.setmode(GPIO.BCM)
GPIO.setup(outpin1, GPIO.OUT)
GPIO.setup(inpin1, GPIO.IN)
GPIO.setup(outpin2, GPIO.OUT)
GPIO.setup(inpin2, GPIO.IN)

while True:
    value1 = GPIO.input(inpin1) 
    value2 = GPIO.input(inpin2)
    if not value1 and not value2:    
        GPIO.output(outpin1, 0)
        GPIO.output(outpin2, 0)
    else:
        if value1 and not value2:
            GPIO.output(outpin1, 1)
            subprocess.call(["php", path, "1", "1"])
        elif value2 and not value1:
            GPIO.output(outpin2, 1)
            subprocess.call(["php", path, "2", "1"])
    time.sleep(.3)
    time.sleep(.05) 
GPIO.cleanup()

啊哈!我花了一分钟,但我意识到当你说 if not value1 or value2 or value3 or value4: 时 python 读取它的方式,如果 value1 为 false(如果你按任何其他按钮就是这样),如果看起来像这样:

if True or False or False or False:
    print "write zero"

Python 读取 if not value1 和各种 or(无关紧要)。因为 value1 为 false(当您按下除它之外的任何按钮时),并且 not value1 为 True,它执行 if 块中的操作。您认为它会读取 "if not any of these, do this",但实际上它正在读取 "if the opposite of this or any of these"。要修复它,请返回使用 and not value2 等作为您的 4 按钮脚本。

编辑:是的@compie 是对的,逻辑是问题

您可以尝试改用 switch 样式的语句。例如:

def press(event):
    return {
        'value1': 1,
        'value2': 2,
        'value3': 3,
        'value4': 4,
}.get(event,None)

while True:
    v1 = GPIO.input(inp1) 
    v2 = GPIO.input(inp2)
    v3 = GPIO.input(inp3)
    v4 = GPIO.input(inp4)

    values = [v1,v2,v3,v4]

    for event in values: 
        press(event)

        #for debugging only..
        if not event == 'None':
            print(press(event))

这将创建一个函数,该函数将接受任何值,并计算出它是哪个值,并 return 根据收到的内容向您发送代码。

while 循环显然只是不断检查每个 GPIO 输入中的非 'None' 值。

我还没有机会在 Pi 上测试它,所以我可能遗漏了一些东西,但我认为这可能是一个解决方案。

你不应该检查完整的 一组值?即

if not value1 and not value2 and not value3 and not value4:
       # reset
elif value1 and not value2 and not value3 and not value4:
      #light up led 1
elif not value1 and value2 and not value3 and not value4:
      #light up led 2
elif not value1 and not value2 and value3 and value4:
     #light up 3
elif not value1 and not value2 and not value3 and value4
      #light up 4

工作代码:

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
import serial
import syslog
import MySQLdb as mdb
import subprocess

poursdir = '/var/www/RPints'
path = '/var/www/RPints/includes/pours.php'

outpin1 = 26
inpin1 = 18
outpin2 = 16
inpin2 = 23
outpin3 = 6
inpin3 = 17
outpin4 = 5
inpin4 = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(outpin1, GPIO.OUT)
GPIO.setup(inpin1, GPIO.IN)
GPIO.setup(outpin2, GPIO.OUT)
GPIO.setup(inpin2, GPIO.IN)
GPIO.setup(outpin3, GPIO.OUT)
GPIO.setup(inpin3, GPIO.IN)
GPIO.setup(outpin4, GPIO.OUT)
GPIO.setup(inpin4, GPIO.IN)

while True:
    value1 = GPIO.input(inpin1) 
    value2 = GPIO.input(inpin2)
    value3 = GPIO.input(inpin3)
    value4 = GPIO.input(inpin4)
    if not value1 and not value2 and not value3 and not value4:  
        GPIO.output(outpin1, 0)
        GPIO.output(outpin2, 0)
        GPIO.output(outpin3, 0)
        GPIO.output(outpin4, 0)
    else:
        if value1 and not value2 and not value3 and not value4:
            GPIO.output(outpin1, 1)
            subprocess.call(["php", path, "1", "1"])
        elif not value1 and value2 and not value3 and not value4:
            GPIO.output(outpin2, 1)
            subprocess.call(["php", path, "2", "1"])
        elif not value1 and not value2 and value3 and not value4:
            GPIO.output(outpin3, 1)
            subprocess.call(["php", path, "3", "1"])
        elif not value1  and not value2 and not value3 and value4:
            GPIO.output(outpin4, 1)
            subprocess.call(["php", path, "4", "1"])

    time.sleep(.3)
    time.sleep(.05)
GPIO.cleanup()

正如评论所说,我在 "and not" 中添加了每个条件,除非我想评估每个按钮是否为 "True"。此外,第 4 个按钮的引脚设置从 out 22 更改为 4,以解决连续打开的情况。