告别手动开关!用SR501人体红外模块+树莓派DIY一个智能感应灯(附完整代码)
用SR501人体红外传感器打造智能感应灯:树莓派实战指南
深夜摸黑找开关的经历想必大家都不陌生。现在,只需一个价值十几元的SR501人体红外模块和树莓派,就能DIY一个自动感应照明系统。这个项目不仅能解决实际问题,更是理解物联网设备开发的绝佳入门案例。
1. 硬件选型与连接
1.1 SR501模块特性解析
SR501作为经典红外感应模块,核心参数值得关注:
- 检测角度:约120度锥形区域
- 探测距离:3-7米可调(通过旋钮调节)
- 输出信号:高电平3.3V/低电平0V
- 工作电压:DC 4.5-20V(建议5V供电)
模块背面的两个蓝色电位器分别控制:
- 灵敏度调节:顺时针旋转增加检测距离
- 延时调节:触发后保持高电平的时间(0.3s~5min)
提示:初次使用时,建议将延时调节至中间位置,避免测试时等待时间过长。
1.2 树莓派GPIO连接方案
推荐使用40pin GPIO扩展板,接线方式如下:
| SR501引脚 | 树莓派接口 | 备注 |
|---|---|---|
| VCC | 5V(Pin2) | 电源正极 |
| GND | GND(Pin6) | 电源地线 |
| OUT | GPIO17 | 信号输出(Pin11) |
连接完成后,用万用表确认:
# 检测供电电压(应显示~5V) $ multimeter VCC-GND # 检测信号输出(静止时应为0V,触发时~3.3V) $ multimeter OUT-GND2. 环境配置与基础测试
2.1 树莓派系统准备
推荐使用Raspberry Pi OS Lite版本,通过SSH远程操作。首先更新系统:
sudo apt update && sudo apt upgrade -y安装必要的GPIO控制库:
sudo apt install python3-gpiozero python3-rpi.gpio -y2.2 基础功能验证
创建测试脚本sr501_test.py:
from gpiozero import InputDevice from time import sleep sensor = InputDevice(17) # 对应GPIO17 while True: if sensor.is_active: print("检测到人体移动!") else: print("等待检测...") sleep(0.5)运行后,当手在模块前方移动时,终端应显示检测信息。若未响应,检查:
- 供电是否正常(模块红色LED应常亮)
- 接线是否正确(特别是GPIO编号)
- 电位器是否调至最敏感位置
3. 智能照明系统实现
3.1 继电器控制电路
为安全控制220V灯具,需添加继电器模块:
| 继电器引脚 | 树莓派接口 |
|---|---|
| VCC | 5V(Pin2) |
| GND | GND(Pin6) |
| IN | GPIO27 |
典型接线示意图:
[墙电] → [继电器常开端] → [灯具] → [墙电]安全警告:高压电路操作务必断电连接,建议使用预制的继电器模块而非裸继电器。
3.2 完整控制程序
创建smart_light.py:
#!/usr/bin/env python3 import RPi.GPIO as GPIO from time import sleep import datetime # 引脚定义 PIR_PIN = 17 RELAY_PIN = 27 LIGHT_SENSOR_PIN = 24 # 可选光敏电阻 # 初始化 GPIO.setmode(GPIO.BCM) GPIO.setup(PIR_PIN, GPIO.IN) GPIO.setup(RELAY_PIN, GPIO.OUT, initial=GPIO.LOW) def is_dark(): """使用光敏电阻检测环境亮度""" GPIO.setup(LIGHT_SENSOR_PIN, GPIO.OUT) GPIO.output(LIGHT_SENSOR_PIN, GPIO.LOW) sleep(0.1) GPIO.setup(LIGHT_SENSOR_PIN, GPIO.IN) start = datetime.datetime.now() while (GPIO.input(LIGHT_SENSOR_PIN) == GPIO.LOW): if (datetime.datetime.now() - start).seconds > 1: return True # 超时视为黑暗环境 return False try: while True: if GPIO.input(PIR_PIN) and is_dark(): print(f"{datetime.datetime.now()} - 激活照明") GPIO.output(RELAY_PIN, GPIO.HIGH) sleep(30) # 持续点亮30秒 GPIO.output(RELAY_PIN, GPIO.LOW) sleep(0.1) finally: GPIO.cleanup()关键功能说明:
- 双重条件触发:仅当检测到人体移动且环境黑暗时亮灯
- 安全保护:使用
try/finally确保程序退出时关闭继电器 - 可调参数:点亮时长、灵敏度等均可通过代码修改
4. 进阶优化技巧
4.1 状态指示灯实现
添加双色LED指示系统状态:
- 红色:待机状态
- 绿色:触发状态
接线示例:
LED_RED = 22 LED_GREEN = 23 GPIO.setup(LED_RED, GPIO.OUT) GPIO.setup(LED_GREEN, GPIO.OUT) # 在循环中添加状态指示 GPIO.output(LED_RED, not GPIO.input(PIR_PIN)) GPIO.output(LED_GREEN, GPIO.input(PIR_PIN))4.2 网络远程监控
使用Flask创建简单Web界面:
from flask import Flask, render_template_string app = Flask(__name__) @app.route("/") def status(): pir_state = "活跃" if GPIO.input(PIR_PIN) else "静止" return render_template_string(''' <h1>智能灯状态</h1> <p>传感器: {{ state }}</p> <p>最后触发: {{ time }}</p> ''', state=pir_state, time=datetime.datetime.now())启动命令:
export FLASK_APP=smart_light.py flask run --host=0.0.0.04.3 功耗优化方案
对于电池供电场景,可采用以下策略:
- 使用
gpiozero的MotionSensor内置去抖功能 - 添加深度睡眠模式(需额外硬件支持)
- 降低检测频率(如每2秒检测一次)
修改后的检测循环:
from signal import pause def motion_detected(): print("检测到移动!") GPIO.output(RELAY_PIN, GPIO.HIGH) sleep(30) GPIO.output(RELAY_PIN, GPIO.LOW) sensor.when_motion = motion_detected pause() # 保持程序运行5. 实际部署建议
在楼梯间安装时,注意:
- 模块高度约1.2-1.5米(成人腰部位置)
- 避免正对窗户或热源(如暖气片)
- 定期清洁传感器透镜(灰尘影响灵敏度)
常见问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 持续误触发 | 环境温度变化剧烈 | 调整灵敏度电位器 |
| 无任何响应 | 电源接反或电压不足 | 检查供电极性及电压 |
| 触发后立即关闭 | 延时调节过短 | 顺时针旋转延时电位器 |
| 夜间不工作 | 光敏电阻阈值设置不当 | 调整分压电阻或代码阈值 |
对于需要多个感应点的场景(如长走廊),可并联多个SR501模块的OUT信号到同一GPIO,或使用树莓派扩展板增加输入通道。
