基于单片机的多传感器智能云梯逃生控制器设计

1 基于单片机的多传感器智能云梯逃生控制器设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081423

1.1 设计背景与总体目标

  1. 在家庭、宿舍、工厂及小型商业场景中,火灾、燃气泄漏、一氧化碳中毒等事故具有突发性强、扩散快、逃生窗口短等特点。当环境中出现可燃气体、酒精蒸汽、CO(一氧化碳)以及温度异常升高时,人员往往需要在极短时间内做出撤离决策。传统报警器只具备提示作用,但无法直接提供"逃生辅助装置",特别是高层或窗外逃生条件受限时,单纯报警并不能显著提升逃生成功率。

  2. 因此,本设计提出一种"多传感器智能云梯逃生控制器",它不仅能进行多种危险因素的实时监测和阈值报警,还能在超过阈值后自动展开云梯(由步进电机驱动),提供快速逃生通道,并同时启动声光报警装置提醒人员撤离。

  3. 本系统以单片机为核心控制单元,通过 MQ-3、MQ-9、DHT11 等模块构建多源环境感知网络,配合按键阈值设定与显示屏实时信息展示,实现"监测---判断---响应---执行---提示"的完整闭环控制。设计目标如下:

    1. 实现温度、湿度、酒精气体与 CO/可燃气体浓度的实时采集与显示。
    2. 实现用户可调报警阈值,适配不同环境与使用需求。
    3. 实现超阈值自动展开云梯,并触发声光报警。
    4. 系统结构清晰、模块化设计,便于维护、扩展与二次开发。

1.2 系统总体功能说明

  1. 本系统功能可分为四大类:传感器监测、自动响应与报警、按键设置、数据展示。其工作流程如下:

    1. 单片机周期性采集 MQ-3、MQ-9 的模拟电压值(反映气体浓度趋势)以及 DHT11 的数字温湿度值。

    2. 将采集数据进行滤波与转换(例如 ADC 值转为相对浓度百分比或阈值等级)。

    3. 与用户设定的报警阈值进行比较。

    4. 若任意指标超过阈值,系统进入"危险状态",自动执行:

      1. 步进电机驱动云梯展开;
      2. 声光报警输出;
      3. 显示屏提示危险原因与超限值。
    5. 若所有指标恢复正常,可设置"自动复位"或"手动复位"(本设计中可采用自动解除报警,但电机复位需谨慎,通常需要人工确认)。

  2. 关键特性:

    1. 多传感器冗余:酒精气体、CO/可燃气体、温湿度共同参与判断,可降低单一传感器误报率。
    2. 阈值可调:四按键交互,支持逐项设置温度、湿度、气体报警阈值,并保存参数(可扩展 EEPROM 保存)。
    3. 自动执行机构:步进电机具备定位精确、扭矩稳定优势,适合用于云梯的展开控制。
    4. 人机界面直观:显示屏实时显示"当前值 + 设定阈值 + 状态信息",降低使用门槛。

2 系统电路设计

2.1 电路设计总体结构

  1. 系统电路分为以下模块:

    1. 单片机最小系统模块(核心控制)

    2. 传感器采集模块

      1. MQ-3 酒精气体传感器模块
      2. MQ-9 CO/可燃气体传感器模块
      3. DHT11 温湿度传感器模块
    3. 按键输入模块(四按键)

    4. 显示模块(LCD/OLED)

    5. 步进电机驱动模块

    6. 声光报警模块(蜂鸣器 + LED/警示灯)

    7. 电源模块(稳压与隔离)

  2. 设计思想:以单片机为核心控制器,外设采用模块化连接方式,各模块之间以标准接口(GPIO、ADC、I2C/SPI、PWM/IO)实现通信与控制。这样便于调试与后期扩展,例如增加烟雾传感器、火焰传感器或无线通信模块等。


2.2 单片机最小系统模块

  1. 单片机选择:可选用 51 系列(如 STC89C52)、AVR(如 ATmega328P)或 STM32(如 STM32F103)。本设计以"具备 ADC 采集能力且资源足够"为优先,若使用 51 系列则需外接 ADC 芯片(如 ADC0832/ADC0809);若使用 STM32/AVR 则可直接使用片上 ADC。为简化系统,本设计建议使用 STM32 或 AVR。

  2. 最小系统电路关键要点:

    1. 时钟电路:外部晶振或内部 RC,保证系统稳定运行。
    2. 复位电路:上电复位与按键复位,避免上电后状态不确定。
    3. 下载接口:预留 SWD(STM32)或 ISP(AVR/51)接口,用于烧录与调试。
    4. 端口规划:提前规划 ADC 通道、按键 GPIO、显示接口、步进驱动 IO、蜂鸣器 IO 等,避免后期冲突。
  3. 电气注意事项:

    1. MCU 供电建议 3.3V 或 5V(根据芯片与模块决定),并在电源引脚附近放置去耦电容(0.1uF + 10uF)。
    2. 传感器模拟信号线尽量短,并与电机电源线隔离,减少干扰。
    3. 步进电机驱动电流大,应与逻辑电源分区供电,避免电压跌落导致 MCU 复位。

2.3 MQ-3 酒精气体传感器模块

  1. MQ-3 属于半导体气敏传感器,内部含加热丝与气敏电阻,输出通常为模拟电压(AO)和数字比较输出(DO,部分模块带 LM393 比较器)。

  2. 在本系统中建议使用 AO 接入 MCU 的 ADC 通道,以实现连续浓度趋势判断与可调阈值报警。

  3. 电路设计要点:

    1. MQ-3 工作需要加热,模块供电通常为 5V,电流较大(约 150mA 级别,视模块而定),需要保证电源容量。
    2. AO 输出是分压结果,通常在 0~5V 范围。若 MCU 采样电压为 3.3V,应通过分压或运放限幅使其进入 ADC 允许范围。
    3. 为减少波动,可在 AO 端加入 RC 滤波(如 0.1uF 与适当电阻),并在软件做滑动平均。
  4. 使用注意:

    1. MQ 系列需要预热时间,初始几分钟数据不稳定,应在程序中加入"预热计时"与提示。
    2. 传感器受温湿度影响较大,阈值需允许用户调整。

2.4 MQ-9 一氧化碳/可燃气体传感器模块

  1. MQ-9 可检测 CO 与可燃气体(如 LPG),同样输出模拟电压 AO,部分模块带 DO。

  2. 模块电路要点:

    1. 供电与加热要求同 MQ-3,电源必须稳定。
    2. 输出电压范围与 MCU ADC 兼容性处理同 MQ-3。
    3. 建议使用独立 ADC 通道采样 MQ-9,避免与 MQ-3 共用通道导致采样误差。
  3. 抗干扰设计:

    1. 模拟地与数字地可采用单点连接方式,防止电机驱动噪声进入 ADC。
    2. 走线尽量远离步进电机驱动器与电源开关节点。
  4. 阈值策略:

    1. MQ-9 输出对 CO 和可燃气体均敏感,实际应用中可将其视为"可燃/有毒气体综合指标"。
    2. 为降低误报,可结合温度异常一起判断,例如"气体超标且温度升高"进入高危状态。

2.5 DHT11 温湿度传感器模块

  1. DHT11 为单总线数字温湿度传感器,输出为数字信号,通信时序固定。

  2. 电路设计要点:

    1. DHT11 供电一般为 3.3V~5V,数据引脚需要上拉电阻(通常 4.7kΩ~10kΩ)。
    2. 数据线长度不宜过长,避免信号畸变;若必须延长,可降低通信频率并增强上拉能力。
  3. 功能定位:

    1. 温度监测可辅助火灾早期判断。
    2. 湿度信息可用于环境显示及传感器补偿(虽然 DHT11 精度一般,但足够用于趋势判断)。
  4. 可靠性:

    1. DHT11 读取失败较常见,程序需做超时处理与重试机制,避免卡死。

2.6 按键输入模块(四按键)

  1. 本系统设置四个按键,用于阈值设置与模式切换。可定义如下:

    1. KEY1:模式/项目切换(选择温度阈值、湿度阈值、MQ-3 阈值、MQ-9 阈值)
    2. KEY2:数值增加
    3. KEY3:数值减少
    4. KEY4:确认/保存/退出设置
  2. 电路设计方式:

    1. 独立按键接入 GPIO,采用上拉输入模式(或外部上拉电阻),按下接地。
    2. 每个按键可并联小电容(如 0.01uF)用于硬件消抖,但更常见是仅软件消抖。
  3. 软件设计配合:

    1. 采用定时扫描或中断触发。
    2. 必须进行消抖处理(如 10~20ms)。
    3. 支持长按连续加减,提高设置效率。

2.7 显示模块(LCD/OLED)

  1. 显示屏用于实时显示:

    1. 当前温度、湿度
    2. MQ-3 浓度值(可显示 ADC 值或换算百分比)
    3. MQ-9 浓度值(同上)
    4. 用户设定阈值
    5. 系统状态(安全/预警/危险、云梯展开中、报警中等)
  2. 模块选择:

    1. 1602/2004 LCD:成本低,字符显示直观,但占用 IO 多(可用 I2C 扩展板降低 IO)。
    2. 0.96 寸 OLED(I2C):显示效果好、占用引脚少,可显示更多信息与图标。
  3. 电路设计要点:

    1. I2C 模式需上拉电阻(部分模块自带)。
    2. OLED 供电一般 3.3V~5V,注意与 MCU 电平匹配。
    3. 显示更新频率不宜过高,避免闪烁与占用 CPU。

2.8 步进电机驱动模块

  1. 云梯展开机构需要可靠驱动力与可控定位,步进电机是较合适的执行器。

  2. 典型方案:

    1. 28BYJ-48 步进电机 + ULN2003 驱动板:成本低、控制简单,但扭矩有限,适合小型模型或轻载云梯演示。
    2. NEMA17 步进电机 + A4988/DRV8825:扭矩大,适合实际工程驱动。
  3. 电路设计要点:

    1. 电机供电需独立电源(如 12V),驱动模块与 MCU 共地。
    2. 驱动模块附近加大电容(如 100uF~470uF),吸收电流波动。
    3. 若使用 A4988/DRV8825,需设置电流限流电位器,防止过流烧毁电机或驱动器。
  4. 位置控制策略:

    1. 采用固定步数展开云梯(例如展开 3000 步),并在显示屏提示"展开完成"。
    2. 可扩展限位开关,实现"到位停止"与"回零复位",提高安全性。
  5. 可靠性考虑:

    1. 云梯属于安全相关装置,电机控制需避免误动作;因此报警触发逻辑需要稳定,最好加入"持续超限判定"或"双条件判定"。

2.9 声光报警模块

  1. 声光报警用于强化危险提示,特别是夜间或人员注意力分散时。

  2. 模块组成:

    1. 有源蜂鸣器:MCU 输出高电平即可响,驱动简单。
    2. LED 闪烁灯或警示灯:可通过 GPIO 或三极管驱动。
  3. 电路设计要点:

    1. 蜂鸣器电流若超过 GPIO 驱动能力,应使用 NPN 三极管或 MOSFET 做开关驱动,并加反向保护(若为感性负载)。
    2. LED 若为大功率警示灯,同样需要三极管/MOSFET 驱动,并串联限流电阻。
  4. 报警方式:

    1. 蜂鸣器按固定频率间歇鸣叫。
    2. LED 按 1Hz 或 2Hz 闪烁。
    3. 进入危险状态后可持续报警,直到用户确认或环境恢复正常。

2.10 电源模块设计

  1. 系统电源是稳定性的基础。建议采用如下供电架构:

    1. MCU 与显示模块:3.3V 或 5V(根据具体器件)
    2. MQ 传感器:通常 5V
    3. 步进电机:5V(28BYJ-48)或 12V/24V(NEMA17)
  2. 稳压方案:

    1. 若系统主电源为 12V,可用降压模块(Buck)输出 5V,再用 LDO 输出 3.3V,保证噪声更低。
    2. 步进电机电源建议单独从主电源分支供电,并增加滤波电容与 TVS 保护(可选)。
  3. EMC 与安全:

    1. 电机驱动噪声可能导致传感器读数抖动甚至 MCU 复位,因此应尽量让"强电部分"和"弱电采集部分"分区布局。
    2. 所有模块必须共地,但走线建议采用星形连接,减少地线电流互相干扰。

3 程序设计

3.1 软件总体结构与任务划分

  1. 软件采用模块化结构,典型可分为:

    1. 系统初始化模块

    2. 传感器采集模块

      1. MQ-3 采集与处理
      2. MQ-9 采集与处理
      3. DHT11 采集与处理
    3. 按键扫描与阈值设置模块

    4. 显示刷新模块

    5. 报警判断与状态机模块

    6. 步进电机控制模块

    7. 声光报警控制模块

    8. 参数存储模块(可扩展 EEPROM/Flash 保存)

  2. 主循环模式建议:

    1. 使用定时器中断提供系统节拍(如 1ms 或 10ms tick)。
    2. 主循环中按任务周期执行采集、按键、显示与控制。
    3. 步进电机可使用状态机驱动,避免阻塞主循环。
  3. 状态机定义示例:

    1. SAFE:安全状态
    2. PREHEAT:传感器预热状态
    3. WARNING:预警状态(轻度超限或持续短时间超限)
    4. DANGER:危险状态(持续超限,触发云梯展开与报警)
    5. LADDER_DEPLOY:云梯展开中
    6. ALARMING:报警持续中
  4. 判定策略建议:

    1. 避免瞬时误报:连续 N 次采样超限才进入危险状态。
    2. 支持滞回:恢复正常需低于阈值一定比例(如 90%)持续一段时间,避免频繁跳变。

3.2 传感器采集模块设计

3.2.1 MQ-3 采集与滤波模块

  1. MQ-3 输出为模拟量,程序步骤:

    1. 读取 ADC 值 raw_mq3
    2. 对 raw_mq3 做滑动平均或指数滤波得到 mq3_filtered
    3. 将过滤值映射为"相对浓度值"(例如 0~100%)
  2. 关键点:

    1. MQ-3 易受环境影响,软件滤波能显著降低抖动。
    2. 传感器预热阶段应提示"数据不稳定",并禁止触发云梯展开,以防误动作。

3.2.2 MQ-9 采集与滤波模块

  1. 逻辑与 MQ-3 类似:ADC 读取、滤波、映射。

  2. 可增加"危险等级"判断:

    1. 轻度超限:进入预警,仅声光提示或屏幕闪烁。
    2. 严重超限:直接进入危险,触发云梯展开。

3.2.3 DHT11 采集与异常处理模块

  1. DHT11 读取需要严格时序,程序需:

    1. 发送起始信号
    2. 读取 40bit 数据
    3. 校验和判断
  2. 常见问题:

    1. 读取失败返回错误码,主程序应保留上一次有效值,并提示"读取失败"。
    2. DHT11 采样周期不宜过快,建议 1~2 秒读一次。

3.3 按键扫描与阈值设置模块

3.3.1 按键消抖与扫描策略

  1. 扫描方法:

    1. 10ms 扫描一次按键状态
    2. 若检测到按下,延时/计数确认稳定后触发事件
  2. 事件类型:

    1. 单击:切换项目/加减数值/确认
    2. 长按:快速连续加减
  3. 防误触措施:

    1. 长按触发前需保持按下超过 500ms
    2. 长按连续加减间隔可设为 100ms

3.3.2 阈值数据结构与保存机制

  1. 典型阈值包括:

    1. 温度报警阈值 temp_th
    2. 湿度报警阈值 humi_th(可选,用于潮湿异常提示)
    3. MQ-3 报警阈值 mq3_th
    4. MQ-9 报警阈值 mq9_th
  2. 保存机制:

    1. 简单方案:仅 RAM 保存,掉电恢复默认值。
    2. 完整方案:在用户按确认后写入 EEPROM/Flash,掉电保持。

3.4 显示刷新模块

3.4.1 显示内容布局建议

  1. 页面 1:实时数据

    1. 温度、湿度
    2. MQ-3、MQ-9 浓度
  2. 页面 2:阈值设定值

    1. temp_th、humi_th、mq3_th、mq9_th
  3. 页面 3:系统状态

    1. SAFE / WARNING / DANGER
    2. 云梯状态:未展开/展开中/已展开
  4. 通过按键 KEY1 可切换页面,或在危险状态自动切到状态页。

3.4.2 显示刷新频率

  1. 建议 200ms~500ms 刷新一次。
  2. 传感器读取频率与显示刷新分离,避免卡顿。

3.5 报警判断与控制逻辑模块

3.5.1 多条件报警判定

  1. 报警条件可设为任意一项超限即触发:

    1. 温度 > temp_th
    2. 湿度 > humi_th(可选)
    3. MQ-3 > mq3_th
    4. MQ-9 > mq9_th
  2. 为降低误报可采用"持续超限判定":

    1. 连续 5 次采样超限才判定为危险(采样周期 200ms 则约 1 秒确认)。
    2. 若只是瞬时尖峰,则忽略。

3.5.2 状态机控制

  1. SAFE:正常监测与显示
  2. WARNING:仅声光提示(可选)
  3. DANGER:触发云梯展开 + 声光报警
  4. LADDER_DEPLOY:展开过程中持续报警并显示进度
  5. ALARMING:展开完成后持续报警,直到用户确认或恢复正常并手动复位

3.6 步进电机控制模块

3.6.1 电机展开动作逻辑

  1. 系统进入危险状态后,立即执行:

    1. 设置目标步数 target_steps
    2. 按固定频率输出相序(或 STEP/DIR 脉冲)
    3. 达到目标步数后停止
  2. 为保证主循环不阻塞,建议使用定时器或状态机输出步进序列。

3.6.2 安全与保护

  1. 软保护:

    1. 展开过程中检测电源电压(可扩展)或电机过热(可扩展)
  2. 硬保护(扩展建议):

    1. 限位开关:防止过度展开
    2. 急停按键:人工强制停止电机动作

3.7 声光报警控制模块

  1. 声光报警可采用定时闪烁与鸣叫:

    1. 100ms 切换蜂鸣器输出实现间歇鸣叫
    2. 250ms 切换 LED 实现闪烁
  2. 设计要点:

    1. 与状态机绑定:SAFE 不报警,DANGER 必报警,WARNING 可选。
    2. 报警优先级高于显示刷新与阈值设置。危险状态下可禁止进入设置界面,避免误操作。

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 正常监测阶段

  1. 系统上电后进入预热阶段,提示用户传感器预热中,避免 MQ-3、MQ-9 输出波动造成误报警。

  2. 预热结束后进入安全状态,定时执行:

    1. MQ-3、MQ-9 模拟采样与滤波处理
    2. DHT11 温湿度采样
    3. 显示刷新当前数据与阈值数据
  3. 用户可通过按键进入设置模式,调整各项阈值并保存,以适应不同场所环境(如厨房、实验室、车库、宿舍等)。


5.2 超限预警与危险触发阶段

  1. 当任意监测值超过阈值时,系统并不立即执行展开动作,而是采用"持续超限计数"方式进行确认。

  2. 若超限持续存在,系统进入危险状态:

    1. 启动步进电机展开云梯
    2. 启动蜂鸣器与警示灯
    3. 显示屏提示当前危险来源(温度超限、气体超限等)
  3. 该逻辑设计的意义在于:

    1. 避免瞬时干扰导致误展开
    2. 确保真正的危险事件触发强制逃生辅助与报警

5.3 云梯展开与报警持续阶段

  1. 云梯展开过程由步进电机控制模块执行,可采用定步数展开或限位开关到位停止。
  2. 展开完成后进入持续报警状态,确保人员在紧急情况下能够清晰察觉并迅速撤离。
  3. 在真实工程中,云梯属于安全关键装置,建议采用"展开后锁定"策略,即展开后不会自动回收,需要人员确认环境安全后手动复位,避免二次风险。

6 设计扩展与可靠性建议

6.1 传感器精度与校准建议

  1. MQ-3、MQ-9 传感器输出与真实浓度并非线性关系,且不同模块的电阻、老化、环境温度湿度都会影响输出。

  2. 若用于教学与演示,可采用 ADC 阈值判断即可;若用于更严谨场景,可增加:

    1. 标定曲线拟合
    2. 温湿度补偿
    3. 多点标定与传感器漂移校正

6.2 安全性与误动作抑制

  1. 云梯展开属于高风险动作,必须避免误触发。建议增加:

    1. 双条件触发:气体超限 + 温度超限 或 气体超限持续更长时间
    2. 手动确认模式:报警后提示用户确认展开(适用于人员在场的环境)
    3. 机械限位与急停按键:保证任何异常情况下可立即停止动作
  2. 对于噪声干扰,应在电源与布线上做好隔离,软件层面加入滤波与滞回。


6.3 系统扩展方向

  1. 无线联网:增加 Wi-Fi/4G/LoRa 模块,将报警信息推送至手机或物业中心,实现远程预警。
  2. 增加烟雾、火焰传感器:提高火灾识别能力,减少漏报。
  3. 增加电池备份:停电情况下仍可报警与展开云梯,提升可靠性。
  4. 增加数据记录:将历史温湿度与气体变化记录到存储器,便于事故追溯与环境分析。

7 总结

  1. 本设计围绕"多传感器监测 + 自动展开云梯 + 声光报警 + 阈值可调 + 信息显示"构建完整的智能逃生控制器方案。通过 MQ-3、MQ-9 与 DHT11 的组合,系统能够实时感知环境中酒精气体、CO/可燃气体以及温湿度变化,并在超过安全阈值时迅速作出响应,驱动步进电机展开云梯,为人员提供直接逃生通道,同时以声光报警强化提示。
  2. 在电路设计方面,本系统采用模块化结构,重点解决了传感器模拟采样、电机驱动隔离、电源稳定与抗干扰等问题,使得系统既具备可实现性,也便于扩展。
  3. 在程序设计方面,本系统采用状态机与任务划分的方法,将采集、显示、按键、判断、执行与报警相互解耦,逻辑清晰、可维护性强,并通过滤波、持续超限判定与预热机制提高系统稳定性。
  4. 总体而言,该系统既能满足课程设计与演示需求,也具备进一步工程化升级的潜力,适用于智能消防与紧急逃生辅助方向的研究与实践。
相关推荐
小何code6 小时前
STM32入门教程,第10课(上),OLED显示屏
stm32·单片机·嵌入式硬件
来自晴朗的明天6 小时前
高速画板-USB模块的PCB设计5-USB2.0/3.0布局布线要求
单片机·嵌入式硬件·硬件工程
早日退休!!!8 小时前
ARM Cortex-M核 【保存上下文&恢复上下文】
arm开发·单片机·嵌入式硬件
源码获取_wx:Fegn08959 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
来自晴朗的明天9 小时前
差分控多少Ω阻抗
单片机·嵌入式硬件·硬件工程
毕设源码_郑学姐9 小时前
计算机毕业设计springboot基于HTML5的酒店预订管理系统 基于Spring Boot框架的HTML5酒店预订管理平台设计与实现 HTML5与Spring Boot技术驱动的酒店预订管理系统开
spring boot·后端·课程设计
点灯小铭10 小时前
基于单片机的多功能智能婴儿车设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
计算机毕设VX:Fegn089512 小时前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
码农小韩13 小时前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习