1 基于单片机的多传感器智能云梯逃生控制器设计
点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081423
1.1 设计背景与总体目标
-
在家庭、宿舍、工厂及小型商业场景中,火灾、燃气泄漏、一氧化碳中毒等事故具有突发性强、扩散快、逃生窗口短等特点。当环境中出现可燃气体、酒精蒸汽、CO(一氧化碳)以及温度异常升高时,人员往往需要在极短时间内做出撤离决策。传统报警器只具备提示作用,但无法直接提供"逃生辅助装置",特别是高层或窗外逃生条件受限时,单纯报警并不能显著提升逃生成功率。
-
因此,本设计提出一种"多传感器智能云梯逃生控制器",它不仅能进行多种危险因素的实时监测和阈值报警,还能在超过阈值后自动展开云梯(由步进电机驱动),提供快速逃生通道,并同时启动声光报警装置提醒人员撤离。
-
本系统以单片机为核心控制单元,通过 MQ-3、MQ-9、DHT11 等模块构建多源环境感知网络,配合按键阈值设定与显示屏实时信息展示,实现"监测---判断---响应---执行---提示"的完整闭环控制。设计目标如下:
- 实现温度、湿度、酒精气体与 CO/可燃气体浓度的实时采集与显示。
- 实现用户可调报警阈值,适配不同环境与使用需求。
- 实现超阈值自动展开云梯,并触发声光报警。
- 系统结构清晰、模块化设计,便于维护、扩展与二次开发。
1.2 系统总体功能说明
-
本系统功能可分为四大类:传感器监测、自动响应与报警、按键设置、数据展示。其工作流程如下:
-
单片机周期性采集 MQ-3、MQ-9 的模拟电压值(反映气体浓度趋势)以及 DHT11 的数字温湿度值。
-
将采集数据进行滤波与转换(例如 ADC 值转为相对浓度百分比或阈值等级)。
-
与用户设定的报警阈值进行比较。
-
若任意指标超过阈值,系统进入"危险状态",自动执行:
- 步进电机驱动云梯展开;
- 声光报警输出;
- 显示屏提示危险原因与超限值。
-
若所有指标恢复正常,可设置"自动复位"或"手动复位"(本设计中可采用自动解除报警,但电机复位需谨慎,通常需要人工确认)。
-
-
关键特性:
- 多传感器冗余:酒精气体、CO/可燃气体、温湿度共同参与判断,可降低单一传感器误报率。
- 阈值可调:四按键交互,支持逐项设置温度、湿度、气体报警阈值,并保存参数(可扩展 EEPROM 保存)。
- 自动执行机构:步进电机具备定位精确、扭矩稳定优势,适合用于云梯的展开控制。
- 人机界面直观:显示屏实时显示"当前值 + 设定阈值 + 状态信息",降低使用门槛。
2 系统电路设计
2.1 电路设计总体结构
-
系统电路分为以下模块:
-
单片机最小系统模块(核心控制)
-
传感器采集模块
- MQ-3 酒精气体传感器模块
- MQ-9 CO/可燃气体传感器模块
- DHT11 温湿度传感器模块
-
按键输入模块(四按键)
-
显示模块(LCD/OLED)
-
步进电机驱动模块
-
声光报警模块(蜂鸣器 + LED/警示灯)
-
电源模块(稳压与隔离)
-
-
设计思想:以单片机为核心控制器,外设采用模块化连接方式,各模块之间以标准接口(GPIO、ADC、I2C/SPI、PWM/IO)实现通信与控制。这样便于调试与后期扩展,例如增加烟雾传感器、火焰传感器或无线通信模块等。
2.2 单片机最小系统模块
-
单片机选择:可选用 51 系列(如 STC89C52)、AVR(如 ATmega328P)或 STM32(如 STM32F103)。本设计以"具备 ADC 采集能力且资源足够"为优先,若使用 51 系列则需外接 ADC 芯片(如 ADC0832/ADC0809);若使用 STM32/AVR 则可直接使用片上 ADC。为简化系统,本设计建议使用 STM32 或 AVR。
-
最小系统电路关键要点:
- 时钟电路:外部晶振或内部 RC,保证系统稳定运行。
- 复位电路:上电复位与按键复位,避免上电后状态不确定。
- 下载接口:预留 SWD(STM32)或 ISP(AVR/51)接口,用于烧录与调试。
- 端口规划:提前规划 ADC 通道、按键 GPIO、显示接口、步进驱动 IO、蜂鸣器 IO 等,避免后期冲突。
-
电气注意事项:
- MCU 供电建议 3.3V 或 5V(根据芯片与模块决定),并在电源引脚附近放置去耦电容(0.1uF + 10uF)。
- 传感器模拟信号线尽量短,并与电机电源线隔离,减少干扰。
- 步进电机驱动电流大,应与逻辑电源分区供电,避免电压跌落导致 MCU 复位。
2.3 MQ-3 酒精气体传感器模块
-
MQ-3 属于半导体气敏传感器,内部含加热丝与气敏电阻,输出通常为模拟电压(AO)和数字比较输出(DO,部分模块带 LM393 比较器)。
-
在本系统中建议使用 AO 接入 MCU 的 ADC 通道,以实现连续浓度趋势判断与可调阈值报警。
-
电路设计要点:
- MQ-3 工作需要加热,模块供电通常为 5V,电流较大(约 150mA 级别,视模块而定),需要保证电源容量。
- AO 输出是分压结果,通常在 0~5V 范围。若 MCU 采样电压为 3.3V,应通过分压或运放限幅使其进入 ADC 允许范围。
- 为减少波动,可在 AO 端加入 RC 滤波(如 0.1uF 与适当电阻),并在软件做滑动平均。
-
使用注意:
- MQ 系列需要预热时间,初始几分钟数据不稳定,应在程序中加入"预热计时"与提示。
- 传感器受温湿度影响较大,阈值需允许用户调整。
2.4 MQ-9 一氧化碳/可燃气体传感器模块
-
MQ-9 可检测 CO 与可燃气体(如 LPG),同样输出模拟电压 AO,部分模块带 DO。
-
模块电路要点:
- 供电与加热要求同 MQ-3,电源必须稳定。
- 输出电压范围与 MCU ADC 兼容性处理同 MQ-3。
- 建议使用独立 ADC 通道采样 MQ-9,避免与 MQ-3 共用通道导致采样误差。
-
抗干扰设计:
- 模拟地与数字地可采用单点连接方式,防止电机驱动噪声进入 ADC。
- 走线尽量远离步进电机驱动器与电源开关节点。
-
阈值策略:
- MQ-9 输出对 CO 和可燃气体均敏感,实际应用中可将其视为"可燃/有毒气体综合指标"。
- 为降低误报,可结合温度异常一起判断,例如"气体超标且温度升高"进入高危状态。
2.5 DHT11 温湿度传感器模块
-
DHT11 为单总线数字温湿度传感器,输出为数字信号,通信时序固定。
-
电路设计要点:
- DHT11 供电一般为 3.3V~5V,数据引脚需要上拉电阻(通常 4.7kΩ~10kΩ)。
- 数据线长度不宜过长,避免信号畸变;若必须延长,可降低通信频率并增强上拉能力。
-
功能定位:
- 温度监测可辅助火灾早期判断。
- 湿度信息可用于环境显示及传感器补偿(虽然 DHT11 精度一般,但足够用于趋势判断)。
-
可靠性:
- DHT11 读取失败较常见,程序需做超时处理与重试机制,避免卡死。
2.6 按键输入模块(四按键)
-
本系统设置四个按键,用于阈值设置与模式切换。可定义如下:
- KEY1:模式/项目切换(选择温度阈值、湿度阈值、MQ-3 阈值、MQ-9 阈值)
- KEY2:数值增加
- KEY3:数值减少
- KEY4:确认/保存/退出设置
-
电路设计方式:
- 独立按键接入 GPIO,采用上拉输入模式(或外部上拉电阻),按下接地。
- 每个按键可并联小电容(如 0.01uF)用于硬件消抖,但更常见是仅软件消抖。
-
软件设计配合:
- 采用定时扫描或中断触发。
- 必须进行消抖处理(如 10~20ms)。
- 支持长按连续加减,提高设置效率。
2.7 显示模块(LCD/OLED)
-
显示屏用于实时显示:
- 当前温度、湿度
- MQ-3 浓度值(可显示 ADC 值或换算百分比)
- MQ-9 浓度值(同上)
- 用户设定阈值
- 系统状态(安全/预警/危险、云梯展开中、报警中等)
-
模块选择:
- 1602/2004 LCD:成本低,字符显示直观,但占用 IO 多(可用 I2C 扩展板降低 IO)。
- 0.96 寸 OLED(I2C):显示效果好、占用引脚少,可显示更多信息与图标。
-
电路设计要点:
- I2C 模式需上拉电阻(部分模块自带)。
- OLED 供电一般 3.3V~5V,注意与 MCU 电平匹配。
- 显示更新频率不宜过高,避免闪烁与占用 CPU。
2.8 步进电机驱动模块
-
云梯展开机构需要可靠驱动力与可控定位,步进电机是较合适的执行器。
-
典型方案:
- 28BYJ-48 步进电机 + ULN2003 驱动板:成本低、控制简单,但扭矩有限,适合小型模型或轻载云梯演示。
- NEMA17 步进电机 + A4988/DRV8825:扭矩大,适合实际工程驱动。
-
电路设计要点:
- 电机供电需独立电源(如 12V),驱动模块与 MCU 共地。
- 驱动模块附近加大电容(如 100uF~470uF),吸收电流波动。
- 若使用 A4988/DRV8825,需设置电流限流电位器,防止过流烧毁电机或驱动器。
-
位置控制策略:
- 采用固定步数展开云梯(例如展开 3000 步),并在显示屏提示"展开完成"。
- 可扩展限位开关,实现"到位停止"与"回零复位",提高安全性。
-
可靠性考虑:
- 云梯属于安全相关装置,电机控制需避免误动作;因此报警触发逻辑需要稳定,最好加入"持续超限判定"或"双条件判定"。
2.9 声光报警模块
-
声光报警用于强化危险提示,特别是夜间或人员注意力分散时。
-
模块组成:
- 有源蜂鸣器:MCU 输出高电平即可响,驱动简单。
- LED 闪烁灯或警示灯:可通过 GPIO 或三极管驱动。
-
电路设计要点:
- 蜂鸣器电流若超过 GPIO 驱动能力,应使用 NPN 三极管或 MOSFET 做开关驱动,并加反向保护(若为感性负载)。
- LED 若为大功率警示灯,同样需要三极管/MOSFET 驱动,并串联限流电阻。
-
报警方式:
- 蜂鸣器按固定频率间歇鸣叫。
- LED 按 1Hz 或 2Hz 闪烁。
- 进入危险状态后可持续报警,直到用户确认或环境恢复正常。
2.10 电源模块设计
-
系统电源是稳定性的基础。建议采用如下供电架构:
- MCU 与显示模块:3.3V 或 5V(根据具体器件)
- MQ 传感器:通常 5V
- 步进电机:5V(28BYJ-48)或 12V/24V(NEMA17)
-
稳压方案:
- 若系统主电源为 12V,可用降压模块(Buck)输出 5V,再用 LDO 输出 3.3V,保证噪声更低。
- 步进电机电源建议单独从主电源分支供电,并增加滤波电容与 TVS 保护(可选)。
-
EMC 与安全:
- 电机驱动噪声可能导致传感器读数抖动甚至 MCU 复位,因此应尽量让"强电部分"和"弱电采集部分"分区布局。
- 所有模块必须共地,但走线建议采用星形连接,减少地线电流互相干扰。
3 程序设计
3.1 软件总体结构与任务划分
-
软件采用模块化结构,典型可分为:
-
系统初始化模块
-
传感器采集模块
- MQ-3 采集与处理
- MQ-9 采集与处理
- DHT11 采集与处理
-
按键扫描与阈值设置模块
-
显示刷新模块
-
报警判断与状态机模块
-
步进电机控制模块
-
声光报警控制模块
-
参数存储模块(可扩展 EEPROM/Flash 保存)
-
-
主循环模式建议:
- 使用定时器中断提供系统节拍(如 1ms 或 10ms tick)。
- 主循环中按任务周期执行采集、按键、显示与控制。
- 步进电机可使用状态机驱动,避免阻塞主循环。
-
状态机定义示例:
- SAFE:安全状态
- PREHEAT:传感器预热状态
- WARNING:预警状态(轻度超限或持续短时间超限)
- DANGER:危险状态(持续超限,触发云梯展开与报警)
- LADDER_DEPLOY:云梯展开中
- ALARMING:报警持续中
-
判定策略建议:
- 避免瞬时误报:连续 N 次采样超限才进入危险状态。
- 支持滞回:恢复正常需低于阈值一定比例(如 90%)持续一段时间,避免频繁跳变。
3.2 传感器采集模块设计
3.2.1 MQ-3 采集与滤波模块
-
MQ-3 输出为模拟量,程序步骤:
- 读取 ADC 值 raw_mq3
- 对 raw_mq3 做滑动平均或指数滤波得到 mq3_filtered
- 将过滤值映射为"相对浓度值"(例如 0~100%)
-
关键点:
- MQ-3 易受环境影响,软件滤波能显著降低抖动。
- 传感器预热阶段应提示"数据不稳定",并禁止触发云梯展开,以防误动作。
3.2.2 MQ-9 采集与滤波模块
-
逻辑与 MQ-3 类似:ADC 读取、滤波、映射。
-
可增加"危险等级"判断:
- 轻度超限:进入预警,仅声光提示或屏幕闪烁。
- 严重超限:直接进入危险,触发云梯展开。
3.2.3 DHT11 采集与异常处理模块
-
DHT11 读取需要严格时序,程序需:
- 发送起始信号
- 读取 40bit 数据
- 校验和判断
-
常见问题:
- 读取失败返回错误码,主程序应保留上一次有效值,并提示"读取失败"。
- DHT11 采样周期不宜过快,建议 1~2 秒读一次。
3.3 按键扫描与阈值设置模块
3.3.1 按键消抖与扫描策略
-
扫描方法:
- 10ms 扫描一次按键状态
- 若检测到按下,延时/计数确认稳定后触发事件
-
事件类型:
- 单击:切换项目/加减数值/确认
- 长按:快速连续加减
-
防误触措施:
- 长按触发前需保持按下超过 500ms
- 长按连续加减间隔可设为 100ms
3.3.2 阈值数据结构与保存机制
-
典型阈值包括:
- 温度报警阈值 temp_th
- 湿度报警阈值 humi_th(可选,用于潮湿异常提示)
- MQ-3 报警阈值 mq3_th
- MQ-9 报警阈值 mq9_th
-
保存机制:
- 简单方案:仅 RAM 保存,掉电恢复默认值。
- 完整方案:在用户按确认后写入 EEPROM/Flash,掉电保持。
3.4 显示刷新模块
3.4.1 显示内容布局建议
-
页面 1:实时数据
- 温度、湿度
- MQ-3、MQ-9 浓度
-
页面 2:阈值设定值
- temp_th、humi_th、mq3_th、mq9_th
-
页面 3:系统状态
- SAFE / WARNING / DANGER
- 云梯状态:未展开/展开中/已展开
-
通过按键 KEY1 可切换页面,或在危险状态自动切到状态页。
3.4.2 显示刷新频率
- 建议 200ms~500ms 刷新一次。
- 传感器读取频率与显示刷新分离,避免卡顿。
3.5 报警判断与控制逻辑模块
3.5.1 多条件报警判定
-
报警条件可设为任意一项超限即触发:
- 温度 > temp_th
- 湿度 > humi_th(可选)
- MQ-3 > mq3_th
- MQ-9 > mq9_th
-
为降低误报可采用"持续超限判定":
- 连续 5 次采样超限才判定为危险(采样周期 200ms 则约 1 秒确认)。
- 若只是瞬时尖峰,则忽略。
3.5.2 状态机控制
- SAFE:正常监测与显示
- WARNING:仅声光提示(可选)
- DANGER:触发云梯展开 + 声光报警
- LADDER_DEPLOY:展开过程中持续报警并显示进度
- ALARMING:展开完成后持续报警,直到用户确认或恢复正常并手动复位
3.6 步进电机控制模块
3.6.1 电机展开动作逻辑
-
系统进入危险状态后,立即执行:
- 设置目标步数 target_steps
- 按固定频率输出相序(或 STEP/DIR 脉冲)
- 达到目标步数后停止
-
为保证主循环不阻塞,建议使用定时器或状态机输出步进序列。
3.6.2 安全与保护
-
软保护:
- 展开过程中检测电源电压(可扩展)或电机过热(可扩展)
-
硬保护(扩展建议):
- 限位开关:防止过度展开
- 急停按键:人工强制停止电机动作
3.7 声光报警控制模块
-
声光报警可采用定时闪烁与鸣叫:
- 100ms 切换蜂鸣器输出实现间歇鸣叫
- 250ms 切换 LED 实现闪烁
-
设计要点:
- 与状态机绑定:SAFE 不报警,DANGER 必报警,WARNING 可选。
- 报警优先级高于显示刷新与阈值设置。危险状态下可禁止进入设置界面,避免误操作。
4 程序代码示例(模块化示意)
4.1 全局参数与数据结构
c
#include <stdint.h>
#include <stdbool.h>
/* ===========================
阈值参数(可扩展EEPROM保存)
=========================== */
typedef struct {
uint8_t temp_th; // 温度阈值(°C)
uint8_t humi_th; // 湿度阈值(%)
uint16_t mq3_th; // MQ-3阈值(ADC或映射值)
uint16_t mq9_th; // MQ-9阈值(ADC或映射值)
} Threshold_t;
static Threshold_t g_th = {
.temp_th = 55,
.humi_th = 85,
.mq3_th = 2200,
.mq9_th = 2400
};
/* ===========================
实时传感器数据
=========================== */
typedef struct {
uint8_t temperature;
uint8_t humidity;
uint16_t mq3_raw;
uint16_t mq9_raw;
uint16_t mq3_filt;
uint16_t mq9_filt;
} Sensor_t;
static Sensor_t g_sensor;
/* ===========================
系统状态机
=========================== */
typedef enum {
SYS_PREHEAT = 0,
SYS_SAFE,
SYS_WARNING,
SYS_DANGER,
SYS_LADDER_DEPLOY,
SYS_ALARMING
} SysState_t;
static SysState_t g_state = SYS_PREHEAT;
/* 计数器,用于持续超限判定 */
static uint8_t g_over_cnt = 0;
static uint32_t g_ms_tick = 0; // 由定时器中断累加
4.2 MQ-3 / MQ-9 采集与滤波模块
c
/* 读取ADC函数:根据MCU平台实现 */
extern uint16_t ADC_Read(uint8_t channel);
/* 简单滑动平均滤波:N=8 */
static uint16_t moving_avg_u16(uint16_t *buf, uint8_t n, uint16_t new_val)
{
static uint32_t sum = 0;
static uint8_t idx = 0;
sum -= buf[idx];
buf[idx] = new_val;
sum += buf[idx];
idx = (idx + 1) % n;
return (uint16_t)(sum / n);
}
void MQ_SampleTask(void)
{
static uint16_t mq3_buf[8] = {0};
static uint16_t mq9_buf[8] = {0};
g_sensor.mq3_raw = ADC_Read(0); // 假设通道0为MQ-3
g_sensor.mq9_raw = ADC_Read(1); // 假设通道1为MQ-9
g_sensor.mq3_filt = moving_avg_u16(mq3_buf, 8, g_sensor.mq3_raw);
g_sensor.mq9_filt = moving_avg_u16(mq9_buf, 8, g_sensor.mq9_raw);
}
4.3 DHT11 读取模块(示意)
c
/* 下面函数需要根据平台实现:GPIO方向控制、延时us级等 */
extern void DHT11_SetOutput(void);
extern void DHT11_SetInput(void);
extern void DHT11_WritePin(uint8_t val);
extern uint8_t DHT11_ReadPin(void);
extern void DelayUs(uint32_t us);
extern void DelayMs(uint32_t ms);
static bool DHT11_ReadData(uint8_t *temp, uint8_t *humi)
{
uint8_t data[5] = {0};
/* 起始信号 */
DHT11_SetOutput();
DHT11_WritePin(0);
DelayMs(20);
DHT11_WritePin(1);
DelayUs(30);
DHT11_SetInput();
/* 等待响应(省略完整时序细节,实际工程需严格实现) */
// ...读取40位数据到data[]
// data[0]=湿度整数, data[2]=温度整数, data[4]=校验
if ((uint8_t)(data[0] + data[1] + data[2] + data[3]) != data[4]) {
return false;
}
*humi = data[0];
*temp = data[2];
return true;
}
void DHT11_SampleTask(void)
{
uint8_t t, h;
if (DHT11_ReadData(&t, &h)) {
g_sensor.temperature = t;
g_sensor.humidity = h;
}
/* 若失败则保持上一次有效值,避免显示跳变 */
}
4.4 按键扫描与阈值设置模块(示意)
c
extern uint8_t KEY_Read(uint8_t key_id); // 读取某个按键状态:1按下0松开
typedef enum {
SET_ITEM_TEMP = 0,
SET_ITEM_HUMI,
SET_ITEM_MQ3,
SET_ITEM_MQ9
} SetItem_t;
static SetItem_t g_set_item = SET_ITEM_TEMP;
static bool g_in_setting = false;
static void Threshold_Inc(void)
{
switch (g_set_item) {
case SET_ITEM_TEMP: if (g_th.temp_th < 99) g_th.temp_th++; break;
case SET_ITEM_HUMI: if (g_th.humi_th < 99) g_th.humi_th++; break;
case SET_ITEM_MQ3: if (g_th.mq3_th < 4095) g_th.mq3_th += 10; break;
case SET_ITEM_MQ9: if (g_th.mq9_th < 4095) g_th.mq9_th += 10; break;
}
}
static void Threshold_Dec(void)
{
switch (g_set_item) {
case SET_ITEM_TEMP: if (g_th.temp_th > 0) g_th.temp_th--; break;
case SET_ITEM_HUMI: if (g_th.humi_th > 0) g_th.humi_th--; break;
case SET_ITEM_MQ3: if (g_th.mq3_th > 10) g_th.mq3_th -= 10; break;
case SET_ITEM_MQ9: if (g_th.mq9_th > 10) g_th.mq9_th -= 10; break;
}
}
void Key_ScanTask(void)
{
static uint8_t last[4] = {0};
for (uint8_t i = 0; i < 4; i++) {
uint8_t now = KEY_Read(i);
if (now && !last[i]) {
/* 检测到按键按下沿 */
if (g_state >= SYS_DANGER) {
/* 危险状态下可选择禁止设置,避免误操作 */
} else {
if (i == 0) { // KEY1
if (!g_in_setting) g_in_setting = true;
else g_set_item = (SetItem_t)((g_set_item + 1) % 4);
} else if (i == 1) { // KEY2
if (g_in_setting) Threshold_Inc();
} else if (i == 2) { // KEY3
if (g_in_setting) Threshold_Dec();
} else if (i == 3) { // KEY4
g_in_setting = !g_in_setting; // 退出/进入
/* 可扩展保存到EEPROM */
}
}
}
last[i] = now;
}
}
4.5 报警判断与状态机模块
c
static bool IsOverThreshold(void)
{
if (g_sensor.temperature > g_th.temp_th) return true;
if (g_sensor.humidity > g_th.humi_th) return true;
if (g_sensor.mq3_filt > g_th.mq3_th) return true;
if (g_sensor.mq9_filt > g_th.mq9_th) return true;
return false;
}
void StateMachine_Task(void)
{
static uint32_t preheat_start = 0;
switch (g_state) {
case SYS_PREHEAT:
if (preheat_start == 0) preheat_start = g_ms_tick;
if (g_ms_tick - preheat_start > 60000) { // 预热60秒示例
g_state = SYS_SAFE;
}
break;
case SYS_SAFE:
if (IsOverThreshold()) {
g_over_cnt++;
if (g_over_cnt >= 5) { // 连续超限
g_state = SYS_DANGER;
g_over_cnt = 0;
}
} else {
g_over_cnt = 0;
}
break;
case SYS_DANGER:
g_state = SYS_LADDER_DEPLOY;
break;
case SYS_LADDER_DEPLOY:
/* 等待电机展开完成后切换 */
// if (Stepper_IsDone()) g_state = SYS_ALARMING;
break;
case SYS_ALARMING:
/* 可在此等待用户确认或环境恢复 */
break;
default:
g_state = SYS_SAFE;
break;
}
}
4.6 步进电机控制模块(示意)
c
extern void Stepper_StartDeploy(uint32_t steps);
extern bool Stepper_IsDone(void);
void Ladder_ControlTask(void)
{
static bool started = false;
if (g_state == SYS_LADDER_DEPLOY) {
if (!started) {
Stepper_StartDeploy(3000); // 展开3000步示例
started = true;
} else {
if (Stepper_IsDone()) {
g_state = SYS_ALARMING;
}
}
} else {
started = false;
}
}
4.7 声光报警控制模块(示意)
c
extern void BUZZER_Set(uint8_t on);
extern void LED_Set(uint8_t on);
void Alarm_Task(void)
{
static uint32_t t_buzzer = 0;
static uint32_t t_led = 0;
static uint8_t buzzer_on = 0;
static uint8_t led_on = 0;
if (g_state >= SYS_DANGER) {
if (g_ms_tick - t_buzzer >= 100) {
t_buzzer = g_ms_tick;
buzzer_on = !buzzer_on;
BUZZER_Set(buzzer_on);
}
if (g_ms_tick - t_led >= 250) {
t_led = g_ms_tick;
led_on = !led_on;
LED_Set(led_on);
}
} else {
BUZZER_Set(0);
LED_Set(0);
buzzer_on = 0;
led_on = 0;
}
}
4.8 显示模块(示意)
c
extern void OLED_Clear(void);
extern void OLED_Print(uint8_t x, uint8_t y, const char *str);
void Display_Task(void)
{
char line[32];
OLED_Clear();
/* 当前值显示 */
snprintf(line, sizeof(line), "T:%dC H:%d%%", g_sensor.temperature, g_sensor.humidity);
OLED_Print(0, 0, line);
snprintf(line, sizeof(line), "MQ3:%u TH:%u", g_sensor.mq3_filt, g_th.mq3_th);
OLED_Print(0, 1, line);
snprintf(line, sizeof(line), "MQ9:%u TH:%u", g_sensor.mq9_filt, g_th.mq9_th);
OLED_Print(0, 2, line);
/* 状态显示 */
if (g_state == SYS_PREHEAT) OLED_Print(0, 3, "STATE: PREHEAT");
else if (g_state == SYS_SAFE) OLED_Print(0, 3, "STATE: SAFE");
else if (g_state == SYS_DANGER) OLED_Print(0, 3, "STATE: DANGER");
else if (g_state == SYS_LADDER_DEPLOY) OLED_Print(0, 3, "STATE: DEPLOY");
else if (g_state == SYS_ALARMING) OLED_Print(0, 3, "STATE: ALARMING");
}
5 系统综合工作过程说明
5.1 正常监测阶段
-
系统上电后进入预热阶段,提示用户传感器预热中,避免 MQ-3、MQ-9 输出波动造成误报警。
-
预热结束后进入安全状态,定时执行:
- MQ-3、MQ-9 模拟采样与滤波处理
- DHT11 温湿度采样
- 显示刷新当前数据与阈值数据
-
用户可通过按键进入设置模式,调整各项阈值并保存,以适应不同场所环境(如厨房、实验室、车库、宿舍等)。
5.2 超限预警与危险触发阶段
-
当任意监测值超过阈值时,系统并不立即执行展开动作,而是采用"持续超限计数"方式进行确认。
-
若超限持续存在,系统进入危险状态:
- 启动步进电机展开云梯
- 启动蜂鸣器与警示灯
- 显示屏提示当前危险来源(温度超限、气体超限等)
-
该逻辑设计的意义在于:
- 避免瞬时干扰导致误展开
- 确保真正的危险事件触发强制逃生辅助与报警
5.3 云梯展开与报警持续阶段
- 云梯展开过程由步进电机控制模块执行,可采用定步数展开或限位开关到位停止。
- 展开完成后进入持续报警状态,确保人员在紧急情况下能够清晰察觉并迅速撤离。
- 在真实工程中,云梯属于安全关键装置,建议采用"展开后锁定"策略,即展开后不会自动回收,需要人员确认环境安全后手动复位,避免二次风险。
6 设计扩展与可靠性建议
6.1 传感器精度与校准建议
-
MQ-3、MQ-9 传感器输出与真实浓度并非线性关系,且不同模块的电阻、老化、环境温度湿度都会影响输出。
-
若用于教学与演示,可采用 ADC 阈值判断即可;若用于更严谨场景,可增加:
- 标定曲线拟合
- 温湿度补偿
- 多点标定与传感器漂移校正
6.2 安全性与误动作抑制
-
云梯展开属于高风险动作,必须避免误触发。建议增加:
- 双条件触发:气体超限 + 温度超限 或 气体超限持续更长时间
- 手动确认模式:报警后提示用户确认展开(适用于人员在场的环境)
- 机械限位与急停按键:保证任何异常情况下可立即停止动作
-
对于噪声干扰,应在电源与布线上做好隔离,软件层面加入滤波与滞回。
6.3 系统扩展方向
- 无线联网:增加 Wi-Fi/4G/LoRa 模块,将报警信息推送至手机或物业中心,实现远程预警。
- 增加烟雾、火焰传感器:提高火灾识别能力,减少漏报。
- 增加电池备份:停电情况下仍可报警与展开云梯,提升可靠性。
- 增加数据记录:将历史温湿度与气体变化记录到存储器,便于事故追溯与环境分析。
7 总结
- 本设计围绕"多传感器监测 + 自动展开云梯 + 声光报警 + 阈值可调 + 信息显示"构建完整的智能逃生控制器方案。通过 MQ-3、MQ-9 与 DHT11 的组合,系统能够实时感知环境中酒精气体、CO/可燃气体以及温湿度变化,并在超过安全阈值时迅速作出响应,驱动步进电机展开云梯,为人员提供直接逃生通道,同时以声光报警强化提示。
- 在电路设计方面,本系统采用模块化结构,重点解决了传感器模拟采样、电机驱动隔离、电源稳定与抗干扰等问题,使得系统既具备可实现性,也便于扩展。
- 在程序设计方面,本系统采用状态机与任务划分的方法,将采集、显示、按键、判断、执行与报警相互解耦,逻辑清晰、可维护性强,并通过滤波、持续超限判定与预热机制提高系统稳定性。
- 总体而言,该系统既能满足课程设计与演示需求,也具备进一步工程化升级的潜力,适用于智能消防与紧急逃生辅助方向的研究与实践。