1. 项目概述
这个基于STM32的火灾监控与可视化系统是我去年指导的一个本科毕业设计项目,经过三个月的开发和调试,最终实现了一套完整的火灾预警解决方案。系统通过多种传感器实时采集环境数据,结合无线通信技术实现远程监控,特别适合仓库、实验室等需要防火监控的场所。
提示:选择STM32F103C8T6作为主控芯片主要考虑其性价比高、外设丰富,且开发资料齐全,特别适合学生项目开发。
系统最核心的创新点在于将传统的本地报警升级为网络化监控,通过WiFi/NB-IoT模块实现数据上传,配合上位机软件实现可视化监控。下面我将从硬件设计、软件实现到系统调试,详细分享这个项目的完整开发过程。
2. 硬件设计与选型
2.1 主控芯片选型
我们最终选择的STM32F103C8T6(俗称"蓝莓板")具有以下优势:
- 72MHz主频的Cortex-M3内核,性能足够处理传感器数据
- 内置64KB Flash和20KB SRAM
- 丰富的外设接口:3个USART、2个SPI、2个I2C
- 12位ADC转换器(1μs转换时间)
- 价格仅10元左右,性价比极高
实际使用中发现其ADC参考电压需要特别注意:开发板默认使用3.3V作为VREF+,但部分批次板子需要手动连接VREF+引脚到3.3V,否则ADC读数会不准。
2.2 传感器选型与电路设计
2.2.1 烟雾传感器
选用MQ-2半导体烟雾传感器,其特点包括:
- 检测范围:300-10000ppm(液化气、丙烷、氢气)
- 加热电压:5V±0.1V
- 负载电阻:可调(通常使用10kΩ)
注意:MQ-2需要预热20-30分钟才能稳定工作,在程序初始化时需要加入预热等待逻辑。
传感器输出电路设计:
c复制// ADC通道初始化代码示例
void Adc_Init_Fire(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
// PA1作为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
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_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
2.2.2 温度传感器
选用DS18B20数字温度传感器,采用单总线协议:
- 测量范围:-55℃~+125℃
- 精度:±0.5℃(-10℃~+85℃)
- 仅需一个GPIO口即可通信
典型连接电路:
code复制VDD(3.3V) ────┬──── DS18B20
4.7KΩ
GND ──────────┘
2.2.3 PM2.5传感器
选用GP2Y1010AU0F光学灰尘传感器:
- 检测颗粒物直径:>0.8μm
- 灵敏度:0.5V/(0.1mg/m³)
- 需要配合LED驱动电路使用
2.3 通信模块设计
采用ESP8266 WiFi模块,工作模式配置为AP+STA混合模式:
- AP模式:创建热点供手机直连
- STA模式:可连接路由器上传云端
- 默认波特率:115200bps
硬件连接:
code复制STM32 USART2_TX(PA2) ─── ESP8266 RX
STM32 USART2_RX(PA3) ─── ESP8266 TX
ESP8266 CH_PD ─── 3.3V
ESP8266 VCC ─── 3.3V
ESP8266 GND ─── GND
经验:ESP8266对电源噪声敏感,务必在VCC附近加100μF+0.1μF电容滤波。
3. 软件系统设计
3.1 系统架构设计
整个系统采用前后台架构:
- 前台:中断驱动(传感器数据采集)
- 后台:主循环处理(数据分析、通信)
mermaid复制graph TD
A[传感器数据采集] --> B[数据预处理]
B --> C[阈值判断]
C -->|超阈值| D[触发报警]
C -->|正常| E[数据上传]
D --> F[声光报警]
E --> G[无线传输]
G --> H[上位机显示]
3.2 主程序设计
主程序流程图关键节点:
- 系统初始化
- 传感器预热
- 进入主循环:
- 采集各传感器数据
- 数据滤波处理
- 阈值判断
- 通信处理
- 人机交互
c复制int main(void)
{
// 硬件初始化
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
USART2_Init(115200);
SPI2_Init();
LCD_Init();
LED_Init();
KEY_Init();
// 传感器初始化
Adc_Init_Fire();
Adc_Init_PM25();
DHT11_Init();
// WiFi模块初始化
atk_8266_init();
// 主循环
while(1) {
sensor_data_update();
alarm_check();
wifi_data_transfer();
lcd_display();
delay_ms(200);
}
}
3.3 关键算法实现
3.3.1 数据滤波算法
采用滑动平均滤波+限幅滤波组合算法:
c复制#define FILTER_LEN 5
uint16_t fire_data_filter(uint16_t new_val)
{
static uint16_t filter_buf[FILTER_LEN] = {0};
static uint8_t filter_cnt = 0;
static uint16_t last_val = 0;
uint32_t sum = 0;
uint8_t i;
// 限幅滤波
if(abs(new_val - last_val) > 500) {
new_val = last_val;
}
// 滑动平均
filter_buf[filter_cnt++] = new_val;
if(filter_cnt >= FILTER_LEN) filter_cnt = 0;
for(i=0; i<FILTER_LEN; i++) {
sum += filter_buf[i];
}
last_val = sum / FILTER_LEN;
return last_val;
}
3.3.2 报警判断逻辑
多条件复合判断算法:
c复制void alarm_check(void)
{
static uint8_t alarm_cnt = 0;
// 温度突变检测
if((current_temp - last_temp) > 5.0f) {
alarm_cnt += 2;
}
// 烟雾浓度检测
if(fire_adc > FIRE_THRESHOLD) {
alarm_cnt += 3;
}
// PM2.5检测
if(pm25_val > PM25_THRESHOLD) {
alarm_cnt += 1;
}
// 综合判断
if(alarm_cnt >= 5) {
trigger_alarm();
alarm_cnt = 0;
} else if(alarm_cnt > 0) {
alarm_cnt--;
}
last_temp = current_temp;
}
3.4 WiFi通信协议设计
自定义简单通信协议格式:
code复制[HEAD][LEN][CMD][DATA][CRC]
- HEAD:0xAA 0x55
- LEN:数据长度
- CMD:命令字
- DATA:数据内容
- CRC:CRC8校验
典型数据帧示例:
python复制# 传感器数据上传帧
AA 55 07 01 02 41 00 64 00 C8 3A
# 解析:
# 02 - 烟雾ADC高字节
# 41 - 烟雾ADC低字节(0x0241=577)
# 00 - 温度整数部分(0°C)
# 64 - 温度小数部分(0.64°C)
# 00 - PM2.5高字节
# C8 - PM2.5低字节(0x00C8=200)
4. 上位机软件开发
4.1 开发环境选择
使用Python+PyQt5开发跨平台上位机,主要考虑:
- 开发效率高
- 丰富的图表库支持
- 可打包为Windows/Linux/macOS应用
核心依赖库:
python复制# requirements.txt
PyQt5==5.15.4
pyqtgraph==0.11.1
pyserial==3.5
4.2 界面设计要点
主界面包含四个功能区:
- 实时数据显示区(曲线图+数值)
- 报警设置区(阈值调整)
- 历史数据区(表格展示)
- 系统控制区(模式切换)
python复制class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建图表
self.plot = pg.PlotWidget()
self.plot.setBackground('w')
self.plot.setLabel('left', '传感器值')
self.plot.setLabel('bottom', '时间')
self.curve_fire = self.plot.plot(pen=pg.mkPen('r', width=2))
self.curve_temp = self.plot.plot(pen=pg.mkPen('b', width=2))
# 创建控制面板
self.threshold_spin = QSpinBox()
self.threshold_spin.setRange(0, 1000)
self.auto_mode_btn = QRadioButton("自动模式")
# 布局设置
layout = QHBoxLayout()
layout.addWidget(self.plot, 4)
layout.addWidget(self.create_control_panel(), 1)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
4.3 数据通信实现
TCP服务器实现代码:
python复制class TcpServerThread(QThread):
data_received = pyqtSignal(dict)
def __init__(self, port=5000):
super().__init__()
self.port = port
self.running = True
def run(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', self.port))
server.listen(1)
while self.running:
conn, addr = server.accept()
with conn:
while True:
data = conn.recv(1024)
if not data:
break
# 解析数据
parsed = self.parse_data(data)
if parsed:
self.data_received.emit(parsed)
def parse_data(self, raw):
# 实现协议解析
pass
5. 系统调试与优化
5.1 常见问题排查
-
ESP8266连接不稳定
- 检查电源质量(示波器观察3.3V纹波)
- 降低波特率测试(从115200降到9600)
- 添加AT命令重试机制
-
传感器数据跳动大
- 增加硬件滤波电容(0.1μF并联在传感器输出端)
- 优化软件滤波算法参数
- 检查传感器供电稳定性
-
LCD显示异常
- 检查背光电压(通常需要5V)
- 调整SPI时钟频率(通常<10MHz)
- 检查初始化时序是否符合规格书要求
5.2 性能优化记录
-
数据上传频率优化:
- 初始设计:200ms/次 → WiFi负载过高
- 优化后:1s/次(普通模式),100ms/次(报警模式)
-
低功耗优化:
- 空闲时关闭传感器电源(节省约60mA电流)
- 采用中断唤醒代替轮询(KEY中断唤醒)
-
代码空间优化:
- 使用-Os优化等级
- 移除不必要库文件(节省约15KB Flash)
6. 项目扩展方向
-
物联网平台接入
- 增加MQTT协议支持,接入阿里云IoT平台
- 实现微信小程序远程监控
-
多节点组网
- 采用LoRa模块实现多节点组网
- 增加中继路由功能
-
AI火灾预测
- 收集历史数据训练简单预测模型
- 实现早期火灾风险预警
经验分享:在实际部署中发现,传感器定期校准非常重要。建议每3个月进行一次标准气体校准,特别是MQ-2传感器灵敏度会随时间下降约15%/年。
这个项目从硬件选型到软件开发完整实现了火灾监控系统,涉及嵌入式开发、电路设计、上位机编程等多个技术领域,非常适合作为毕业设计项目。所有源码和设计文档都已开源,希望能给后续做类似课题的同学提供参考。
