You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:22:31