1. 项目概述
这个基于STM32的家庭安全监测系统设计,是我去年帮朋友改造老房子时实际落地的项目。当时朋友刚搬进一套90年代的老式住宅,最头疼的就是门窗老化带来的安全隐患,以及老人独自在家时的安全监护问题。市面上现成的智能安防设备要么价格昂贵,要么功能单一,于是我们决定用STM32开发板自己搭建一套定制化方案。
整套系统从硬件选型到软件调试花了我们三周时间,最终实现了门窗状态监测、烟雾报警、异常声响检测三大核心功能,所有数据通过WiFi模块实时上传到手机APP。成本控制在300元以内,比同类商业产品便宜60%以上。最让我自豪的是,系统运行半年多来误报率始终保持在1%以下,成功预警了两次煤气泄漏和一次非法入侵。
2. 硬件系统设计
2.1 核心控制器选型
我们选择了STM32F103C8T6作为主控芯片,这款被戏称为"蓝色药丸"的开发板在创客圈几乎人手一块。选择它主要基于三点考虑:
- 性价比:淘宝价仅12-15元,却具备72MHz主频、64KB Flash和20KB RAM
- 外设丰富:自带2个SPI、2个I2C、3个USART接口,完美适配各类传感器
- 开发便利:Arduino兼容生态,降低了开发门槛
实际使用中发现,虽然STM32F103官方标称工作温度-40℃~85℃,但在南方夏季高温环境下长期运行,建议加装散热片或选择工业级的STM32F103RCT6。
2.2 传感器阵列配置
根据家庭安防的典型需求,我们配置了以下传感器模块:
| 传感器类型 | 具体型号 | 安装位置 | 供电方式 | 采样频率 |
|---|---|---|---|---|
| 门磁传感器 | KY-021 | 所有外门 | 3.3V直连 | 事件触发 |
| 烟雾传感器 | MQ-2 | 厨房/客厅 | 5V供电 | 1Hz |
| 声音传感器 | KY-038 | 主要房间 | 3.3V直连 | 动态阈值 |
| 温湿度传感器 | DHT11 | 各房间 | 3.3V供电 | 0.1Hz |
特别要说明的是声音传感器的安装技巧:我们通过实验发现,将灵敏度电位器调整到中间位置(约2.5V参考电压),再在软件端设置动态噪声基线,能有效减少刮风、电视声等环境噪声的误触发。
2.3 通信模块选择
最初考虑过蓝牙和Zigbee方案,但实测发现:
- 蓝牙传输距离在砖混结构中衰减严重
- Zigbee组网成本较高
最终选用ESP8266 WiFi模块,主要优势:
- 直接连接家庭路由器,无需额外网关
- 支持AT指令集,与STM32通过串口通信
- 内置TCP/IP协议栈,简化网络编程
实际部署时有个重要发现:当WiFi模块与STM32共用USB电源时,射频干扰会导致串口通信异常。后来改用独立的AMS1117稳压模块为ESP8266供电,问题立即解决。
3. 软件架构实现
3.1 系统工作流程
整个系统的软件逻辑采用事件驱动架构,主循环仅处理高优先级中断:
c复制void main() {
hardware_init();
wifi_connect();
while(1) {
if(check_fire_alarm()) send_alert();
if(check_door_event()) send_alert();
if(check_sound_event()) start_recording();
low_power_delay(100);
}
}
3.2 传感器数据处理
不同类型的传感器采用了差异化的处理策略:
- 门磁传感器:通过外部中断检测状态变化,消抖延时设置为50ms
- 烟雾传感器:采用滑动窗口平均算法,窗口大小设为10个采样点
- 声音传感器:动态基线调整算法实现如下:
c复制#define NOISE_HISTORY 30
uint16_t noise_floor = 500;
void update_noise_floor(uint16_t current) {
static uint16_t history[NOISE_HISTORY];
static uint8_t index = 0;
history[index++] = current;
if(index >= NOISE_HISTORY) index = 0;
uint32_t sum = 0;
for(int i=0; i<NOISE_HISTORY; i++) {
sum += history[i];
}
noise_floor = sum / NOISE_HISTORY + 150; // 安全余量
}
3.3 网络通信协议
为降低服务器压力,我们设计了分层报警策略:
- 状态数据:每5分钟上报一次(JSON格式)
- 普通事件:立即上报(如门窗开关)
- 紧急事件:连续上报3次(烟雾/高分贝声响)
通信数据包示例:
json复制{
"device_id": "STM32_001",
"timestamp": 1654321000,
"event_type": "door_open",
"location": "main_door",
"sensor_value": 1
}
4. 电源管理与低功耗优化
4.1 供电方案选择
测试了三种供电方案后,最终确定最优配置:
- 主控板:5V/2A USB电源(常电)
- 传感器阵列:3.3V LDO稳压电路
- WiFi模块:独立3.3V开关电源
实测整机待机功耗约120mA,触发报警时峰值电流可达250mA。为预防停电情况,建议搭配20000mAh的UPS电源,可维持系统工作约48小时。
4.2 低功耗编程技巧
通过以下措施将功耗降低40%:
- 将未使用的GPIO设置为模拟输入模式
- 采用事件唤醒替代轮询检测
- 动态调整CPU频率(72MHz↔8MHz)
- 关闭调试接口(SWD/JTAG)
关键代码实现:
c复制void enter_low_power_mode() {
RCC->CFGR &= ~RCC_CFGR_HPRE_DIV1; // AHB分频
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // APB1分频
FLASH->ACR |= FLASH_ACR_LATENCY_0; // Flash等待周期
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_HSI; // 切换至内部8MHz时钟
}
5. 外壳设计与安装要点
5.1 3D打印外壳设计
使用FreeCAD设计了模块化外壳:
- 主控单元:100×80×25mm(带散热孔)
- 传感器模块:Φ50mm半球形外壳
- 安装方式:3M VHB双面胶固定
重要经验:打印时务必选择阻燃PLA材料,我们曾因使用普通PLA导致外壳在高温环境下变形。
5.2 现场安装规范
通过多次安装总结出以下黄金法则:
- 门磁传感器间距≤8mm(磁铁与干簧管)
- 烟雾传感器距天花板30-50cm
- 声音传感器避开空调出风口
- 所有线缆套用阻燃波纹管
特别提醒:安装前务必用酒精擦拭安装表面,我们有个客户因墙面灰尘导致3M胶失效,传感器坠落砸坏了茶几。
6. 常见问题排查指南
根据半年来的维护经验,整理出故障速查表:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| WiFi频繁断开 | 路由器信道干扰 | 固定使用信道6或11 |
| 门磁误报 | 磁铁位移 | 调整间距或改用强磁铁 |
| 持续误报警 | 传感器污染 | 用棉签清洁MQ-2气室 |
| 数据延迟 | 网络拥塞 | 启用QoS或更换路由器 |
| 电源重启 | 电流不足 | 更换2A以上电源适配器 |
最棘手的案例是某客户反映系统每天凌晨3点准时误报,后来发现是他家的老冰箱压缩机启动时产生电压骤降。加装1000μF电容后问题彻底解决。
7. 系统扩展方向
现有系统还可以通过以下方式增强:
- 增加PIR人体感应模块(推荐HC-SR501)
- 集成摄像头联动(通过串口控制ESP32-CAM)
- 添加本地语音报警(使用SYN6288语音芯片)
- 开发微信小程序控制端(替代原生APP)
最近正在试验的新功能是漏水检测,使用特制的铝箔胶带制作简易水位传感器,成本不到5元却能有效预防水管爆裂事故。