Raspberry Pi 5基于GPIOZERO实现传感器与线性执行器联动问题
Raspberry Pi 5 基于GPIOZERO实现自动门逻辑修正
原代码核心问题
- 使用
toggle()控制继电器会导致状态不可控,多次触发后开关逻辑混乱 - 运动触发后直接伸展5秒就缩回,未考虑检测区域持续有人的情况
- 无运动时立刻触发缩回,不符合超市门延迟关闭的逻辑,且未处理继电器互斥(伸展和缩回不能同时激活)
修正后的实现方案
逻辑调整
- 检测到运动时,立即触发伸展,同时关闭缩回继电器,并标记检测区域有人员活动
- 当传感器持续无运动达到设定时长后,再触发缩回,确保伸展继电器已关闭
- 用
on()/off()明确控制继电器状态,避免toggle()带来的不可预测性 - 增加无运动等待期间的运动重新检测,防止门误关闭
修正代码
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
相关产品推荐
相关产品推荐

