1. 项目概述
这个基于STM32的火灾监控与可视化系统是一个典型的嵌入式物联网应用,它完美结合了硬件采集、数据处理和远程监控三大功能模块。作为一名长期从事嵌入式开发的工程师,我认为这个项目特别适合作为电子类专业学生的毕业设计选题,因为它涵盖了从传感器选型到上位机开发的完整流程,能够全面锻炼学生的工程实践能力。
系统采用STM32F103系列单片机作为主控芯片,通过MQ-2烟雾传感器、温湿度传感器和PM2.5检测模块采集环境数据。当检测到异常情况时,系统会通过ESP8266 WiFi模块将数据实时传输到PC端的上位机软件,实现火灾预警的远程可视化监控。整个系统设计紧凑,成本控制在200元以内,却实现了商业级火灾报警器的核心功能。
2. 硬件设计详解
2.1 核心器件选型
主控芯片选用STM32F103C8T6,这款ARM Cortex-M3内核的MCU具有72MHz主频、64KB Flash和20KB RAM,完全能满足本项目的处理需求。选择它的主要原因有三点:
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 内置12位ADC,可直接连接模拟传感器
- 成熟的生态系统和丰富的开发资料
烟雾检测采用MQ-2半导体传感器,它对液化气、丙烷、氢气等可燃气体有很高的灵敏度。实际使用中需要注意:
传感器需要预热20-30分钟才能稳定工作,这是半导体传感器的固有特性
PM2.5检测选用GP2Y1010AU0F光学灰尘传感器,通过ADC采集其输出电压。这个传感器对0.8μm以上的颗粒物有良好响应,但需要配合红外LED的脉冲驱动。
2.2 电路设计要点
电源部分采用AMS1117-3.3V稳压芯片,为STM32和传感器提供稳定电源。设计时特别注意:
- 在稳压芯片输入输出端都添加100μF电解电容和0.1μF陶瓷电容
- 为模拟传感器供电单独增加LC滤波电路
传感器接口电路设计:
c复制// MQ-2传感器连接示意图
MQ-2 -> 信号调理电路 -> STM32 ADC1_IN0
10KΩ上拉电阻
1μF滤波电容
WiFi模块采用ESP8266-01S,通过串口与STM32通信。硬件连接时特别注意:
- ESP8266的TX接STM32的PA3(RX)
- ESP8266的RX接STM32的PA2(TX)
- 需添加电平转换电路(3.3V-5V)
3. 软件系统架构
3.1 主程序流程设计
系统软件采用前后台架构,主循环中轮询传感器数据并处理通信任务。关键流程如下:
- 系统初始化
c复制void SystemInit() {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
MX_SPI1_Init();
// ...其他外设初始化
}
- 传感器数据采集
c复制float GetSmokeValue() {
uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
float voltage = adcValue * 3.3 / 4095; // 12位ADC转换
return voltage * 10; // 根据传感器特性曲线转换
}
- 报警逻辑判断
c复制void CheckAlarm() {
if(smokeValue > threshold || pm25 > 500) {
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
SendAlertToServer();
}
}
3.2 WiFi通信实现
ESP8266配置为AP模式,创建TCP服务器。关键配置AT指令:
- 设置WiFi模式
at复制AT+CWMODE=3 // 同时支持STA和AP模式
- 创建热点
at复制AT+CWSAP="FireAlarm","12345678",5,3
- 启动TCP服务器
at复制AT+CIPSERVER=1,5000 // 端口5000
数据发送采用JSON格式封装:
json复制{
"smoke": 0.76,
"pm25": 120,
"temp": 25.3,
"status": "normal"
}
4. 上位机开发要点
4.1 Python上位机设计
使用PyQt5开发跨平台监控软件,核心功能包括:
- TCP服务器监听
- 数据可视化显示
- 报警阈值设置
- 历史数据存储
关键代码片段:
python复制class ServerThread(QThread):
data_received = pyqtSignal(dict)
def run(self):
with socket.socket() as s:
s.bind(('0.0.0.0', 5000))
s.listen(1)
while True:
conn, addr = s.accept()
data = conn.recv(1024).decode()
self.data_received.emit(json.loads(data))
4.2 数据可视化实现
使用PyQtChart实现实时曲线显示:
python复制chart = QChart()
series = QLineSeries()
chart.addSeries(series)
axisX = QValueAxis()
axisX.setRange(0, 100)
chart.addAxis(axisX, Qt.AlignBottom)
axisY = QValueAxis()
axisY.setRange(0, 5)
chart.addAxis(axisY, Qt.AlignLeft)
5. 系统调试与优化
5.1 常见问题排查
- ESP8266连接不稳定
- 检查天线摆放位置
- 确保供电充足(建议单独3.3V供电)
- 添加重连机制
- 传感器数据漂移
- 定期自动校准基准值
- 添加软件滤波算法
c复制#define FILTER_LEN 10
float filterBuf[FILTER_LEN];
float MovingAverage(float newVal) {
static uint8_t index = 0;
filterBuf[index++] = newVal;
if(index >= FILTER_LEN) index = 0;
float sum = 0;
for(int i=0; i<FILTER_LEN; i++) {
sum += filterBuf[i];
}
return sum / FILTER_LEN;
}
5.2 性能优化建议
- 低功耗优化
- 采用间歇工作模式
- 关闭未使用外设时钟
- 合理设置ADC采样率
- 通信协议优化
- 添加数据压缩
- 采用二进制协议替代JSON
- 实现差分传输
6. 项目扩展方向
在实际部署中,可以考虑以下增强功能:
- 多节点组网
- 采用LoRa实现长距离传输
- 构建Mesh网络提高可靠性
- 云平台集成
- 对接阿里云IoT平台
- 实现微信报警推送
- 智能联动
- 连接自动灭火装置
- 联动门禁系统开启应急通道
这个项目最值得称道的地方是它完整呈现了一个物联网系统的典型架构。从我的工程经验来看,学生在完成这个项目过程中,能够掌握嵌入式开发的全流程技能点,包括硬件设计、驱动开发、通信协议和上位机编程等核心能力。特别是在调试过程中积累的问题排查经验,对未来的职业发展大有裨益。
