1. 项目概述
这个基于STM32的火灾监控与可视化系统是我去年指导学弟完成的一个优秀毕业设计项目。作为一个在嵌入式领域摸爬滚打多年的工程师,我认为这个项目完美展现了STM32在物联网应用中的强大能力。系统通过多传感器协同工作,实现了从环境监测到远程预警的完整闭环,特别适合作为电子、自动化等相关专业的毕业设计选题。
项目最大的亮点在于将传统的火灾报警系统与物联网技术相结合。不同于市面上常见的独立报警器,我们的设计通过WiFi/NB-IoT模块实现了数据的远程传输和可视化,让用户可以通过手机或电脑实时监控环境状态。这种设计思路不仅符合当前物联网技术的发展趋势,也为后续功能扩展(如大数据分析、智能联动等)留下了充足的空间。
2. 硬件设计详解
2.1 核心器件选型
主控芯片我们选择了STM32F103C8T6,这款芯片在性价比和性能之间取得了很好的平衡:
- 72MHz主频的Cortex-M3内核,足够处理多传感器数据
- 64KB Flash + 20KB RAM的内存配置
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 12位ADC,采样速率可达1MHz
传感器部分采用了模块化设计:
- 烟雾检测:MQ-2半导体传感器
- 检测范围:300-10000ppm
- 响应时间:<10s
- 加热电压:5V±0.2V
- 温度检测:DS18B20数字温度传感器
- 测量范围:-55℃~+125℃
- 精度:±0.5℃
- PM2.5检测:GP2Y1010AU0F光学灰尘传感器
- 检测范围:0-500μg/m³
- 输出特性:模拟电压信号
2.2 电路设计要点
电源部分采用了两级稳压设计:
- 第一级:AMS1117-5.0将输入电压降至5V
- 第二级:AMS1117-3.3为MCU和部分传感器供电
信号调理电路特别关键,我们为MQ-2传感器设计了以下处理链路:
code复制传感器输出 → 电压跟随器 → 反相放大器(增益=10) → 低通滤波(fc=10Hz) → ADC输入
特别注意:MQ-2传感器需要预热20-30秒才能稳定工作,在电路设计中我们专门增加了电源控制电路,系统上电后先给MCU供电,延时后再接通传感器电源。
3. 软件架构实现
3.1 系统工作流程
整个系统采用状态机模式运行,主要状态包括:
- 初始化状态
- 外设初始化(USART、SPI、ADC等)
- 传感器预热
- WiFi模块配置
- 监测状态
- 循环采集各传感器数据
- 数据滤波处理(采用滑动平均算法)
- 报警状态
- 本地声光报警
- 远程数据推送
- 通信状态
- 响应上位机指令
- 定时上传监测数据
3.2 关键代码解析
数据采集部分采用了ADC DMA方式,极大提高了采样效率:
c复制// ADC初始化配置
void Adc_Init_Fire(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// DMA配置
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Value;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
// ADC配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
DMA_Cmd(DMA1_Channel1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
4. 物联网通信实现
4.1 WiFi模块配置
我们选用ESP8266作为通信模块,配置为AP模式:
- SSID:Fire_Monitor_AP
- 加密方式:WPA2-PSK
- 通信端口:5000
配置流程通过AT指令实现:
c复制void ESP8266_AP_Config(void)
{
// 重置模块
USART2_SendString("AT+RST\r\n");
delay_ms(1000);
// 设置模式为AP
USART2_SendString("AT+CWMODE=2\r\n");
delay_ms(500);
// 配置AP参数
USART2_SendString("AT+CWSAP=\"Fire_Monitor_AP\",\"12345678\",1,4\r\n");
delay_ms(500);
// 启用多连接
USART2_SendString("AT+CIPMUX=1\r\n");
delay_ms(500);
// 建立服务器
USART2_SendString("AT+CIPSERVER=1,5000\r\n");
delay_ms(500);
}
4.2 数据协议设计
为简化通信流程,我们设计了简单的文本协议:
- 数据上报格式:
<TEMP>,<SMOKE>,<PM25>\r\n- 示例:
25.6,345,78\r\n
- 示例:
- 指令接收格式:
- 手动模式:
###MANUAL - 自动模式:
###AUTO - 触发报警:
###ALARM_ON - 停止报警:
###ALARM_OFF
- 手动模式:
5. 系统优化与调试心得
5.1 传感器校准技巧
MQ-2传感器的输出受环境影响较大,我们采用了动态基线校准算法:
- 系统启动后前5分钟记录传感器输出最小值作为基准
- 每小时自动更新一次基准值
- 实际浓度计算:
浓度 = (当前值 - 基准值) * 校准系数
校准系数需要通过标准气体标定,我们的经验值:
- 烟雾:0.65
- 液化气:0.72
- 氢气:0.58
5.2 常见问题排查
-
WiFi连接不稳定
- 检查天线焊接是否良好
- 尝试降低波特率到9600
- 增加AT指令重试机制
-
传感器数据跳变
- 检查电源滤波电容(建议增加100μF电解电容)
- 优化软件滤波算法
- 检查传感器加热电压是否稳定
-
误报警问题
- 设置多级报警阈值
- 引入持续时间判断(持续3秒超限才报警)
- 增加传感器数据相关性校验
6. 项目扩展建议
这个基础框架可以进一步扩展:
- 增加LoRa模块实现远距离传输
- 接入云平台实现多节点监控
- 添加GPS模块实现位置上报
- 开发微信小程序替代PC端软件
- 引入机器学习算法实现火灾预测
我在实际部署中发现,将报警阈值设置为可远程配置的模式特别实用。通过在上位机软件中添加阈值设置界面,用户可以根据不同环境特点调整灵敏度,这个改进使系统的适用性大幅提升。