1. 项目概述
去年夏天,我帮朋友改造了一套出租屋的安防系统。原本只是简单的门窗报警器,但租客反馈说经常误报,而且无法远程查看房屋状态。这让我意识到,市面上很多所谓的"智能安防"产品要么功能单一,要么价格昂贵。于是我开始着手设计这套基于STM32的多功能家庭智能安防系统,目标是打造一个成本控制在300元以内,却能实现烟雾检测、火焰报警、人体红外感应和远程视频监控的全功能方案。
这个系统的核心在于STM32F103C8T6主控芯片的选择。作为一款经典的ARM Cortex-M3内核MCU,它72MHz的主频足够处理多传感器数据,丰富的外设接口可以轻松连接各类模块,最重要的是其价格仅20元左右,非常适合DIY项目。经过三个月的开发和调试,最终成品不仅实现了所有预期功能,在实际测试中误报率低于2%,响应延迟控制在500ms以内。
2. 系统硬件设计
2.1 主控芯片选型
STM32F103C8T6之所以成为本项目的首选,主要基于以下几点考量:
- 性价比:相比同性能的TI或NXP方案便宜30%以上
- 开发生态:丰富的标准库和HAL库支持,社区资源充足
- 外设资源:3个USART、2个SPI、2个I2C接口,完美适配本项目需求
- ADC性能:12位精度配合1Msps采样率,满足烟雾传感器的模拟量采集
注意:购买时建议选择正品ST原装芯片,市场上流通的某些兼容型号可能存在ADC线性度问题。
2.2 传感器模块配置
2.2.1 火焰检测方案
采用DFRobot的火焰传感器模块,其核心参数如下:
| 参数 | 指标 |
|---|---|
| 检测距离 | 0-80cm |
| 响应波长 | 760-1100nm |
| 探测角度 | 60° |
| 输出信号 | 数字量(TTL)+模拟量 |
实际安装时需要注意:
- 避免正对阳光直射的窗户
- 安装高度建议距地面1.5-1.8米
- 多个传感器布置时间隔不小于2米
2.2.2 烟雾检测实现
MQ-2传感器的使用有几个关键点:
- 预热时间需要至少24小时才能稳定工作
- 建议每3个月用酒精棉片清洁传感器表面
- 报警阈值设置参考值:
c复制#define SMOKE_THRESHOLD 600 // ADC值,对应约10%LEL
2.2.3 人体红外检测
选用HC-SR501模块,其跳线设置建议:
- 单次触发模式(L端跳线)
- 灵敏度旋钮调至中间位置
- 延时时间设为5秒左右
2.3 通信模块设计
2.3.1 WiFi连接方案
ESP8266模块的配置流程:
- 烧录AT固件(建议使用v1.7.1版本)
- 设置STA模式连接路由器
- 启用MQTT协议连接阿里云IoT平台
关键AT指令序列:
bash复制AT+CWMODE=1
AT+CWJAP="SSID","password"
AT+MQTTUSERCFG=0,1,"clientID","username","password",0,0,""
AT+MQTTCONN=0,"iot.aliyuncs.com",1883,1
2.3.2 视频传输方案
ESP32-CAM模块的优化技巧:
- 修改摄像头分辨率:OV2640设置为800x600
- 调整帧率:15fps平衡流畅度和带宽
- 启用移动侦测功能减少数据量
3. 软件架构实现
3.1 主程序流程图
pseudo复制开始
↓
硬件初始化
↓
传感器校准(30s)
↓
主循环:
读取传感器数据 → 数据处理 → 异常判断
↑ ↓
← 网络状态检测 ←
视频帧采集 → 压缩 → 上传
↓
异常处理线程:
声光报警 → 推送消息 → 拍照存档
3.2 关键代码解析
3.2.1 多传感器数据融合
c复制typedef struct {
uint16_t smoke;
uint8_t flame;
uint8_t human;
float temp;
} SensorData;
void dataFusion(SensorData* data) {
// 加权平均算法
static uint8_t weight[4] = {40, 30, 20, 10};
uint16_t riskLevel = (data->smoke * weight[0] +
data->flame * weight[1] +
data->human * weight[2]) / 100;
if(riskLevel > 60) triggerAlarm();
}
3.2.2 低功耗优化
通过以下措施将待机功耗降至15mA:
- 关闭未使用的外设时钟
- 采用事件驱动代替轮询
- 传感器间歇工作模式
c复制void enterLowPowerMode() {
__HAL_RCC_GPIOA_CLK_DISABLE();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config(); // 唤醒后重新配置时钟
}
4. 系统测试与优化
4.1 环境适应性测试
在不同环境下的误报率统计:
| 环境条件 | 测试时长 | 误报次数 |
|---|---|---|
| 正常家居 | 72h | 2 |
| 厨房附近 | 72h | 5 |
| 阳光直射 | 72h | 8 |
| 空调出风口 | 72h | 3 |
解决方案:
- 增加温度补偿算法
- 设置环境自学习模式
- 采用滑动窗口滤波
4.2 网络稳定性优化
实测发现的典型问题及解决方法:
-
WiFi频繁断开
- 原因:路由器兼容性问题
- 解决:调整ESP8266的DTIM间隔
bash复制AT+CIPSNTPCFG=1,8,"pool.ntp.org" -
视频卡顿
- 原因:网络带宽不足
- 解决:动态码率调整
c复制void adjustBitrate() { if(wifiRSSI < -70) { setResolution(640x480); } else { setResolution(800x600); } }
5. 实际部署建议
经过半年多的实际使用,总结出以下经验:
-
安装位置选择
- 烟雾传感器:距离天花板30cm处
- 红外传感器:正对主要通道
- 摄像头:避免逆光角度
-
日常维护
- 每月用气吹清洁传感器
- 每季度检查固件更新
- 注意更换18650电池(约1年寿命)
-
扩展建议
- 添加LoRa模块增强覆盖
- 集成语音报警功能
- 支持本地SD卡存储
这个项目最让我自豪的是它的实用价值——有位独居老人用户反馈,系统成功预警了一次厨房忘关火的情况。这也提醒我,技术创新的本质应该是解决真实世界的实际问题。后续我计划加入AI图像识别功能,进一步降低误报率。