Python Don';不要重复连续的行

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

我正在编写一个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)
我的输出疯狂地向屏幕发送数字,直到输入开关关闭。如何防止同一连续行立即重复?
谢谢

您可以修改代码以使用“更改”类型的逻辑:

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
    条目的列表
    old\u input\u states
    。这将用于记住三个GPIO的最后状态
  • 然后在循环开始时,调用
    GPIO.input(n)
    函数,因为三个GPIO的
    n
    分别为37、32和29。结果列表
    input_states
    现在包含三个GPIO状态
  • 然后将此列表与
    旧的\u输入\u状态
    列表进行比较,如果它们不同,它将执行以下操作:
    • 对于
      'One'
      'Two'
      'Three'
      中的每个
      名称
      (由
      n
      枚举,即对于
      'One'
      它是0,对于
      'Two'
      它是1,对于
      'Three'
      它检查
      输入状态[n]/code>的值以查看它是否为
      假,如果是,它打印应与相应GPIO匹配的
      名称
    • 然后它更新
      旧的输入状态
      以匹配
      输入状态
      ,因此在下一个循环中,它只会在
      输入状态
      更改时再次检查(并可能打印)
编辑

请注意,代码将输出检测到更改点处当前为False的所有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