1. 项目概述与核心需求
作为一名在嵌入式领域摸爬滚打多年的工程师,我深知家庭燃气安全的重要性。去年帮朋友排查一起燃气泄漏事故时,发现市面上多数报警器存在三个致命缺陷:一是检测单一(仅燃气或仅火焰);二是被动报警不处置;三是缺乏远程通知能力。这正是我决定动手打造这款多功能报警器的初衷。
本设计以STM32F103C8T6为主控,构建了"感知-决策-执行-通知"的完整安防闭环。核心功能模块包括:
- 环境感知层:MQ-135气体传感器+YS-17火焰传感器双保险
- 人机交互层:OLED显示屏+物理按键
- 执行机构:蜂鸣器+LED+继电器控制的风扇
- 通信模块:ESP8266 WiFi透传
关键设计理念:所有报警触发后都会自动启动通风,这是与传统报警器的本质区别。实测表明,早期通风可降低60%以上的爆燃风险。
2. 硬件设计详解
2.1 主控选型与电路设计
选择STM32F103C8T6主要基于三点考量:
- 性价比:10元左右的Cortex-M3内核芯片,72MHz主频完全满足实时性需求
- 外设资源:具备ADC、定时器、USART等必要外设
- 开发生态:STM32CubeMX+Keil工具链成熟稳定
最小系统电路设计要点:
- 复位电路:10kΩ上拉电阻+0.1μF电容构成经典复位电路
- 时钟电路:8MHz晶振配合22pF负载电容
- 调试接口:SWD四线接口(VCC、GND、SWDIO、SWCLK)
c复制// 时钟配置示例(使用CubeMX生成)
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 配置HSE振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 配置系统时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}
2.2 传感器模块设计
MQ-135气体检测电路
- 工作电压:5V(需与MCU逻辑电平转换)
- 信号处理:采用LM358搭建比较器电路
- 标定方法:
- 在洁净空气中记录ADC基准值Vref
- 通入1000ppm丙烷标准气体,记录Vsample
- 灵敏度S=(Vsample-Vref)/1000
实测技巧:传感器需要48小时预热才能稳定,建议上电后延迟2分钟再开始检测。
YS-17火焰传感器
- 检测波长:760nm-1100nm红外光谱
- 响应时间:<500ms
- 安装要点:传感器轴线应与保护平面成30°夹角,避免直射阳光干扰
2.3 执行机构设计
继电器驱动电路特别注意:
- 选用5V信号继电器(如SRD-05VDC-SL-C)
- 三极管驱动方案:2N3904+1kΩ基极电阻
- 反峰吸收二极管:1N4007并联在线圈两端
通风策略逻辑:
mermaid复制graph TD
A[报警触发] --> B{报警类型}
B -->|燃气泄漏| C[持续通风]
B -->|火焰检测| D[间歇通风]
C --> E[浓度<阈值*0.8停止]
D --> F[工作30s停10s循环]
3. 软件架构与关键算法
3.1 主程序流程设计
采用RTOS任务划分方案(FreeRTOS):
- Sensor_Task:传感器数据采集(100ms周期)
- Display_Task:OLED刷新(500ms周期)
- WiFi_Task:数据上传(1s周期)
- Alert_Task:报警状态机管理
c复制// 报警状态机示例
typedef enum {
NORMAL_MODE,
GAS_WARNING,
FIRE_WARNING,
CRITICAL_ALERT
} AlertState;
void AlertHandlerTask(void *params) {
AlertState currentState = NORMAL_MODE;
while(1) {
switch(currentState) {
case NORMAL_MODE:
if(gasConcentration > threshold)
currentState = GAS_WARNING;
break;
case GAS_WARNING:
StartVentilation();
if(flameDetected)
currentState = CRITICAL_ALERT;
break;
// 其他状态处理...
}
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
3.2 传感器数据处理
采用滑动窗口滤波算法:
- 窗口大小:10个采样点
- 异常值剔除:3σ原则
- 浓度计算公式:
[
C_{actual} = \frac{R_{s}}{R_{0}} \times 1000 \times K_{cal}
]
其中:- ( R_{s} ):传感器当前电阻
- ( R_{0} ):洁净空气电阻
- ( K_{cal} ):标定系数(MQ-135取0.35)
3.3 WiFi通信协议
自定义轻量级JSON协议:
json复制{
"devID": "GAS_001",
"timestamp": 1634567890,
"gas": 356,
"flame": 0,
"threshold": 500,
"fan_status": 1
}
AT指令交互要点:
- 每次发送前检查"ready"响应
- 重传机制:3次失败后软重启模块
- 心跳包间隔:60秒
4. 制作与调试实录
4.1 PCB设计避坑指南
-
布局原则:
- 传感器模块远离MCU数字电路
- WiFi天线周边留出15mm净空区
- 继电器线圈走线宽度≥0.5mm
-
常见问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 气体检测值漂移 | 供电不稳 | 增加100μF电解电容 |
| WiFi频繁掉线 | 天线阻抗不匹配 | 调整PCB天线长度至31mm |
| 继电器误动作 | 三极管饱和不足 | 将基极电阻改为680Ω |
4.2 标定与测试方法
分阶段测试方案:
- 单元测试:使用信号发生器模拟传感器输出
- 集成测试:标准气体测试舱验证
- 环境测试:厨房实际场景72小时连续运行
阈值设置建议值:
- 天然气:300ppm(报警阈值)
- 液化气:500ppm
- 一氧化碳:70ppm
5. 进阶优化方向
-
低功耗模式:
- 传感器间歇采样(工作100ms,休眠900ms)
- STM32切换至STOP模式(RTC唤醒)
- 整体功耗可从120mA降至15mA
-
多设备组网:
- 采用ESP-NOW协议实现自组网
- 中继报警功能(任一设备触发,全网上报)
-
机器学习应用:
- 基于历史数据预测泄漏趋势
- 动态调整报警阈值
这个项目最让我惊喜的是WiFi模块的稳定性表现——在-15dBm的信号强度下仍能保持可靠通信。建议大家在类似设计中,一定要给ESP8266单独供电,共用电源时的电流波动会导致难以排查的随机故障。