传感器 火焰传感器
火焰传感器原理图使用的火焰传感器是一个模块,外接出来的四个引脚是指P1的四个引脚供电引脚,支持3.3V至5.5V电压范围。接地引脚。输出一个与检测到的火焰红外线强度成正比的连续变化的电压信号,范围一般在0V ~ VCC之间。例如,使用5V供电,输出范围就是0~5V。当你需要知道火焰的大致距离或相对强度时使用。微控制器通过ADC(模数转换器)读取这个电压值,并将其转换为一个数字。输出一个高低电平信号
一、工作原理
火焰燃烧时会辐射出特定频率范围的光,其中包含丰富的红外线(IR)。火焰传感器的核心是一个对红外线特别敏感的红外接收管(或光电晶体管),过检测火焰的光谱来进行工作的。
其工作过程可以简化为:
-
感知:当火焰出现时,其发出的红外线照射到传感器的探测窗口。
-
转换:传感器内部的敏感元件(通常是锗材料制成的窗口,对红外线透过性好)将接收到的红外光强度转换为变化的电流。
-
输出:这个变化的电流经过传感器模块上的电路处理,最终输出一个可以被微控制器读取的信号。
核心原理: 利用火焰特有的闪烁频率(通常在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检测一次
}
}
更多推荐



所有评论(0)