用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引脚树莓派接口备注VCC5V(Pin2)电源正极GNDGND(Pin6)电源地线OUTGPIO17信号输出(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.pyfrom 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灯具需添加继电器模块继电器引脚树莓派接口VCC5V(Pin2)GNDGND(Pin6)INGPIO27典型接线示意图[墙电] → [继电器常开端] → [灯具] → [墙电]安全警告高压电路操作务必断电连接建议使用预制的继电器模块而非裸继电器。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, initialGPIO.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 , statepir_state, timedatetime.datetime.now())启动命令export FLASK_APPsmart_light.py flask run --host0.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或使用树莓派扩展板增加输入通道。