我正在编写一个python脚本,它将在web浏览器中显示raspberry pi的gpio输入引脚的状态。此脚本仅用于后端测试:
import RPi.GPIO as GPIO
import time
import os
os.system('clear')
GPIO.setmode(GPIO.BOARD)
GPIO.setup(29, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
while True:
input_state = GPIO.input(37)
if input_state == False:
print('One')
time.sleep(0.2)
input_state = GPIO.input(32)
if input_state == False:
print('Two')
time.sleep(0.2)
input_state = GPIO.input(29)
if input_state == False:
print('Three')
time.sleep(.02)
我的输出疯狂地在屏幕上弹出数字,直到输入开关关闭。如何防止同一连续行立即重复? 谢谢!你知道吗
您可以修改代码以使用“on change”类型逻辑:
我没有访问您的库的权限,因此此代码未经测试,但在逻辑上应该是正确的。你知道吗
如果只在输入状态发生变化时才打印呢?类似这样的(未经测试):
为了解释这个新循环代码的作用:
None
条目的列表old_input_states
。这将用于记住三个gpio的最后一个状态。你知道吗GPIO.input(n)
函数,因为三个gpio的n
分别是37、32和29。结果列表input_states
现在包含三个GPIO状态。你知道吗old_input_states
列表进行比较,如果它们不同,它将执行以下操作:'One'
、'Two'
和'Three'
中的每个name
(由n
枚举,即'One'
为0,'Two'
为1,'Three'
为2),它检查该input_states[n]
的值是否为False
,如果是,则打印应与相应GPIO匹配的name
。你知道吗old_input_states
以匹配input_states
,因此在下一个循环中,它只会在input_states
更改时再次检查(并可能打印)。你知道吗编辑
注意,代码将输出当前在检测到更改的点
False
的所有gpio。要只打印从True
到False
的部分,您应该能够使用以下代码作为以# New loop
注释开头的部分:编辑2
正如OP所指出的,首选输出仍然是列表形式的。此外,在gpio的开关输入上似乎出现了一些反弹,这可以通过使用
time.sleep
调用来改进。此外,输出应该反转。while
循环的最后一个代码如下所示:免责声明:为了提高交换机的去抖动可靠性,我会使用不同的代码,但这超出了这个问题的范围
相关问题 更多 >
编程相关推荐