Python Don';不要重复连续的行
我正在编写一个python脚本,它将在web浏览器中显示raspberry pi的gpio输入引脚的状态。此脚本仅用于后端测试:Python Don';不要重复连续的行,python,raspberry-pi,gpio,Python,Raspberry Pi,Gpio,我正在编写一个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.P
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)
我的输出疯狂地向屏幕发送数字,直到输入开关关闭。如何防止同一连续行立即重复?
谢谢 您可以修改代码以使用“更改”类型的逻辑:
import RPi.GPIO as GPIO
import time
import os
os.system('clear')
GPIO.setmode(GPIO.BOARD)
# allows you to rename the io ports
io_names = [ 'One', 'Two', 'Three' ]
class IOMonitor():
def __init__( self, num , io, pud ):
self.num = num
GPIO.setup(self.num, io, pull_up_down=pud)
self.last_state = GPIO.input(self.num)
def poll( self ):
# detect current state
current_state = GPIO.input(self.num)
# compare with old state
if( current_state != self.last_state ):
# set new last state
self.last_state = current_state
# print name of io that changed
print( io_names[self.num] )
ioMonitors = [
IOMonitor(29, GPIO.IN, GPIO.PUD_UP),
IOMonitor(32, GPIO.IN, GPIO.PUD_UP),
IOMonitor(37, GPIO.IN, GPIO.PUD_UP)
]
def main():
while True:
for io in ioMonitors:
io.poll()
time.sleep(0.2)
main()
我无法访问您的库,因此此代码未经测试,但在逻辑上应该是正确的。仅当输入状态实际发生变化时才打印如何?类似这样(未经测试): 为了解释这个新循环代码的作用:
- 首先,创建一个包含三个
条目的列表None
。这将用于记住三个GPIO的最后状态old\u input\u states
- 然后在循环开始时,调用
函数,因为三个GPIO的GPIO.input(n)
分别为37、32和29。结果列表n
现在包含三个GPIO状态input_states
- 然后将此列表与
列表进行比较,如果它们不同,它将执行以下操作:旧的\u输入\u状态
- 对于
、'One'
和'Two'
中的每个'Three'
(由名称
枚举,即对于n
它是0,对于'One'
它是1,对于'Two'
它检查'Three'
输入状态[n]/code>的值以查看它是否为
假,如果是,它打印应与相应GPIO匹配的
名称
- 然后它更新
以匹配旧的输入状态
,因此在下一个循环中,它只会在输入状态
更改时再次检查(并可能打印)输入状态
- 对于
True
到False
,您应该能够在以#New loop
注释开头的部分中使用以下代码:
# New loop keeping track of the previous ("old") input states:
old_input_states = [None] * 3
while True:
input_states = [GPIO.input(n) for n in (37, 32, 29)]
for n, name in enumerate(['One', 'Two', 'Three']):
if input_states[n] != old_input_states[n] and input_states[n] == False:
print name
old_input_states = input_states
编辑2
如OP所示,首选输出仍然是列表形式。此外,GPIO的开关输入上似乎出现了一些反弹,这可以通过使用time.sleep
调用来改进。此外,输出应该是反向的。while
循环的最后一个代码如下所示:
old_input_states = [None] * 3
while True:
input_states = [GPIO.input(n) for n in (37, 32, 29)]
if input_states != old_input_states:
inverted_input_states = [1 - i for i in input_states]
print inverted_input_states
time.sleep(0.2)
old_input_states = input_states
免责声明:为了提高交换机的去抖动可靠性,我会使用不同的代码,但这超出了这个问题的范围我在包含IOMonitor(32,…)但不包含其他代码的行中遇到语法错误。有什么想法吗?对不起,我忘了加逗号了!好了,现在每当我执行它时,它都会在没有输出的情况下运行1秒,然后返回到终端窗口。@SkylerSpaeth-mmm您可能没有在主模块中运行它。我将删除
if
语句,这将允许它运行。我将如何/在何处实现它?我对python很陌生。@skylerspeth很抱歉不清楚,这应该取代您的while True
循环。我会更新我的答案。好的,当我打开2或3(不是一个)并在3秒内关闭它时,当我关闭它时,它也会显示2
。@skylerspeth每次更改时,代码都会打印当前False
的所有GPIO状态。如果这不是您想要的,而是只看到更改的GPIO,那么您需要稍微修改一下版本。我试图解释代码应该如何运行。为了帮助您更好地理解它,您还可以在n,name行的上方添加一行打印输入状态。
old_input_states = [None] * 3
while True:
input_states = [GPIO.input(n) for n in (37, 32, 29)]
if input_states != old_input_states:
inverted_input_states = [1 - i for i in input_states]
print inverted_input_states
time.sleep(0.2)
old_input_states = input_states