1. 为什么需要STM32+ESP8266的智能人体感应灯
每次深夜回家摸黑找开关,或者忘记关灯导致电费飙升时,我就在想:要是有个能自动感应人体、还能手机远程控制的灯该多好。这就是我们今天要聊的STM32+ESP8266智能人体感应灯系统。
传统的红外感应灯有三个痛点:无法远程查看状态、不能调节灵敏度、离线无法记录数据。而用STM32F103C8T6做主控,搭配ESP8266 WiFi模块的方案,完美解决了这些问题。实测下来,这套系统成本不到50元,但实现了以下功能:
- 无接触控制:5米内自动感应人体活动
- 远程管理:通过手机APP查看灯光状态和历史记录
- 环境自适应:根据光照强度自动调节触发阈值
- 能耗监控:统计每日用电量并生成可视化报表
我曾给朋友家的车库安装过这个系统,原本每月照明用电约15度,改造后降到3度左右。最实用的其实是远程查看功能,朋友经常出差,通过手机就能确认车库灯是否关闭,再也不用麻烦邻居帮忙检查了。
2. 硬件选型与电路设计要点
2.1 核心器件选型指南
在电子市场花了三天时间对比测试后,我确定了这套高性价比方案:
主控芯片:
- STM32F103C8T6(蓝色pill开发板)
- 72MHz主频够用且稳定
- 内置ADC用于光敏电阻采样
- 20元/片的价位学生党也能承受
WiFi模块:
- ESP-01S(ESP8266)
- 支持AT指令和Lua脚本
- 实测穿墙性能比ESP32-C3更稳定
- 注意要买带金属屏蔽罩的版本
传感器:
- HC-SR501人体红外模块
- 探测角度120°可调
- 延时时间通过电位器可调(5s-5min)
- 注意区分3.3V/5V工作电压版本
照明模块:
- 5W 2835贴片LED灯板
- 搭配MOS管驱动电路(IRLZ44N)
- 实测连续工作8小时温升仅12℃
2.2 电路设计避坑经验
第一次打样PCB就栽在电源设计上,这里分享几个关键点:
三级电源架构:
- 220V转5V开关电源(建议用明纬GSM60A)
- 5V转3.3V LDO(AMS1117-3.3)
- 单独给ESP8266增加100μF钽电容
抗干扰设计:
- PIR信号线加10K上拉电阻
- ESP8266的TX/RX串100Ω电阻
- 所有数字地模拟地单点连接
安全防护:
- LED驱动回路加自恢复保险丝
- 交流侧使用光耦隔离(PC817)
- 金属外壳必须接地
提示:用万用表测量STM32的ADC基准电压,如果偏离3.3V超过5%,需要在VDDA引脚加0.1μF去耦电容。
3. 通信协议与数据传输实现
3.1 ESP8266联网配置技巧
让ESP8266稳定联网是个技术活,我总结出三步配置法:
- AT指令初始化(波特率115200)
AT+CWMODE=1 // Station模式 AT+CWJAP="WiFi名","密码" // 连接路由器 AT+CIPSTART="TCP","api.thingspeak.com",80 // 建立TCP连接- 心跳包机制:
void keepAlive() { if(millis() - lastHeartbeat > 300000) { // 5分钟一次 sendATCommand("AT+PING=\"www.baidu.com\""); lastHeartbeat = millis(); } }- 断网自恢复:
- 检测WiFi断开事件(WIFI_DISCONNECTED)
- 指数退避重连算法(1s, 2s, 4s...32s)
3.2 自定义轻量级协议
为减少数据传输量,我设计了8字节二进制协议:
| 字节 | 含义 | 示例值 |
|---|---|---|
| 0 | 帧头 | 0xAA |
| 1 | 命令类型 | 0x01(状态) |
| 2-3 | 光照强度 | 0x03E8(1000lux) |
| 4-5 | 累计工作时长(分钟) | 0x001E(30分钟) |
| 6 | 校验和 | 前6字节异或 |
| 7 | 帧尾 | 0x55 |
在STM32端用union处理数据转换:
typedef union { struct { uint8_t header; uint8_t cmd; uint16_t light; uint16_t duration; uint8_t checksum; uint8_t footer; } fields; uint8_t bytes[8]; } ProtocolPacket;4. 手机APP远程控制方案
4.1 安卓端开发实录
用MIT App Inventor快速搭建控制APP,关键组件包括:
UI布局:
- WebView组件(显示云端页面)
- 开关按钮(手动控制)
- 图表组件(能耗统计)
通信逻辑:
当 开关按钮.点击 如果 开关按钮.状态=true 调用 WebView.执行JavaScript["turnOn()"] 否则 调用 WebView.执行JavaScript["turnOff()"]- 数据推送:
- 通过MQTT协议订阅主题(topic/light_status)
- 采用QoS1保证消息可达
4.2 微信小程序方案
对于不想装APP的用户,可以用微信小程序实现控制:
- 配置WXSocket:
const socket = wx.connectSocket({ url: 'wss://yourdomain.com/ws', success: () => console.log('连接成功') })- 接收状态更新:
socket.onMessage((res) => { this.setData({ lightStatus: res.data === '1' ? '开启' : '关闭' }) })实测发现小程序方案更受欢迎,但要注意微信限制:
- 每个域名最多5个并发连接
- 必须配置合法HTTPS证书
- 心跳间隔不得小于30秒
5. 系统优化与故障排查
5.1 功耗优化三招
在电池供电场景下,通过以下措施将待机电流从12mA降到0.5mA:
- STM32睡眠模式:
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 通过EXTI唤醒- ESP8266深度睡眠:
ESP.deepSleep(30e6); // 休眠30秒- 传感器间歇工作:
- PIR传感器每2秒唤醒一次
- 光敏电阻每分钟采样一次
5.2 常见问题解决方案
问题1:PIR误触发
- 对策:增加软件滤波(连续3次检测到才判定为有效)
- 代码示例:
if(HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin)) { triggerCount++; if(triggerCount >= 3) { activateLight(); triggerCount = 0; } }问题2:WiFi频繁断开
- 检查路由器设置:关闭WMM、调整DTIM间隔为3
- 在ESP8266添加天线:用0.8mm漆包线绕制1/4波长天线(约31mm)
问题3:LED闪烁
- 在MOS管栅极加10K下拉电阻
- LED电源并联470μF电解电容
6. 进阶功能拓展
6.1 语音控制集成
通过增加LD3320语音识别芯片,实现离线语音指令:
硬件连接:
- LD3320的SPI接口接STM32
- 咪头输入接AIN0
关键词配置:
uint8_t code words[3][5] = { {0xD1,0xBF,0xB4,0xA8,0xBE}, // "开灯" {0xB9,0xD8,0xB5,0xC6,0x00}, // "关灯" {0xC1,0xAC,0xBD,0xD3,0x00} // "连接" };6.2 光强自适应算法
根据环境光照动态调整触发阈值:
#define LIGHT_THRESHOLD dayNightThreshold() uint16_t dayNightThreshold() { uint16_t ambient = readLightSensor(); if(ambient > 500) return 300; // 白天需要更强触发 else return 100; // 夜晚提高灵敏度 }这个算法使得系统在阳光直射下也能可靠工作,实测误报率降低72%。
7. 完整代码解析
7.1 STM32主控逻辑
核心控制流程采用状态机设计:
typedef enum { STATE_IDLE, STATE_DETECTING, STATE_LIGHT_ON, STATE_REPORTING } SystemState; void main() { SystemState state = STATE_IDLE; while(1) { switch(state) { case STATE_IDLE: if(checkPIR()) state = STATE_DETECTING; break; case STATE_DETECTING: if(confirmPresence()) { turnOnLight(); state = STATE_LIGHT_ON; } break; // ...其他状态处理 } HAL_Delay(100); } }7.2 ESP8266通信模块
封装好的网络服务接口:
bool sendToCloud(const char* data) { char cmd[128]; sprintf(cmd, "AT+CIPSEND=%d", strlen(data)); if(sendATCommand(cmd, ">", 1000)) { return sendATCommand(data, "SEND OK", 2000); } return false; }8. 实测性能数据
经过72小时连续测试,关键指标如下:
| 项目 | 数值 |
|---|---|
| 响应延迟 | 0.8-1.2秒 |
| 网络丢包率 | 0.3% |
| 最大探测距离 | 5.2米 |
| 待机功耗 | 0.48W |
| 工作温度范围 | -10℃~60℃ |
特别在低温环境下,给HC-SR501贴上加热片(5V/0.5W)可保证正常工作,这是东北地区用户的必备改装。