智能家居DIY实战:用SR501人体感应模块+树莓派实现人来灯亮、人走灯灭
周末在家折腾智能家居时,突然想到楼道里那种人来自动亮灯的感应器——要是能把它移植到自家书房多好。翻出吃灰的树莓派和之前买的SR501模块,花了半天时间就搞定了这个"人来灯亮、人走灯灭"的智能照明系统。整个过程比想象中简单,根本不需要碰复杂的驱动开发,用Python脚本就能轻松实现。下面就把我的实战经验完整分享给大家,包括硬件连接技巧、Python代码优化思路,以及那些只有踩过坑才知道的避坑指南。
1. 硬件准备与接线图解
SR501人体红外感应模块堪称智能家居项目的"感知器官",其核心是热释电红外传感器(PIR)。当检测到人体发出的9-10μm红外线时,输出引脚会从低电平跳变到高电平。我选用的这款模块工作电压范围宽(4.5-20V),静态功耗仅50μA,特别适合24小时运行的场景。
必备材料清单:
- 树莓派任意型号(推荐3B及以上版本)
- SR501人体感应模块(注意选择3.3V电平输出版本)
- 杜邦线若干(母对母最佳)
- LED灯带或智能灯泡(可选)
- 5V/2A电源适配器
接线时有个容易忽略的细节:SR501模块上有两个电位器。左边调节的是感应距离(3-7米),右边控制的是信号延时(0.5-300秒)。建议初次使用时将距离调到中间档位,延时设为最短,方便调试。
模块与树莓派的连接方式非常简单:
SR501 VCC → 树莓派5V引脚(第2/4针脚) SR501 GND → 树莓派GND(第6/9等针脚) SR501 OUT → 树莓派GPIO17(第11针脚)注意:部分SR501模块输出电平是5V,直接连接可能损坏树莓派GPIO。稳妥做法是用分压电路将5V降至3.3V,或选择明确支持3.3V输出的模块版本。
2. Python环境配置与GPIO控制
树莓派官方系统已内置Python环境,我们需要安装GPIO控制库。推荐使用gpiozero库,相比传统的RPi.GPIO,它的API更简洁,且自带防抖功能:
sudo apt update sudo apt install python3-gpiozero python3-pip检测SR501模块是否正常工作的最小测试代码:
from gpiozero import MotionSensor from time import sleep pir = MotionSensor(17) # 对应GPIO17 while True: if pir.motion_detected: print("检测到人体移动!") sleep(0.1)运行后会遇到第一个典型问题:模块频繁误报。这是因为SR501对温度变化极其敏感,空调出风口、宠物经过都会触发。解决方法是在初始化时增加queue_len参数,采用移动平均算法过滤误触发:
pir = MotionSensor(17, queue_len=5, sample_rate=10, threshold=0.6)参数解释:
queue_len:检测队列长度(默认1)sample_rate:采样频率(Hz)threshold:触发阈值(0-1)
3. 两种检测模式与逻辑实现
SR501模块背面有个重要的跳线帽,决定了两种工作模式:
| 模式类型 | 跳线位置 | 特点描述 | 适用场景 |
|---|---|---|---|
| 不可重复触发 | L | 触发后必须等待延时结束才能再触发 | 安防报警 |
| 可重复触发 | H | 触发期间检测到活动会重置延时计时 | 智能照明 |
对于"人来灯亮"场景,显然要选择可重复触发模式。对应的Python实现需要处理状态持续时间和离开判定:
from gpiozero import MotionSensor from signal import pause def person_present(): print("有人进入区域,开启灯光") # 这里添加控制智能灯泡的代码 def person_absent(): print("人员已离开,延迟关闭灯光") # 延迟关闭逻辑 pir = MotionSensor(17) pir.when_motion = person_present pir.when_no_motion = person_absent pause() # 保持程序运行实际测试会发现when_no_motion回调并不精确,因为模块本身有2.5秒的封锁时间。更可靠的做法是用定时器实现离开判定:
from threading import Timer absence_timer = None def on_motion(): global absence_timer if absence_timer: absence_timer.cancel() control_light(True) def on_no_motion(): global absence_timer absence_timer = Timer(10, lambda: control_light(False)) # 10秒无活动才关灯 absence_timer.start()4. 集成智能家居系统
单纯的开关灯只是开始,将SR501接入智能家居生态才能发挥最大价值。以下是两种主流集成方案:
方案一:Home Assistant接入
- 安装HASS的树莓派镜像或Docker版
- 创建Python脚本通过MQTT发布状态:
import paho.mqtt.publish as publish topic = "home/living_room/motion" publish.single(topic, "ON", hostname="hass.local")- 在HA中配置自动化规则:
automation: - alias: "Motion Activated Lighting" trigger: platform: mqtt topic: "home/living_room/motion" payload: "ON" action: service: light.turn_on entity_id: light.ceiling方案二:直接控制智能灯泡对于支持本地API的灯泡(如Yeelight),可以绕过HA直接控制:
from yeelight import Bulb bulb = Bulb("192.168.1.100") def control_light(state): if state: bulb.turn_on(effect="smooth", duration=500) else: bulb.turn_off(effect="smooth", duration=1000)5. 实战避坑指南
在三个不同房间部署这套系统后,总结出以下经验教训:
安装位置选择:
- 避免正对空调/暖气出风口
- 离地高度1.2-1.5米最佳
- 检测锥角约100度,需考虑覆盖范围
灵敏度调节技巧:
- 先顺时针将距离调到最大
- 用身体测试实际感应范围
- 逆时针回调至所需距离的120%位置
环境干扰处理:
- 夏季高温时感应距离会缩短,可启用RT温度补偿接口
- 白天误触发可连接光敏电阻到RL接口
- 在Python代码中增加最小触发间隔:
last_trigger = 0 def safe_trigger(): global last_trigger now = time.time() if now - last_trigger > 5: # 5秒内不重复触发 last_trigger = now # 执行触发动作- 电源稳定性问题:
- 树莓派和SR501最好使用独立电源
- 电压不稳会导致模块频繁重启
- 可在VCC和GND之间并联100μF电容
这个项目最让我惊喜的是SR501模块的可靠性——经过适当调校后,在3米距离内检测准确率能达到95%以上。现在我的书房灯光已经完全自动化,再也不用摸黑找开关了。