Python 不重复连续行

标签 python raspberry-pi gpio

我正在编写一个Python脚本,它将在网络浏览器中显示树莓派的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)

我的输出疯狂地向屏幕发送数字,直到输入开关关闭。如何防止同一连续行立即重复? 谢谢!

最佳答案

仅当输入状态实际发生变化时才打印怎么样?像这样的东西(未经测试):

# Your code to initialise everything:
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)

# 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)]
    if input_states != old_input_states:
        for n, name in enumerate(['One', 'Two', 'Three']):
            if input_states[n] == False:
                print name
        old_input_states = input_states

解释一下这个新循环代码的作用:

  • 首先,创建一个列表 old_input_states,其中包含三个 None 条目。这将用于记住三个 GPIO 的最后状态。
  • 然后在循环开始时,调用 GPIO.input(n) 函数,对于三个 GPIO,n 分别为 37、32 和 29。生成的列表 input_states 现在包含三个 GPIO 状态。
  • 然后将此列表与 old_input_states 列表进行比较,如果它们不同,则会执行以下操作:
    • 对于 'One''Two''Three' 中的每个 name(已枚举)按n,即'One'为0,1为'Two',2为'Three' >),它检查 input_states[n] 的值,看看它是否为 False,如果是,则打印 name应匹配相应的GPIO。
    • 然后它会更新 old_input_states 以匹配 input_states,因此在下一个循环中,它只会再次检查(并可能打印)input_states改变了。

编辑

请注意,在检测到变化时,代码将输出当前为False所有 GPIO。要仅打印从 TrueFalse 的内容,您应该能够在以 # 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

免责声明:为了提高开关的去抖可靠性,我会使用不同的代码,但这超出了这个问题的范围

关于Python 不重复连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32491327/

相关文章:

python - 周期性返回 None 的函数的流控制

php - 如何在 Apache2 中用 php 执行 shell 脚本?

android - 从 Raspberry pi 向 Android 应用程序发送通知

python - 如何通过 Python 子进程杀死 omxplayer

python - 修剪 matplotlib 功率谱图

python - 使用 python 脚本将 avi 文件保存在 blender 中

sqlite - 如何最小化sqlite写入磁盘的字节数?

c - ESC电机不改变速度

linux - 如何在 Linux 启动期间尽早设置 i2c PCA9570 gpio 扩展器的值?

python - 在只读脚本的数据之间添加水平空间