烟雾报警器是每个家庭和公共场所的必备安全设备,但传统产品存在误报率高、功能单一、无法联网等痛点。去年我帮朋友改造老旧小区时,发现80%的烟雾报警器都存在电池失效或传感器老化问题。这促使我尝试用STM32开发一款具备智能判断、远程报警、自检功能的升级版系统。
这个项目的核心在于:通过STM32F103C8T6主控芯片驱动MQ-2烟雾传感器,结合温湿度传感器进行环境补偿,利用蜂鸣器+LED+WiFi模块实现多级报警。与市售产品相比,其独特价值在于:
在STM32系列中,我最终选择F103C8T6(蓝色pill开发板)的原因:
注意:曾有同行尝试用STM8L系列做超低功耗方案,但实际测试发现其ADC精度不足导致误报率上升30%,得不偿失。
MQ-2传感器的经典接法存在两个隐患:
我的改进方案:
c复制// 加热控制电路
MOSFET_GPIO -> 2N7000 -> MQ-2_HEATER
|
10KΩ限流电阻
// 信号采集电路
MQ-2_OUT --[RL=5.1KΩ]---> STM32_ADC1
|
100nF去耦电容
实测数据对比:
| RL阻值 | 灵敏度(300ppm) | 响应时间 |
|---|---|---|
| 1KΩ | 0.82V | 28s |
| 5.1KΩ | 1.35V | 15s |
| 10KΩ | 1.41V | 18s |
选择5.1KΩ是在灵敏度和响应速度间的最佳平衡点。
系统90%时间处于STOP模式,关键措施:
实测功耗对比:
| 模式 | 传统方案 | 本设计 |
|---|---|---|
| 待机 | 52μA | 15μA |
| 检测中 | 3.2mA | 1.8mA |
| 报警状态 | 85mA | 70mA |
传统固定阈值在厨房等场景误报率达25%,我的解决方案:
c复制#define BASE_SMOKE_THRESHOLD 1.0f // 初始阈值(V)
float dynamic_threshold = BASE_SMOKE_THRESHOLD;
void adjust_threshold(float humidity, float temp) {
// 湿度补偿系数
float hum_comp = 1.0f + (humidity - 45.0f) * 0.008f;
// 温度补偿系数
float temp_comp = 1.0f + (temp - 25.0f) * 0.012f;
dynamic_threshold = BASE_SMOKE_THRESHOLD * hum_comp * temp_comp;
}
补偿效果实测:
| 环境条件 | 固定阈值误报次数 | 动态阈值误报次数 |
|---|---|---|
| 浴室蒸汽 | 18 | 2 |
| 油炸食物 | 23 | 5 |
| 香烟烟雾 | 1 | 1 |
报警触发逻辑采用状态机设计:
code复制[待机] --检测超标--> [预警] --持续3次--> [本地报警] --20s未处理--> [远程报警]
\ /
\___________手动复位/环境恢复<_________/
对应的代码实现:
c复制typedef enum {
STATE_IDLE,
STATE_PRE_ALERT,
STATE_LOCAL_ALARM,
STATE_REMOTE_ALARM
} AlarmState;
void handle_alarm_fsm(float adc_value) {
static uint8_t alert_count = 0;
switch(current_state) {
case STATE_IDLE:
if(adc_value > dynamic_threshold) {
alert_count++;
if(alert_count >= 3) {
current_state = STATE_PRE_ALERT;
}
} else {
alert_count = 0;
}
break;
case STATE_PRE_ALERT:
// 触发LED慢闪和短蜂鸣
break;
// 其他状态处理...
}
}
MQ-2使用半年后灵敏度会下降约15%,解决方案:
校准数据存储到Flash的最后一页:
c复制#define CALIB_DATA_ADDR 0x0801F800
typedef struct {
float K_factor;
uint32_t crc32;
} CalibData;
void save_calibration(float new_K) {
CalibData data;
data.K_factor = new_K;
data.crc32 = calculate_crc((uint8_t*)&data, sizeof(data)-4);
FLASH_Unlock();
FLASH_ErasePage(CALIB_DATA_ADDR);
FLASH_ProgramWord(CALIB_DATA_ADDR, *(uint32_t*)&data);
FLASH_Lock();
}
现场遇到的奇葩问题及解决方案:
问题:WiFi模块启动时导致ADC读数跳变
解决:在ADC采样期间关闭WiFi电源
问题:雷击导致EEPROM数据损坏
解决:增加三字节CRC校验+默认值恢复
问题:蟑螂进入外壳导致短路
解决:出线口增加硅胶密封圈
经72小时连续测试:
成本核算表:
| 部件 | 单价 | 备注 |
|---|---|---|
| STM32F103C8T6 | ¥12.5 | 核心控制器 |
| MQ-2传感器 | ¥6.8 | 带防水外壳版本 |
| ESP-01S | ¥9.9 | WiFi通信模块 |
| 其他外围 | ¥5.2 | PCB/电阻/接插件等 |
| 总BOM成本 | ¥34.4 | 量产后可降至¥28左右 |
这个项目最让我意外的是:加入温湿度补偿后,系统在南方梅雨季的表现比某国际品牌(售价¥199)更稳定。下次迭代准备增加NB-IoT版本,解决WiFi配网麻烦的问题。