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

Raspberry Pi 5基于GPIOZERO实现传感器与线性执行器联动问题

Raspberry Pi 5 基于GPIOZERO实现自动门逻辑修正

原代码核心问题

  • 使用toggle()控制继电器会导致状态不可控,多次触发后开关逻辑混乱
  • 运动触发后直接伸展5秒就缩回,未考虑检测区域持续有人的情况
  • 无运动时立刻触发缩回,不符合超市门延迟关闭的逻辑,且未处理继电器互斥(伸展和缩回不能同时激活)

修正后的实现方案

逻辑调整

  1. 检测到运动时,立即触发伸展,同时关闭缩回继电器,并标记检测区域有人员活动
  2. 当传感器持续无运动达到设定时长后,再触发缩回,确保伸展继电器已关闭
  3. 用on()/off()明确控制继电器状态,避免toggle()带来的不可预测性
  4. 增加无运动等待期间的运动重新检测,防止门误关闭

修正代码

from gpiozero import MotionSensor, OutputDevice
from signal import pause
from time import sleep

# 硬件引脚配置
sensor = MotionSensor(14)
expand_relay = OutputDevice(21, active_high=False, initial_value=False)
retract_relay = OutputDevice(20, active_high=False, initial_value=False)

# 无运动后延迟关闭时长(单位:秒),可按需调整
NO_MOTION_DELAY = 10
# 标记检测区域是否有运动
has_motion = False

def on_motion_detected():
    global has_motion
    has_motion = True
    # 确保缩回继电器关闭,触发伸展动作
    retract_relay.off()
    expand_relay.on()

def on_no_motion():
    global has_motion
    has_motion = False
    # 等待设定时长,期间若重新检测到运动则终止关闭流程
    for _ in range(NO_MOTION_DELAY):
        if has_motion:
            return
        sleep(1)
    # 确认无运动后,关闭伸展并触发缩回
    expand_relay.off()
    retract_relay.on()
    # 根据执行器行程调整缩回保持时长,完成后关闭继电器
    sleep(3)
    retract_relay.off()

sensor.when_motion = on_motion_detected
sensor.when_no_motion = on_no_motion

pause()

关键细节说明

  • 继电器状态可控:用on()/off()替代toggle(),每次动作都明确对应继电器的通断状态,避免状态混乱
  • 防误关闭逻辑:无运动后不会立刻关门,而是等待设定时长,期间如果重新检测到运动就终止关闭流程
  • 硬件保护:每次动作前关闭对立继电器,防止执行器同时收到伸展和缩回信号造成损坏

内容的提问来源于stack exchange,提问作者vichondrias maquilang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:41:02