目录
一、系统概述
本系统采用STM32F103C8T6单片机(最小系统板)和四线制火焰传感器模块,实现火焰检测与报警功能。系统通过标准外设库(Standard Peripheral Library)进行开发,具有响应快速、稳定性高的特点。
二、四针火焰传感器模块简介
2.1 基本概述
四针火焰传感器模块是一种专门用于检测火焰或红外光源的电子元件,广泛应用于火灾报警系统、安全监测设备和智能家居控制等领域。与传统的两针或三针火焰传感器相比,四针版本提供了更丰富的检测方式和更灵活的应用场景。
2.2 模块结构与引脚定义
物理结构:
四针火焰传感器通常由以下主要部件组成:
- 红外接收管:核心检测元件,对760nm-1100nm波长的红外光敏感
- 信号处理电路:包含运放和比较器电路
- 灵敏度调节电位器:用于调整数字输出的触发阈值
- LED状态指示灯:显示检测状态
引脚定义(4个接口):
引脚名称 | 功能说明 | 典型连接方式 |
---|---|---|
VCC | 电源正极(3.3V-5.5V) | 接STM32的3.3V或5V |
GND | 电源负极 | 接STM32的GND |
AO | 模拟量输出(Analog Output) | 接STM32的ADC输入引脚 |
DO | 数字量输出(Digital Output) | 接STM32的普通IO输入引脚 |
2.3 工作原理
检测原理:
传感器通过红外接收管检测火焰发出的特定波长红外线(火焰在燃烧时会产生波长在760nm-1100nm范围内的红外辐射)。当检测到火焰时:
- AO端:输出与火焰强度成正比的模拟电压(0-VCC)
- DO端:输出数字信号(检测到火焰时为低电平,否则为高电平)
电路原理图:
2.4 信号输出特性
模拟输出(AO)特点:
- 输出电压范围:0V至VCC
- 无火焰时:输出约0.1V-0.3V(环境红外噪声)
- 有火焰时:输出电压随火焰强度增大而升高
- 检测距离:通常20-100cm(取决于火焰大小)
数字输出(DO)特点:
- 无火焰时:输出高电平(≈VCC)
- 有火焰时:输出低电平(≈0V)
- 触发阈值可通过电位器调节
- 响应时间:通常<10ms
2.5 技术参数
参数项 | 典型值 |
---|---|
工作电压 | 3.3V-5.5V DC |
工作电流 | <20mA |
检测波长 | 760nm-1100nm |
检测角度 | 约60度圆锥角 |
响应时间 | ≤10ms |
工作温度 | -25℃~+85℃ |
输出信号 | AO:0-VCC, DO:TTL电平 |
模块尺寸 | 约32mm×14mm |
2.6 使用注意事项
安装要点:
- 避免阳光直射(阳光中含红外线会导致误触发)
- 安装位置应避开热源
- 检测方向应对准待监测区域
灵敏度调节:
- 模块上的蓝色电位器可调节DO的触发阈值
- 顺时针旋转提高灵敏度(更容易触发)
- 调节时建议使用明火测试
干扰防护:
- 避免白炽灯、卤素灯等红外光源干扰
- 强电磁环境下建议加屏蔽措施
- 长距离传输AO信号时应做好信号调理
四针火焰传感器模块因其双输出特性,既能满足需要精确测量的场合(通过AO),又能实现快速响应的开关量检测(通过DO),是工程应用中非常实用的选择。
三、硬件设计
3.1 硬件组成
- STM32F103C8T6最小系统板
- 四线制火焰传感器模块(VCC、GND、AO、DO)
- 有源蜂鸣器
- 电阻、杜邦线等
STM32F103C8T6最小系统板示意图:
蜂鸣器模块示意图:
本次使用的是有源蜂鸣器模块,高电平触发的。只要单片机的IO口输出高电平,就可以驱动蜂鸣器发出声音了。
LED模块:
STM32F103C8T6最小系统板PCB13默认接到自带的LED灯,无需外接 。
3.2 硬件连接
STM32引脚 | 连接模块 | 说明 |
---|---|---|
PA0 | 传感器AO | ADC1通道0 |
PA1 | 传感器DO | 数字输入 |
PC13 | LED | 报警指示灯 |
PB8 | 蜂鸣器 | 报警发声 |
3.3V | 传感器VCC | 电源 |
GND | 传感器GND | 共地 |
四、软件设计
4.1 开发环境配置
- 开发工具:Keil MDK-ARM
- 库版本:STM32F10x标准外设库V3.5.0
- 调试工具:ST-Link V2
4.2 关键代码实现
4.2.1 初始化代码
配置GPIO引脚及ADC引脚。
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_rcc.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
// 配置PA0为模拟输入(AO)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PA1为浮空输入(DO)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PC13为推挽输出(LED)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 配置PB8为推挽输出(蜂鸣器)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
// 使能ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// ADC配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 使能ADC1
ADC_Cmd(ADC1, ENABLE);
// ADC校准
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
4.2.2 主程序逻辑
读取模拟量的数值以及数字量的状态,当模拟量的数值大于火焰检测阈值2000或者数字量状态为0时,蜂鸣器响同时LED灯亮,否则关闭。
#define FIRE_THRESHOLD 2000 // 火焰检测阈值
uint16_t Get_ADC_Value(uint8_t channel)
{
// 设置ADC通道
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);
// 启动ADC转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// 等待转换完成
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
void Alarm_Control(FunctionalState state)
{
if(state == ENABLE)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13); // LED亮
GPIO_SetBits(GPIOB, GPIO_Pin_8); // 蜂鸣器响
}
else
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED灭
GPIO_ResetBits(GPIOB, GPIO_Pin_8); // 蜂鸣器停
}
}
int main(void)
{
uint16_t adc_value = 0;
uint8_t digital_state = 0;
// 初始化系统时钟
SystemInit();
// 外设初始化
GPIO_Configuration();
ADC_Configuration();
while(1)
{
// 读取模拟量
adc_value = Get_ADC_Value(ADC_Channel_0);
// 读取数字量
digital_state = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
// 火焰检测逻辑
if((adc_value > FIRE_THRESHOLD) || (digital_state == 0))
{
Alarm_Control(ENABLE); // 触发报警
}
else
{
Alarm_Control(DISABLE); // 关闭报警
}
// 简单延时
for(uint32_t i=0; i<0xFFFF; i++);
}
}
五、系统调试
5.1 硬件调试
-检查所有接线是否正确
- 测量传感器供电电压是否正常
- 用打火机测试传感器响应
5.2 软件调试
- 通过ADC读取模拟值,调整火焰检测阈值
- 测试数字量输出的可靠性
- 优化报警响应时间
5.3 性能优化
- 添加软件滤波算法(如滑动平均)
- 实现多级报警(预警、火警)
- 增加通信接口(如串口上报)
六、总结
本系统通过STM32标准外设库实现了对四线制火焰传感器的稳定控制,具有结构简单、响应快速的特点,可广泛应用于家庭、工业等领域的火灾预警系统中。