RPi Zero WH声音传感器触发HTTP请求重复执行问题求助
解决RPi Zero WH声音传感器触发API两次的问题
你的问题核心是GPIO上升沿检测被重复触发,导致API调用两次。结合你替换打印函数正常的情况,问题大概率出在传感器信号抖动或GPIO触发逻辑的误判上,以下是几种可行的解决办法:
1. 添加冷却时间+延长防抖参数
在回调函数中加入冷却机制,确保短时间内不会重复触发,同时调大bouncetime参数过滤更久的信号抖动:
#!/usr/bin/python import RPi.GPIO as GPIO import time import requests # GPIO SETUP channel = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(channel, GPIO.IN) last_trigger = 0 cooldown = 2 # 2秒内禁止重复触发 def callback(channel): global last_trigger now = time.time() # 同时验证GPIO状态和冷却时间 if GPIO.input(channel) and (now - last_trigger) > cooldown: last_trigger = now r = requests.get("https://api-v2.voicemonkey.io/trigger?token=xxxxxxxxxxxxxx&device=doorbell-trigger") print(r.status_code) # 调大防抖时间至500ms,过滤更多抖动 GPIO.add_event_detect(channel, GPIO.RISING, bouncetime=500) GPIO.add_event_callback(channel, callback) while True: time.sleep(1)
2. 配置GPIO内部上下拉电阻减少噪声
如果传感器没有外接上下拉电阻,GPIO引脚可能因悬空产生误触发信号。根据传感器输出特性配置内部电阻:
# 假设传感器无信号时输出低电平,配置内部下拉电阻 GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # 若传感器无信号时输出高电平,改用PUD_UP # GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
3. 用线程锁避免并发调用(可选)
虽然打印正常,但API请求的延迟可能导致回调被重复进入,用线程锁确保同一时间只有一个请求执行:
import threading # ... 其他导入和GPIO配置不变 trigger_lock = threading.Lock() def callback(channel): if GPIO.input(channel): with trigger_lock: r = requests.get("https://api-v2.voicemonkey.io/trigger?token=xxxxxxxxxxxxxx&device=doorbell-trigger") print(r.status_code)
验证建议
- 先测试方案1,冷却机制能直接拦截短时间内的重复触发,是最有效的解决方式
- 可以在回调中打印
time.time()和GPIO.input(channel)的值,确认是否真的是两次独立的上升沿触发
内容的提问来源于stack exchange,提问作者gehrunde
相关产品推荐
相关产品推荐

