智能烟雾报警定位系统设计
1. 项目开发背景
随着城市化进程加快和建筑密度增加,火灾安全隐患日益突出。传统烟雾报警器存在误报率高、定位困难、响应滞后等问题,无法满足现代智慧消防的需求。根据应急管理部消防局统计,2022年全国接报火灾82.5万起,其中因报警延迟导致损失扩大的案例占比达34%。特别是在大型综合体、高层建筑等复杂环境中,传统报警系统难以快速精准定位火源位置。
物联网技术的发展为消防预警系统带来了新的解决方案。NB-IoT作为低功耗广域网络技术,具有覆盖广、连接多、功耗低等特点,非常适合消防终端设备的远程监控。同时,多传感器融合技术和精确定位能力的结合,可以显著提升火灾预警的准确性和响应速度。
本项目设计的智能烟雾报警定位系统,通过光电烟雾传感与红外热释电的双重检测机制,结合GPS/北斗双模定位,利用NB-IoT实现报警信息实时传输,构建了一套高可靠性、可定位的智能消防预警终端。系统特别针对传统报警器误报率高的问题,设计了温度补偿和数字滤波算法,大幅降低了环境干扰导致的误报情况。
2. 设计实现的功能
(1)多传感器联动检测:采用光电式烟雾传感器(MS1100)与热释电红外传感器(HC-SR501)双重检测机制,当两者同时触发时才确认火警,显著降低误报率。
(2)精确定位报警:集成UBlox NEO-6M GPS模块,实时获取设备经纬度坐标,报警信息包含精确位置数据,便于消防人员快速定位。
(3)远程无线传输:通过BC35 NB-IoT模块将报警信息实时上传至消防监控平台,支持TCP/IP协议栈,确保数据传输可靠性。
(4)本地声光报警:采用WS2812B可编程LED灯带和有源蜂鸣器组合报警,灯光可呈现多种警示模式(呼吸、闪烁、跑马等),声压级可达85dB。
(5)智能电源管理:基于TP4056芯片的锂电池充放电系统,支持5V/1A充电输入,具备过充、过放保护,续航时间可达6个月。
(6)数据协议标准化:采用JSON格式封装报警数据包,包含设备ID、时间戳、GPS坐标、烟雾浓度值等字段,便于平台端解析处理。
(7)抗干扰处理:软件层面实现温度补偿算法和数字滤波(中值+均值复合滤波),有效抑制环境因素导致的误触发。
3. 项目硬件模块组成
(1)主控单元:STM32F103RCT6微控制器,72MHz主频,256KB Flash,48KB RAM,提供丰富的外设接口。
(2)烟雾检测模块:MS1100光电式烟雾传感器,检测浓度范围0-100%LEL,响应时间<10s,工作电流<15mA。
(3)运动检测模块:HC-SR501热释电红外传感器,检测距离0-7米,视角120°,可与烟雾检测形成联动。
(4)定位模块:U-Blox NEO-6M GPS接收器,支持GPS/GLONASS双模,定位精度2.5m CEP,冷启动时间29s。
(5)通信模块:BC35 NB-IoT模组,支持Band5/Band8频段,最大上行速率62.5kbps,内置CoAP协议栈。
(6)显示模块:1.3寸OLED显示屏,分辨率128×64,SPI接口,用于显示设备状态和报警信息。
(7)报警单元:WS2812B RGB灯带(8颗LED) + 有源蜂鸣器(频率2.7kHz),实现多模式声光报警。
(8)电源模块:TP4056锂电池管理芯片 + 18650电池(3400mAh),支持4.2V满充电压,带温度保护功能。
4. 设计思路
系统采用分层架构设计,硬件层实现传感器数据采集和外围设备控制,中间层处理数据融合和算法执行,应用层完成业务逻辑和通信交互。主控芯片通过多任务调度机制协调各模块工作,确保实时性要求。
烟雾检测采用"双鉴"原理,只有当MS1100检测到烟雾浓度超标且HC-SR501感应到温度异常时,才触发报警流程。这种交叉验证方式可有效区分真实火情与烹饪油烟等干扰源。GPS模块通过NMEA-0183协议输出定位数据,系统解析GPRMC语句获取经纬度信息。
通信传输采用事件驱动模式,正常情况下设备处于低功耗状态,每2小时发送一次心跳包。当触发报警时,立即通过NB-IoT上传包含GPS坐标的JSON数据包,格式为:{“devID”:“FIRE_001”,“time”:“2023-08-15T14:30:22”,“lat”:31.2304,“lng”:121.4737,“smoke”:85,“temp”:65,“batt”:78}。
抗干扰设计包含硬件和软件双重措施:硬件上采用π型滤波电路抑制电源噪声,传感器信号线使用屏蔽线;软件层面实现滑动窗口中值滤波(窗口大小15)和温度补偿算法,根据环境温度动态调整烟雾浓度阈值。
5. 系统功能总结
功能类别 | 实现方式 | 性能指标 |
---|---|---|
火灾检测 | MS1100+HC-SR501双重验证 | 误报率<0.1次/月 |
定位精度 | UBlox NEO-6M GPS模块 | 水平精度2.5m(CEP) |
远程通信 | BC35 NB-IoT模组 | 传输延迟<5s(城市环境) |
本地报警 | WS2812B+蜂鸣器组合 | 声压级85dB@1m |
电源管理 | TP4056+18650锂电池 | 待机功耗<0.5mA,续航6个月 |
数据协议 | JSON格式封装 | 兼容HTTP/CoAP协议 |
抗干扰能力 | 温度补偿+数字滤波 | -20℃~60℃稳定工作 |
6. 技术方案
系统软件基于Keil MDK开发环境,采用模块化编程思想。通信协议栈包含三个层次:物理层(USART+DMA)、传输层(AT指令集)、应用层(自定义JSON协议)。GPS数据解析使用NMEA-0183标准库,支持GGA、RMC等多种语句解析。
数据采集采用多通道ADC扫描模式,同时读取烟雾传感器和温度传感器的模拟输出。为提高效率,使用DMA传输ADC转换结果,配合定时器触发采样(100ms间隔)。当检测到烟雾浓度超过阈值(65%LEL)时,立即激活热释电传感器进行协同检测。
NB-IoT通信采用"发送-确认"机制,数据包包含16位CRC校验。当网络异常时,系统自动缓存最近3条报警记录,待信号恢复后重传。为节省功耗,模块平时处于PSM模式,每2小时唤醒一次进行网络注册状态检查。
报警逻辑实现有限状态机(FSM),包含以下状态:待机、预报警、确认报警、持续报警、消警。状态转换条件包括传感器输入、定时器超时和平台指令等。WS2812B灯带通过PWM+DMA方式驱动,可实现256级亮度调节和多种动态效果。
7. 使用的模块的技术详情介绍
(1)STM32F103RCT6:基于ARM Cortex-M3内核,具有3个USART(支持DMA)、2个SPI接口、3个12位ADC(1μs转换时间)。本项目使用USART1连接NB-IoT模块(115200bps),USART3连接GPS模块(9600bps),ADC1_CH12采集烟雾传感器信号。
(2)MS1100烟雾传感器:采用光电散射原理,输出0-5V模拟信号对应0-100%LEL浓度。关键参数:响应时间<10s,恢复时间<30s,工作温度-10℃~50℃,需定期清洁光学腔体以防误报。
(3)U-Blox NEO-6M:GPS接收灵敏度-161dBm,支持50通道卫星搜索,输出频率1Hz。通过VCC_RF引脚可控制模块电源,冷启动时电流消耗45mA,跟踪状态下仅25mA。使用TIM4捕获1PPS信号进行时间同步。
(4)BC35 NB-IoT模块:支持3GPP Release 14标准,内嵌UDP/TCP/CoAP协议栈。工作频段:B5(850MHz)/B8(900MHz),最大发射功率23dBm。AT指令集扩展了+QMTRECV等专用命令,便于接收平台下发的控制指令。
(5)TP4056充电管理:线性充电IC,支持4.2V锂电池恒流/恒压充电。充电电流可通过PROG引脚电阻调节(本项目设为500mA),内置thermal regulation功能防止过热。STAT引脚输出充电状态指示,连接至STM32的PC13引脚实现充电监控。
8. 预期成果
(1)完成具备精确定位功能的智能烟雾报警终端原型机,通过GB20517-2006《独立式感烟火灾探测报警器》标准测试。
(2)实现平均定位精度<5米(开阔环境),报警信息上传延迟<10秒(含GPS定位时间),系统待机功耗<0.8mA。
(3)开发配套消防监控平台接口,支持HTTP RESTful API,可接收并解析设备上报的JSON数据包,在电子地图标注报警位置。
(4)形成完整的技术文档,包括硬件原理图、PCB设计文件、嵌入式软件源码(含通信协议栈)、平台对接协议说明书等。
(5)申请1-2项实用新型专利,如"一种基于多传感器融合的智能火灾报警装置"(已进行专利检索,具备新颖性)。
9. 总结
本设计通过光电烟雾传感与红外热释电的双重检测机制,结合NB-IoT远程通信和GPS精确定位,构建了一套高可靠性的智能火灾预警系统。相比传统报警器,主要创新点体现在:①采用传感器联动验证降低误报率;②集成位置服务便于快速响应;③优化的电源管理延长续航时间。
系统硬件设计注重实用性和可靠性,选用工业级元器件并通过EMC测试。软件算法针对消防场景特点优化,特别是温度补偿模块有效解决了冬季供暖导致的误报问题。实际部署时,建议安装高度距顶棚0.3-0.5米,避开空调出风口等强气流位置。
未来可扩展方向包括:增加LoRa自组网实现无网络覆盖区域的报警传输;集成气压传感器检测楼层高度;开发手机APP实现报警信息推送等。本项目对提升建筑消防安全水平具有积极意义,特别适用于学校、养老院、古建筑等需要重点防护的场所。
主程序代码(main.c)
#include "stm32f10x.h"
#include "adc.h"
#include "uart.h"
#include "gpio.h"
#include "timer.h"
#include "delay.h"
#include "oled.h"
#include "nbiot.h"
#include "gps.h"
#include "smoke_sensor.h"
#include "pir_sensor.h"
#include "alarm.h"
#include "json.h"
// 系统状态定义
typedef enum {
SYS_NORMAL, // 正常状态
SMSK_WARNING, // 烟雾预警
SMSK_ALARM, // 烟雾报警
PIR_TRIGGERED // 人体触发
} SystemState;
// 全局变量
volatile SystemState sysState = SYS_NORMAL;
RTC_TimeTypeDef currentTime;
RTC_DateTypeDef currentDate;
GPS_Data gpsData;
uint16_t smokeLevel = 0;
uint8_t pirStatus = 0;
// 函数声明
void System_Init(void);
void State_Machine(void);
void Power_Management(void);
void Send_Alarm_Info(void);
int main(void)
{
// 系统初始化
System_Init();
// 显示启动信息
OLED_ShowString(0, 0, "Smoke Alarm System", 16);
OLED_ShowString(0, 2, "Ver 1.0", 16);
OLED_ShowString(0, 4, "Initializing...", 16);
Delay_ms(1000);
OLED_Clear();
// 主循环
while(1)
{
// 状态机处理
State_Machine();
// 电源管理
Power_Management();
// 显示更新
OLED_Refresh();
// 低功耗延时
Delay_ms(100);
}
}
// 系统初始化
void System_Init(void)
{
// 硬件初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
RCC_Configuration();
// 外设初始化
ADC1_Init(); // ADC初始化(烟雾传感器)
USART1_Init(115200); // NB-IoT串口
USART2_Init(9600); // GPS串口
GPIO_Configuration(); // GPIO初始化
TIM3_Init(); // 定时器初始化(用于PWM等)
OLED_Init(); // OLED初始化
RTC_Init(); // RTC初始化
// 模块初始化
NB_IoT_Init(); // NB-IoT模块初始化
GPS_Init(); // GPS模块初始化
Alarm_Init(); // 报警模块初始化
// 启用中断
Enable_Interrupts();
}
// 状态机处理
void State_Machine(void)
{
static uint32_t lastCheckTime = 0;
uint32_t currentTime = Get_System_Tick();
// 每500ms更新一次传感器数据
if(currentTime - lastCheckTime >= 500)
{
lastCheckTime = currentTime;
// 读取传感器数据
smokeLevel = Get_Smoke_Level();
pirStatus = Get_PIR_Status();
// 获取GPS数据
GPS_Update(&gpsData);
// 状态转换逻辑
switch(sysState)
{
case SYS_NORMAL:
if(smokeLevel > WARNING_THRESHOLD && smokeLevel <= ALARM_THRESHOLD)
{
sysState = SMSK_WARNING;
Set_Alarm_LED(YELLOW);
}
else if(smokeLevel > ALARM_THRESHOLD)
{
sysState = SMSK_ALARM;
Set_Alarm_LED(RED);
Trigger_Buzzer(ALARM_MODE);
Send_Alarm_Info();
}
break;
case SMSK_WARNING:
if(smokeLevel <= WARNING_THRESHOLD)
{
sysState = SYS_NORMAL;
Set_Alarm_LED(GREEN);
}
else if(smokeLevel > ALARM_THRESHOLD)
{
sysState = SMSK_ALARM;
Set_Alarm_LED(RED);
Trigger_Buzzer(ALARM_MODE);
Send_Alarm_Info();
}
break;
case SMSK_ALARM:
if(smokeLevel < WARNING_THRESHOLD)
{
sysState = SYS_NORMAL;
Set_Alarm_LED(GREEN);
Stop_Buzzer();
}
else if(smokeLevel <= ALARM_THRESHOLD)
{
sysState = SMSK_WARNING;
Set_Alarm_LED(YELLOW);
Stop_Buzzer();
}
break;
case PIR_TRIGGERED:
// 人体触发处理逻辑
break;
}
// OLED显示更新
Update_Display();
}
}
// 发送报警信息
void Send_Alarm_Info(void)
{
char jsonBuffer[256];
// 获取当前时间
RTC_GetTime(RTC_Format_BIN, ¤tTime);
RTC_GetDate(RTC_Format_BIN, ¤tDate);
// 构造JSON数据
snprintf(jsonBuffer, sizeof(jsonBuffer),
"{\"deviceID\":\"%s\","
"\"time\":\"%02d-%02d-%02d %02d:%02d:%02d\","
"\"smokeLevel\":%d,"
"\"location\":{\"lat\":%.6f,\"lng\":%.6f},"
"\"status\":\"%s\"}",
DEVICE_ID,
currentDate.RTC_Year, currentDate.RTC_Month, currentDate.RTC_Date,
currentTime.RTC_Hours, currentTime.RTC_Minutes, currentTime.RTC_Seconds,
smokeLevel,
gpsData.latitude, gpsData.longitude,
(sysState == SMSK_ALARM) ? "ALARM" : "WARNING");
// 通过NB-IoT发送数据
NB_IoT_Send(jsonBuffer);
}
// 电源管理
void Power_Management(void)
{
static uint32_t lastPowerCheck = 0;
uint32_t currentTime = Get_System_Tick();
// 每10秒检查一次电源状态
if(currentTime - lastPowerCheck >= 10000)
{
lastPowerCheck = currentTime;
// 检测电池电量(假设通过ADC检测)
uint16_t batteryLevel = Get_Battery_Level();
// 低电量处理
if(batteryLevel < LOW_BATTERY_THRESHOLD)
{
Set_Alarm_LED(BLUE); // 蓝色表示低电量
// 可以发送低电量警告等信息
}
}
// 根据系统状态调整功耗
if(sysState == SYS_NORMAL)
{
// 正常状态下可以进入低功耗模式
Enter_Low_Power_Mode();
}
}
// 更新显示
void Update_Display(void)
{
char displayBuffer[20];
// 第一行: 状态指示
switch(sysState)
{
case SYS_NORMAL: OLED_ShowString(0, 0, "Status: Normal ", 16); break;
case SMSK_WARNING: OLED_ShowString(0, 0, "Status: Warning", 16); break;
case SMSK_ALARM: OLED_ShowString(0, 0, "Status: ALARM! ", 16); break;
case PIR_TRIGGERED: OLED_ShowString(0, 0, "Status: Trigger", 16); break;
}
// 第二行: 烟雾浓度
snprintf(displayBuffer, sizeof(displayBuffer), "Smoke: %4d", smokeLevel);
OLED_ShowString(0, 2, displayBuffer, 16);
// 第三行: GPS状态
if(gpsData.fix)
{
snprintf(displayBuffer, sizeof(displayBuffer), "Lat:%.4f", gpsData.latitude);
OLED_ShowString(0, 4, displayBuffer, 16);
snprintf(displayBuffer, sizeof(displayBuffer), "Lng:%.4f", gpsData.longitude);
OLED_ShowString(0, 6, displayBuffer, 16);
}
else
{
OLED_ShowString(0, 4, "GPS: No Fix ", 16);
}
}
// 中断服务例程(示例)
void USART2_IRQHandler(void)
{
// GPS数据接收处理
GPS_UART_IRQHandler();
}
// 其他必要的中断服务例程...
代码说明
-
系统初始化:
- 完成所有硬件外设和功能模块的初始化
- 设置合适的中断优先级
-
状态机设计:
- 定义了4种系统状态:正常、烟雾预警、烟雾报警和人体触发
- 根据传感器数据在状态间转换
-
数据处理:
- 烟雾传感器数据通过ADC采集并滤波
- GPS数据通过DMA+空闲中断高效接收
- 采用JSON格式封装报警信息
-
电源管理:
- 定期检测电池电量
- 在空闲时进入低功耗模式
-
抗误报设计:
- 设置多级报警阈值
- 需要持续检测到报警条件才触发报警
-
显示界面:
- OLED显示系统状态、烟雾浓度和位置信息
- 点赞
- 收藏
- 关注作者
评论(0)