1. 项目背景与核心功能
在智能家居和节能环保的大趋势下,传统照明设备正经历着智能化升级。这个基于STM32单片机的智能红外感应光照检测台灯/路灯项目,完美结合了人体感应和环境光检测两大核心功能。它不仅能自动感知人体活动实现"人来灯亮,人走灯灭",还能根据环境光照强度智能调节亮度,既避免了传统灯具需要手动开关的麻烦,又能有效节约能源。
我最初做这个项目的动机很简单——家里老人经常忘记关台灯,而小区路灯又常常在天还没完全黑时就亮起,造成电力浪费。市面上的智能灯具要么功能单一,要么价格昂贵。于是决定用STM32开发一套高性价比的智能照明方案,经过三个版本的迭代优化,最终形成了这套稳定可靠的系统。
2. 硬件系统设计
2.1 核心器件选型
主控芯片选用STM32F103C8T6,这款Cortex-M3内核的MCU具有72MHz主频、64KB Flash和20KB RAM,完全满足我们的需求。更重要的是它丰富的外设接口:
- 2个12位ADC(用于光照传感器)
- 多达7个定时器(PWM调光)
- USART接口(调试和升级)
- 多达37个GPIO(连接各种传感器)
红外感应模块选用HC-SR501,这款被动式热释电红外传感器检测距离可达7米,灵敏度可调,且具有环境温度补偿功能。实测发现,将其感应延时调至5秒左右最适合台灯应用场景。
光照检测采用BH1750数字光强传感器,相比传统光敏电阻,它具有1-65535lx的宽量程和16位高分辨率,直接输出数字信号,省去了ADC采样和校准的麻烦。
2.2 电路设计要点
电源部分采用AMS1117-3.3V稳压芯片,将5V输入转换为3.3V供STM32使用。这里有个经验:一定要在电源输入端加一个大容量电解电容(100μF以上)和一个小陶瓷电容(0.1μF)并联,能有效抑制LED开关时的电压波动。
LED驱动使用MOSFET管IRLZ44N,其低导通电阻(35mΩ)和大电流(47A)特性,即使驱动大功率LED阵列也游刃有余。PWM调光频率建议设置在1kHz左右,这个频率既高于人眼可察觉范围,又不会因频率过高导致MOS管过热。
重要提示:红外传感器安装时要避免正对空调出风口或窗户,否则温度变化会导致误触发。最佳安装角度是与地面呈30-45度夹角。
3. 软件系统实现
3.1 开发环境搭建
使用Keil MDK作为开发环境,配置STM32标准外设库。工程中需要包含以下关键驱动:
- GPIO驱动(控制LED和读取传感器)
- ADC驱动(备用方案,实际使用BH1750的数字接口)
- TIM驱动(PWM生成)
- I2C驱动(BH1750通信)
初始化阶段要特别注意外设时钟的使能顺序,建议按以下顺序初始化:
- 系统时钟和GPIO
- I2C接口
- 定时器
- ADC(如果使用)
3.2 核心算法实现
主程序采用事件驱动架构,通过中断和轮询结合的方式处理各种事件:
c复制while(1) {
if(检测到人体红外信号) {
读取当前环境光照值;
if(光照值 < 阈值) {
计算PWM占空比 = 映射函数(光照值);
启动PWM输出;
开启延时计时器;
}
}
if(延时计时器超时 && 无持续人体信号) {
关闭PWM输出;
}
}
光照映射函数采用分段线性插值算法,将0-65535lx的光照范围映射到0-100%的PWM占空比。实测发现,将工作区间划分为5个段就能获得平滑的亮度过渡:
c复制uint16_t map_light_to_pwm(uint16_t lux) {
if(lux > 30000) return 0; // 白天完全关闭
else if(lux > 10000) return 10; // 黄昏微亮
else if(lux > 3000) return 30; // 傍晚中等亮度
else if(lux > 1000) return 60; // 夜间较亮
else return 100; // 全黑环境全亮
}
3.3 低功耗优化
虽然STM32F103不是专为低功耗设计,但通过以下措施仍能显著降低能耗:
- 在无人状态时进入Sleep模式,仅保留红外传感器供电
- 将主频降至8MHz(通过修改PLL配置)
- 关闭所有不用的外设时钟
- ADC采样间隔从1秒延长至5秒
实测表明,这些优化可使待机电流从25mA降至3mA左右,对于常开的路灯应用场景尤为重要。
4. 制作与调试经验
4.1 PCB设计注意事项
- 红外传感器信号线要走短线,必要时加100nF去耦电容
- PWM驱动线路要足够宽(建议1mm以上),减少压降
- 数字地和模拟地单点连接,接地点选在稳压芯片附近
- LED电源走线要与其他信号线保持距离,避免干扰
4.2 常见问题排查
问题1:红外传感器频繁误触发
- 检查供电电压是否稳定(应在4.5-5.5V)
- 调整传感器上的灵敏度电位器
- 检查是否安装在振动源附近
问题2:LED亮度闪烁不稳定
- 测量电源电压是否波动过大
- 检查PWM频率是否设置正确(示波器观察)
- MOSFET栅极驱动电阻是否合适(建议100Ω)
问题3:光照检测不准确
- BH1750是否避开直射光源
- I2C上拉电阻是否安装(通常4.7kΩ)
- 传感器窗口是否清洁
4.3 实测性能数据
经过72小时连续测试,系统表现如下:
- 人体检测响应时间:<0.5秒
- 光照检测误差:±5%(与专业照度计对比)
- 待机功耗:3.2mA@5V
- 工作温度范围:-10℃~50℃
- 最大驱动LED功率:实测可达20W(需加散热片)
5. 应用场景扩展
这套系统经过简单调整,可适用于多种场景:
- 走廊/楼梯照明:调整红外感应角度和延时时间
- 衣柜/橱柜灯:缩小感应范围,使用贴片式LED
- 庭院景观灯:增加防水外壳,使用大功率LED阵列
- 智能教室:联网组成照明控制系统
一个有趣的改造案例:将系统与太阳能电池板结合,白天充电晚上照明,完全实现离网运行。关键点是加入锂电池充放电管理电路,并修改光照阈值(因为太阳能板也受光照影响)。