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,以解决连续打开的情况。
我写了一个 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,以解决连续打开的情况。