基于STM32的光电感烟火灾报警器设计

一、系统概述

基于STM32F103C8T6微控制器 ,采用红外散射型光电感烟传感器 ,实现高灵敏度、低误报 的火灾预警功能。系统符合GB 4715-2024《点型感烟火灾探测器》标准,支持动态阈值调整、污染检测、远程监控 等功能,适用于家庭、办公室、仓库等场景。

二、硬件设计

1. 核心硬件选型

模块 型号/参数 功能
主控 STM32F103C8T6(72MHz,12位ADC) 信号采集、滤波、报警控制
光电传感器 红外散射型(如E3F3-D12) 检测烟雾颗粒(散射光信号)
信号调理 LM358运算放大器 放大传感器输出信号(增益1000)
报警模块 有源蜂鸣器+红色LED 声光报警
显示模块 0.96寸OLED(I2C) 显示烟雾浓度、报警状态
通信模块 HC-05蓝牙模块(UART) 远程数据传输(手机APP)
电源 5V USB供电+锂电池(3.7V) 系统供电(支持断电续航)

2. 电路设计要点

(1)光电传感器接口
  • 传感器输出模拟信号 (0-5V),连接至STM32的PA0(ADC1通道0);

  • 采用LM358 构成同相放大电路,增益设置为1000倍(将传感器输出的mV级信号放大至V级,适配STM32 ADC输入范围);

  • 电路图:

    c 复制代码
    VCC(5V) → 传感器VCC  
    传感器OUT → LM358同相输入端 → LM358输出 → PA0(STM32)  
    LM358反相输入端 → 反馈电阻(1MΩ) → 输出端
(2)报警与显示电路
  • 蜂鸣器:通过三极管(S8050)驱动,基极连接STM32的PB0(GPIO输出);

  • LED:阳极通过1kΩ电阻 连接STM32的PB1(GPIO输出),阴极接地;

  • OLED:I2C接口,SCL连接PB6 ,SDA连接PB7(STM32硬件I2C)。

三、软件设计(C语言实现)

1. 主程序流程

c 复制代码
#include "stm32f10x.h"
#include "adc.h"
#include "filter.h"
#include "oled.h"
#include "bluetooth.h"
#include "alarm.h"

// 系统状态
typedef struct {
  uint8_t alarm_flag;    // 报警标志(0:正常, 1:报警)
  float smoke_value;     // 烟雾浓度(%obs/m)
  float threshold;       // 报警阈值(%obs/m)
} SystemState;

int main(void) {
  // 初始化硬件
  System_Init();         // 时钟、GPIO、ADC、OLED、蓝牙
  Filter_Init();         // 初始化滤波算法(复合偏置滤波)
  Alarm_Init();         // 初始化报警模块(蜂鸣器、LED)
  
  SystemState sys_state = {0};
  sys_state.threshold = 0.5;  // 默认阈值(%obs/m)
  
  // 主循环
  while (1) {
    // 1. 采集烟雾信号(ADC转换)
    uint16_t adc_value = ADC_Read(ADC_Channel_0);
    float voltage = (adc_value / 4095.0f) * 3.3f;  // 转换为电压(0-3.3V)
    
    // 2. 数字滤波(去除噪声与基线漂移)
    float filtered_voltage = Filter_Process(voltage);
    
    // 3. 转换为烟雾浓度(%obs/m)
    sys_state.smoke_value = Voltage_To_Smoke(filtered_voltage);
    
    // 4. 报警判断(超过阈值则触发)
    if (sys_state.smoke_value > sys_state.threshold) {
      sys_state.alarm_flag = 1;
      Alarm_Trigger();  // 声光报警
    } else {
      sys_state.alarm_flag = 0;
      Alarm_Reset();    // 停止报警
    }
    
    // 5. 显示与远程传输
    OLED_Display(sys_state.smoke_value, sys_state.threshold, sys_state.alarm_flag);
    Bluetooth_Send(sys_state.smoke_value, sys_state.alarm_flag);
    
    // 6. 低功耗管理(空闲时休眠)
    if (!sys_state.alarm_flag) {
      Enter_Sleep_Mode(1000);  // 休眠1秒
    }
  }
}

2. 关键算法实现

(1)数字滤波(复合偏置滤波)

针对光电信号的基线漂移高频噪声 ,采用复合偏置滤波算法(结合FIR滤波与趋势判断):

c 复制代码
// 复合偏置滤波结构体
typedef struct {
  float prev_output;     // 上一次输出值
  float threshold;       // 报警阈值
  uint8_t count;         // 超过阈值的次数
} CompositeFilter;

// 初始化滤波
void Filter_Init(CompositeFilter* filter, float threshold) {
  filter->prev_output = 0.0f;
  filter->threshold = threshold;
  filter->count = 0;
}

// 滤波处理
float Filter_Process(CompositeFilter* filter, float input) {
  // 1. FIR滤波(去除高频噪声)
  float fir_output = (input + filter->prev_output) / 2.0f;
  
  // 2. 偏置处理(去除基线漂移)
  float bias = fir_output - filter->prev_output;
  float output = fir_output - bias;
  
  // 3. 趋势判断(超过阈值则计数)
  if (output > filter->threshold) {
    filter->count++;
    if (filter->count > 3) {  // 连续3次超过阈值则触发报警
      filter->count = 0;
      return output;
    }
  } else {
    filter->count = 0;
  }
  
  filter->prev_output = output;
  return output;
}
(2)烟雾浓度转换

通过标定实验 (用标准烟箱测试),建立电压-烟雾浓度的线性关系:

c 复制代码
// 电压转换为烟雾浓度(%obs/m)
float Voltage_To_Smoke(float voltage) {
  // 标定曲线:smoke = a*voltage + b(a=0.2, b=0.1,需根据实际传感器调整)
  return 0.2f * voltage + 0.1f;
}
(3)报警控制
c 复制代码
// 触发报警(声光)
void Alarm_Trigger(void) {
  GPIO_SetBits(GPIOB, GPIO_Pin_0);  // 蜂鸣器响
  GPIO_SetBits(GPIOB, GPIO_Pin_1);  // LED亮
}

// 停止报警
void Alarm_Reset(void) {
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);  // 蜂鸣器停
  GPIO_ResetBits(GPIOB, GPIO_Pin_1);  // LED灭
}

参考代码 消防报警器,光电感烟探测设计 www.youwenfan.com/contentcss/160905.html

四、符合GB 4715-2024标准设计

1. 响应阈值调整

  • 支持动态阈值调整(通过手机APP或按键),适应不同场景(如厨房、仓库);

  • 阈值范围:0.1-2.0%obs/m(符合GB 4715-2024中A型光电探测器的要求)。

2. 污染检测功能

  • 定期(每6个月)检测传感器污染程度(通过测量 baseline 电压变化);

  • 当污染超过阈值(如 baseline 电压变化超过0.5V),触发污染报警(OLED显示"请清洁传感器")。

3. 电磁兼容(EMC)设计

  • 传感器信号线采用屏蔽线(如RVVP 2×0.5),减少电磁干扰;

  • 电源电路增加π型滤波(10μF电容+100Ω电阻+10μF电容),抑制电源噪声;

  • 符合GB/T 17626系列标准(静电放电、射频电磁场辐射抗扰度等)。

五、测试与验证

1. 功能测试

测试项 方法 预期结果
烟雾检测 用香烟烟雾靠近传感器 报警触发(蜂鸣器响、LED亮)
阈值调整 通过APP将阈值设为1.0%obs/m 烟雾浓度超过1.0%时触发报警
污染检测 用灰尘覆盖传感器 OLED显示"请清洁传感器"
远程监控 通过手机APP查看烟雾浓度 数据显示正常(与实际一致)

2. 性能测试

  • 灵敏度 :对0.5%obs/m的标准烟雾(GB 4715-2024)响应时间≤10秒;

  • 误报率 :在厨房环境(油烟、蒸汽)中,误报率≤1次/月;

  • 续航时间:锂电池供电(3.7V/1000mAh),连续工作时间≥72小时。

六、总结

本设计基于STM32实现了高可靠性、低误报 的光电感烟火灾报警器,符合GB 4715-2024标准。系统通过复合滤波算法 解决了光电信号的噪声与漂移问题,通过动态阈值调整 适应了不同场景需求,通过污染检测保证了长期稳定性。

相关推荐
拒朽2 小时前
51单片机学习(六)模块化编程和LCD调试工具
嵌入式硬件·学习·51单片机
somi73 小时前
ARM-09-I.MX6U-I2C
单片机·嵌入式硬件·i2c·自用
senijusene3 小时前
IMX6ULL 时钟系统配置与定时器 (EPIT/GPT)
stm32·单片机·fpga开发
会编程的小孩3 小时前
stm32f103c8t6工程模板 配置成stm32f407zgt6工程模板
stm32·单片机·嵌入式硬件
somi73 小时前
ARM-08-I.MX6U UART 串口
arm开发·单片机·嵌入式硬件·自用
mcupro3 小时前
TQTT_KU5P开发板教程---在Windows下XCKU5P+AD9361测试
嵌入式硬件·fpga开发·模块测试
青桔柠薯片3 小时前
IMX6ULL 时钟、定时器与中断系统:从晶体振荡器到GIC的硬件机制分析
嵌入式硬件·imx6ull
Zevalin爱灰灰4 小时前
零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(五)
单片机·物联网·mqtt·嵌入式·esp8266
欢乐熊嵌入式编程4 小时前
做一个智能温湿度监控系统(含显示与数据上传)
单片机·温湿度·嵌入式学习·智能温湿度监控系统