1. 项目概述
这个基于STM32的无线火灾报警系统是我去年为一个社区活动中心开发的安防项目。当时他们需要一套能够实时监测环境状况,并在火灾隐患出现时立即报警的智能装置。传统的有线报警系统布线复杂,而市面上成品的物联网报警器又超出了预算。于是我用STM32F103C8T6作为主控,搭配常见的传感器模块和ESP8266 WiFi模块,花了三周时间完成了这套低成本、高可靠性的DIY解决方案。
整套系统可以同时监测环境中的烟雾浓度、温度和湿度三个关键指标。当任何一项参数超过安全阈值时,不仅会触发本地声光报警,还会通过MQTT协议将报警信息推送到手机APP和云端管理平台。最让我自豪的是,在半年多的实际运行中,它成功预警了两次因电路老化导致的初期阴燃情况,避免了可能发生的火灾事故。
2. 核心硬件选型与设计
2.1 主控芯片选择
为什么选择STM32F103C8T6(俗称"蓝 pill")?这款Cortex-M3内核的MCU在性价比方面几乎无可挑剔:
- 72MHz主频足够处理多传感器数据
- 64KB Flash + 20KB RAM的内存配置
- 丰富的GPIO和外设接口(3个USART、2个SPI、2个I2C)
- 市面上有大量现成的开发资源和库支持
注意:购买时要认准正版芯片,我曾遇到过山寨芯片ADC精度不达标的问题。建议通过正规代理商采购,虽然单价可能贵2-3元,但稳定性有保障。
2.2 传感器组合方案
烟雾检测选用MQ-2半导体传感器,它对液化气、丙烷、氢气等可燃气体都有良好的灵敏度。虽然不如专业消防用的光电式烟雾探测器精确,但胜在价格低廉(约15元)、响应速度快。
温湿度监测使用DHT22数字传感器,相比更便宜的DHT11,它的测量范围更广(-40~80℃)、精度更高(±0.5℃)。实际测试中发现,将其安装在距离天花板20-30cm的位置,能最早感知到温度异常变化。
2.3 无线通信模块
ESP8266-01S是这个项目的联网核心,选择它主要考虑:
- 支持802.11 b/g/n协议,传输稳定
- 内置TCP/IP协议栈,减轻MCU负担
- 通过AT指令控制,开发门槛低
- 超低功耗(深度睡眠时仅0.1mA)
3. 系统架构与工作原理
3.1 硬件连接示意图
plaintext复制+---------------+
| STM32F103 |
| (主控MCU) |
+-------┬-------+
|
v
+-------┴-------+ +-----------+ +-----------+
| MQ-2烟雾 | | DHT22温 | | ESP8266 |
| 传感器 | | 湿度传感器| | WiFi模块 |
+---------------+ +-----------+ +-----------+
| | |
v v v
+---------------+
| 蜂鸣器+LED |
| (报警装置) |
+---------------+
3.2 工作流程
- 上电初始化:各传感器校准(约20秒)
- 主循环执行:
- 每5秒读取一次DHT22数据
- 每10秒读取一次MQ-2模拟值
- 数据超出阈值时触发本地报警
- 通过ESP8266上传数据到云端
- 网络异常时自动重连(最多尝试3次)
- 低功耗模式设计(夜间降低采样频率)
4. 关键代码实现
4.1 传感器数据采集
c复制// DHT22数据读取函数
float read_dht22() {
uint8_t data[5] = {0};
HAL_GPIO_WritePin(DHT_GPIO_Port, DHT_Pin, GPIO_PIN_RESET);
HAL_Delay(18);
HAL_GPIO_WritePin(DHT_GPIO_Port, DHT_Pin, GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin) == GPIO_PIN_RESET) {
while(HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin) == GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin) == GPIO_PIN_SET);
for(int i=0; i<5; i++) {
for(int j=0; j<8; j++) {
while(!HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin));
uint32_t start = HAL_GetTick();
while(HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin));
if(HAL_GetTick()-start > 40) data[i] |= (1<<(7-j));
}
}
if(data[4] == (data[0]+data[1]+data[2]+data[3])) {
return (data[2]<<8 | data[3]) * 0.1;
}
}
return -99.9; // 错误返回值
}
4.2 WiFi通信处理
c复制void send_to_server(float temp, float humi, uint16_t smoke) {
char cmd[128];
sprintf(cmd, "AT+CIPSEND=%d", strlen(json_data));
HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 1000);
char json_data[256];
sprintf(json_data, "{\"temp\":%.1f,\"humi\":%.1f,\"smoke\":%d}",
temp, humi, smoke);
HAL_UART_Transmit(&huart2, (uint8_t*)json_data, strlen(json_data), 1000);
// 等待发送完成
HAL_Delay(500);
}
5. 报警逻辑设计
5.1 多级预警机制
| 风险等级 | 触发条件 | 响应措施 |
|---|---|---|
| 一级预警 | 温度>50℃ 或 湿度<15% | LED慢闪(1Hz) |
| 二级预警 | 烟雾值>300 或 温度>70℃ | 蜂鸣器间歇报警,LED快闪(3Hz) |
| 紧急报警 | 烟雾值>600 或 温度>90℃ | 持续声光报警,推送紧急通知 |
5.2 防误报策略
- 连续3次采样超阈值才触发报警
- 夜间(22:00-6:00)自动提高烟雾检测阈值20%
- 厨房等特殊区域可设置灵敏度调节系数
- 每月自动执行传感器自检程序
6. 物联网平台对接
选择阿里云物联网平台作为后端,主要考虑因素:
- 免费版完全满足本项目需求
- 提供完善的设备管理控制台
- 支持MQTT over TLS加密传输
- 有现成的手机APP SDK可用
设备三元组配置示例:
ini复制ProductKey = "a1xxxxxxxxx"
DeviceName = "fire_alarm_001"
DeviceSecret = "xxxxxxxxxxxxxxxx"
7. 实际部署经验
7.1 安装位置选择
- 烟雾传感器应距离墙壁至少50cm
- 避免安装在空调出风口正对面
- 厨房安装需距离灶台1.5米以上
- 每25平方米部署一个检测节点
7.2 电源管理技巧
- 建议采用5V/2A电源适配器供电
- 可加装18650电池作为UPS备用电源
- 使用TP4056充电模块实现充放电管理
- 深度睡眠模式下整机功耗<0.5W
8. 常见问题排查
8.1 WiFi连接不稳定
现象:设备频繁离线
可能原因:
- 路由器信道干扰 → 改用5GHz频段或固定信道
- 信号强度不足 → 添加WiFi中继器
- ESP8266供电不足 → 单独3.3V稳压供电
8.2 传感器数据异常
DHT22返回-99.9的解决方法:
- 检查接线是否松动(最好焊接)
- 上拉电阻建议使用4.7KΩ
- 两次读取间隔至少2秒
- 避免阳光直射传感器
9. 项目优化方向
- 增加LoRa无线组网功能,解决WiFi覆盖死角
- 集成PM2.5检测,提升空气质量监测能力
- 开发微信小程序替代原生APP
- 加入历史数据存储和分析功能
- 使用太阳能供电系统实现完全无线化
这个项目最让我意外的收获是发现了温湿度传感器的新用途 - 通过监测湿度骤降(通常伴随温度骤升)可以比烟雾传感器更早发现潜在火情。后来我在代码中加入了这个判断逻辑,使得系统的预警响应时间平均提前了1-2分钟。
