Python 如何阻止错误的GPIO触发器发生?

Python 如何阻止错误的GPIO触发器发生?,python,raspberry-pi,Python,Raspberry Pi,我刚接触过树莓圆周率(Raspberry Pi),我有一个圆周率用来发送网络钩子,这样当有人按下我作为门铃放置的按钮时,我可能会被提醒。我已经把webhook整理好了,但是我不断得到错误的GPIO触发器,当按钮什么都没做的时候,这些触发器会给我发送钩子 我试着用屏蔽线消除噪音,在树莓皮和按钮之间只用了大约12英寸的电线,甚至在回路中加入了一个电阻-电容电路,试图“硬件去抖动”按钮。即使在这些升级之后,我也看到了错误的按钮按下,尽管要少得多(每隔几周一次,而不是每隔几天一次) 我正在使用的代码 i

我刚接触过树莓圆周率(Raspberry Pi),我有一个圆周率用来发送网络钩子,这样当有人按下我作为门铃放置的按钮时,我可能会被提醒。我已经把webhook整理好了,但是我不断得到错误的GPIO触发器,当按钮什么都没做的时候,这些触发器会给我发送钩子

我试着用屏蔽线消除噪音,在树莓皮和按钮之间只用了大约12英寸的电线,甚至在回路中加入了一个电阻-电容电路,试图“硬件去抖动”按钮。即使在这些升级之后,我也看到了错误的按钮按下,尽管要少得多(每隔几周一次,而不是每隔几天一次)

我正在使用的代码

import RPi.GPIO as GPIO
import sys
import os

GPIO.setmode(GPIO.BOARD)


buttonPin = 16

input_state1 = True
last_state1 = True


GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    while True:
        input_state1 = GPIO.input(16)
        if input_state1 != last_state1:
            os.system('python hook.py')
finally:
    GPIO.cleanup()

我希望不会出现错误的按钮按下,特别是因为我已经在使用内部上拉和硬件循环。我只是在这一点上迷路了

last_state1从未更新,因此当input_state1更改时,您的
如果input_state1!=last_state1:
条件将为真,并将触发
操作系统.system('python hook.py')
在while循环中反复出现


解决方案是在操作系统调用后设置
last_state1=input_state1

可能是电线实际上是间歇点火的。树莓Pis是便宜的硬件,并不完全是最可靠的东西。它可能是由于输入电源上的噪音而做出反应。您已经添加了硬件deb盎司,你是如何决定电阻电容值的?调整这些值可能会改变行为

在任何情况下,我都会用软件去Bounce来补充你的硬件去Bounce

导入时间
尝试:
尽管如此:
如果不是GPIO.input(16):
时间。睡眠(0.1)#有些滞后
#再次检查插销,这样,只有在按下按钮时才会触发挂钩
#已按住超过0.1秒
如果不是GPIO.input(16):
system('python hook.py')
时间。睡眠(0.1)#每隔一段时间让pi休息一下
最后:
GPIO.cleanup()

我写上述内容时假设您希望按钮处于低激活状态。如果您希望按钮处于高激活状态,请删除
而不是
s。

缩进只是复制粘贴错误吗?似乎是这样。我更新了它。我假设
GPIO.cleanup()
没有像我想的那样停止循环?是的,
finally:
块在while循环退出之前不会被调用。这导致了双重webhook触发器。我不确定假警报是否会随之消失,因为它们可能每月发生一次。不过,时间应该会告诉我们