火焰传感器
红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源,在机器人比赛中,远红外火焰探头起到非常重要的作用,它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人等。
红外火焰传感器能够探测700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时,其灵敏度达到最大。红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0 ~4095范围内的数值的变化。外界红外光越强,数值越小;红外光越弱,数值越大。
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a21n57.1.0.0.4c52523cd1r9Zc&id=35124127482&ns=1&abbucket=0&skuId=4634892497712
资料下载链接:
https://pan.baidu.com/s/14rzP9Gx7AjbmRSqD_A5Pyw
资料提取码:risv
规格参数
工作电压:3.3V-5V
探测距离:1米
输出方式: DO接口为数字量输出
AO接口为模拟量输出
读取方式:ADC与数字量(0和1)
管脚数量:4 Pin(2.54mm间距排针)
原理解析
火焰传感器模块的工作原理很简单。其背后的理论是热的物体会发出红外辐射。对于火焰或火灾,这种辐射会很高。我们将使用红外光电二极管检测这种红外辐射。光电二极管的电导率将根据其检测到的红外辐射而变化。我们使用 LM393 来比较这种辐射,当达到阈值时,数字输出会发生变化。
我们还可以使用模拟输出来测量红外辐射强度。模拟输出直接取自光电二极管的端子。板载 D0 LED 将在检测到时显示存在火灾。灵敏度可以通过调整板上的可变电阻来改变。这可用于消除误触发。
其对应的原理图见图2.16.3.1-2,AO输出为火焰传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的2.3.3.1 查看资料。
移植过程
引脚选择
移植至工程
我们的目标是将例程移植至ESP32-S3开发板上。已经为大家提供了完整的驱动代码,按照以下步骤,即可完成移植。
具体新建文件夹和新建c和h文件在 【DHT11温湿度传感器】章节中的1.4.2小节中有详细的教学,这里就不再多说了。
只不过这里我们将文件名 bsp_dht11.c 和 bsp_dht11.h 换成 bsp_flame.c 和 bsp_flame.h,文件夹名字改为flame。
代码写入
在文件bsp_flame.c中,编写如下代码。
#include "bsp_flame.h"
esp_adc_cal_characteristics_t *adc_chars;
void delay_ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_us(unsigned int us)
{
ets_delay_us(us);
}
/******************************************************************
* 函 数 名 称:ADC_Flame_Init
* 函 数 说 明:
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void ADC_Flame_Init(void)
{
gpio_config_t flame_config = {
.pin_bit_mask = (1ULL<<FLAME_GPIO_DO), //配置引脚
.mode =GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_DISABLE, //不使能上拉
.pull_down_en = GPIO_PULLDOWN_DISABLE, //不使能下拉
.intr_type = GPIO_INTR_DISABLE //不使能引脚中断
};
gpio_config(&flame_config);
adc1_config_width(width);// 12位分辨率
//ADC_ATTEN_DB_0:表示参考电压为1.1V
//ADC_ATTEN_DB_2_5:表示参考电压为1.5V
//ADC_ATTEN_DB_6:表示参考电压为2.2V
//ADC_ATTEN_DB_11:表示参考电压为3.3V
//adc1_config_channel_atten( channel,atten);// 设置通道0和3.3V参考电压
// 分配内存
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
// 对 ADC 特性进行初始化,使其能够正确地计算转换结果和补偿因素
esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
}
/******************************************************************
* 函 数 名 称:Get_Adc_Flame_Value
* 函 数 说 明:
* 函 数 形 参:
* 函 数 返 回:对应扫描的ADC值
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int Get_Adc_Flame_Value(char CHx)
{
unsigned char i = 0;
unsigned int AdcValue = 0;
/* 因为采集 SAMPLES 次,故循环 SAMPLES 次 */
for(i=0; i< SAMPLES; i++)
{
/* 累加 */
AdcValue+=adc1_get_raw(CHx);
}
/* 求平均值 */
AdcValue=AdcValue / SAMPLES;
return AdcValue;
}
/******************************************************************
* 函 数 名 称:Get_FLAME_Percentage_value
* 函 数 说 明:读取火焰AO值,并且返回百分比
* 函 数 形 参:无
* 函 数 返 回:返回百分比
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int Get_FLAME_Percentage_value(void)
{
int adc_max = 4095;
int adc_new = 0;
int Percentage_value = 0;
adc_new = Get_Adc_Flame_Value(channel);
Percentage_value = (1-((float)adc_new/adc_max)) * 100;
return Percentage_value;
}
/******************************************************************
* 函 数 名 称:Get_FLAME_Do_value
* 函 数 说 明:读取火焰DO值,返回0或者1
* 函 数 形 参:无
* 函 数 返 回:
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned char Get_FLAME_Do_value(void)
{
return gpio_get_level(FLAME_GPIO_DO);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
在文件bsp_flame.h中,编写如下代码。
#ifndef _BSP_FLAME_H_
#define _BSP_FLAME_H_
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_rom_sys.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "rom/ets_sys.h"
#include "esp_system.h"
#include "driver/gptimer.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "driver/spi_master.h"
#include "nvs_flash.h"
#include "esp_adc/adc_cali_scheme.h"
#include "esp_adc/adc_cali.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#define DEFAULT_VREF 1100 //默认参考电压,单位mV
#define FLAME_GPIO_AO 1
#define FLAME_GPIO_DO 2
#define channel ADC_CHANNEL_0 // ADC测量通道
#define width ADC_WIDTH_BIT_12 // ADC分辨率
#define atten ADC_ATTEN_DB_11 // ADC衰减
#define unit ADC_UNIT_1 // ADC1
//采样次数
#define SAMPLES 30
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void ADC_Flame_Init(void);
unsigned int Get_Adc_Flame_Value(char CHx);
unsigned int Get_FLAME_Percentage_value(void);
unsigned char Get_FLAME_Do_value(void);
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
移植验证
在自己工程中的main主函数中,编写如下。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-02 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_flame.h"
void app_main(void)
{
ADC_Flame_Init();
while(1)
{
printf("flame = %d%%\r\n",Get_FLAME_Percentage_value());
delay_ms(500);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
驱动代码: