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

基于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)光电传感器接口

(2)报警与显示电路

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

1. 主程序流程

#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滤波与趋势判断):

// 复合偏置滤波结构体
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)烟雾浓度转换

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

// 电压转换为烟雾浓度(%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)报警控制

// 触发报警(声光)
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. 响应阈值调整

2. 污染检测功能

3. 电磁兼容(EMC)设计

五、测试与验证

1. 功能测试

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

2. 性能测试

六、总结

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

 

专注于matlab/simulink,电子电路,编程