一、工作原理

火焰燃烧时会辐射出特定频率范围的光,其中包含丰富的红外线(IR)。火焰传感器的核心是一个对红外线特别敏感的红外接收管(或光电晶体管),过检测火焰的光谱来进行工作的。

其工作过程可以简化为:

  1. 感知:当火焰出现时,其发出的红外线照射到传感器的探测窗口。

  2. 转换:传感器内部的敏感元件(通常是锗材料制成的窗口,对红外线透过性好)将接收到的红外光强度转换为变化的电流。

  3. 输出:这个变化的电流经过传感器模块上的电路处理,最终输出一个可以被微控制器读取的信号。

核心原理: 利用火焰特有的闪烁频率(通常在1Hz到10Hz之间)来区分火焰与其他稳定的红外光源(如白炽灯、太阳光)。简单的传感器只探测强度,而更先进的传感器会分析这个闪烁频率,以降低误报。

二、简单介绍

火焰传感器原理图

<1>引脚介绍

使用的火焰传感器是一个模块,外接出来的四个引脚是指P1的四个引脚

VCC(4):供电引脚,支持3.3V至5.5V电压范围。

GND(3):接地引脚。

AO(1)   :输出一个与检测到的火焰红外线强度成正比连续变化的电压信号,范围一般在 0V ~ VCC 之间。例如,使用5V供电,输出范围就是0~5V。当你需要知道火焰的大致距离相对强度时使用。微控制器通过ADC(模数转换器) 读取这个电压值,并将其转换为一个数字。

DO(2)   :输出一个高低电平信号,表示“有火焰”或“无火焰”两种状态。

<2>输出形式

1. 数字量(DO)输出
  • 工作原理:模块上有一个电位器,用于设置一个检测阈值。当探测到的火焰强度高于这个阈值时,输出引脚(DO)从高电平变为低电平(或反之);反之则输出高电平。

  • 特点

    • 简单:输出只有“有火焰”(0/1)或“无火焰”(1/0)两种状态,编程简单。

    • 抗干扰性差:容易受其他红外光源干扰,因为只要强度足够,任何红外源都可能触发。

    • 适用场景:对精度要求不高的简单报警或触发装置。

2. 模拟量(AO)输出
  • 工作原理:直接输出一个与探测到的火焰强度成比例的电压值(通常是0V到5V或0V到3.3V)。

  • 特点

    • 精确:微控制器可以通过ADC(模数转换器)读取具体的电压值,从而判断火焰的远近或大小。

    • 灵活:用户可以在程序里自定义阈值,实现更复杂的逻辑。

    • 信息丰富:可以用于制作火焰强度指示器等。

    • 适用场景:需要量化火焰强度或进行复杂判断的应用。

<3>电路分析

这里只介绍数字量(DO)输出模式,火焰传感器是通过检测火焰的光谱来进行工作的,R1是上拉电阻保持高电平,保证三极管的集电极是高电平导通。D1是电源指示灯,当电路正常通电时,D1亮起;D2是检测到火焰的警示灯,当检测到火焰时,D2亮起。IN是通过R2调整之后的参考电压,是设定好的阈值,AC是红外发射管采集到的模拟电压值,通过LM393比较器将AC和IN进行比较。当传感器没有检测到火焰时,INA+引脚是高电平,即OUT引脚输出的是高电平;当检测到火焰时,OUT输出一个低电平。

三、代码实现

<1>IR.c

#include "IR.h"
#include "stm32f10x.h"

/**
  * @brief  初始化火焰传感器数字输出(DO)引脚
  * @param  无
  * @retval 无
  */
void IR_DO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* 使能GPIO时钟 */
    RCC_APB2PeriphClockCmd(IR_DO_GPIO_CLK, ENABLE);
    
    /* 配置GPIO引脚为输入模式 */
    GPIO_InitStructure.GPIO_Pin = IR_DO_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(IR_DO_GPIO_PORT, &GPIO_InitStructure);
}

/**
  * @brief  读取火焰传感器数字输出状态
  * @param  无
  * @retval IR_Status: 火焰检测状态
  *         IR_DETECTED: 检测到火焰
  *         IR_NOT_DETECTED: 未检测到火焰
  */
IR_Status IR_DO_Read(void)
{
    if (GPIO_ReadInputDataBit(IR_DO_GPIO_PORT, IR_DO_GPIO_PIN) == Bit_RESET)
    {
        return IR_DETECTED;    // 低电平表示检测到火焰
    }
    else
    {
        return IR_NOT_DETECTED; // 高电平表示未检测到火焰
    }
}

/**
  * @brief  检查是否检测到火焰(简化函数)
  * @param  无
  * @retval uint8_t: 1-检测到火焰, 0-未检测到火焰
  */
uint8_t IR_IsFlameDetected(void)
{
    return (IR_DO_Read() == IR_DETECTED);
}

<2>IR.h

#ifndef __IR_H
#define __IR_H

#include "stm32f10x.h"

/* 引脚定义  */
#define IR_DO_GPIO_CLK      RCC_APB2Periph_GPIOA  // 根据自己选择的引脚进行修改
#define IR_DO_GPIO_PORT     GPIOB
#define IR_DO_GPIO_PIN      GPIO_Pin_5

/* 火焰检测状态枚举 */
typedef enum
{
    IR_NOT_DETECTED = 0,  // 未检测到火焰
    IR_DETECTED = 1       // 检测到火焰
} IR_Status;

/* 函数声明 */
void IR_DO_Init(void);
IR_Status IR_DO_Read(void);
uint8_t IR_IsFlameDetected(void);

#endif /* __IR_H */

<3>使用示例

#include "stm32f10x.h"
#include "IR.h"

/**
  * @brief  主函数 - 基本火焰检测示例
  */
int main(void)
{

    
    /* 初始化火焰传感器 */
    IR_DO_Init();
    
    
    while(1)
    {
        /* 读取火焰传感器状态 */
        IR_Status flameStatus = IR_DO_Read();
        
        if (flameStatus == IR_DETECTED)
        {
            /* 检测到火焰,执行相应操作 */

        }
        else
        {
            /* 未检测到火焰 */

        }
        
        /* 延时 */
        Delay_ms(500);  // 500ms检测一次
    }
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐