Flame Sensor
The infrared flame sensor can be used to detect fire sources or other heat sources with wavelengths in the range of 700 nm to 1000 nm. In robotics competitions, the far-infrared flame probe plays a very important role; it can serve as the robot's eyes to find fire sources or soccer balls. It can be used to build fire-fighting robots and so on. The infrared flame sensor can detect infrared light in the 700 nm to 1000 nm range, with a detection angle of 60 degrees. Its sensitivity reaches the maximum when the infrared light wavelength is around 880 nm. The infrared flame probe converts changes in the intensity of external infrared light into changes in current, which are then reflected through an A/D converter as numerical values in the range of 0 to 4095. The stronger the external infrared light, the smaller the value; the weaker the infrared light, the larger the value.
Module Source
Purchase link: https://item.taobao.com/item.htm?spm=a21n57.1.0.0.4c52523cd1r9Zc&id=35124127482&ns=1&abbucket=0&skuId=4634892497712 Materials download link: https://pan.baidu.com/s/14rzP9Gx7AjbmRSqD_A5Pyw Materials extraction code: risv
Specifications
Operating voltage: 3.3V-5V Detection distance: 1 meter Output method: DO interface is digital output AO interface is analog output Read method: ADC and digital value (0 and 1) Number of pins: 4 Pin (2.54mm pitch header)
Principle Analysis
The working principle of the flame sensor module is very simple. The theory behind it is that hot objects emit infrared radiation. For flames or fires, this radiation is very high. We will use an infrared photodiode to detect this infrared radiation. The conductivity of the photodiode varies according to the infrared radiation it detects. We use the LM393 to compare this radiation; when the threshold is reached, the digital output changes. We can also use the analog output to measure the infrared radiation intensity. The analog output is taken directly from the terminals of the photodiode. The onboard D0 LED will indicate the presence of fire when detected. The sensitivity can be changed by adjusting the variable resistor on the board. This can be used to eliminate false triggers. The corresponding schematic diagram is shown in Figure 2.16.3.1-2. The AO output is the voltage directly output by the flame sensor, so it is an analog quantity; the DO is the high or low level output after voltage comparison by the LM393, so it is a digital quantity. For the specific principle, see section 2.3.3.1 View Materials in the Photoresistor Light Sensor chapter.
Porting Process
Pin Selection
Port to Project
Our goal is to port the example to the ESP32-S3 dev board. Complete driver code has been provided for you. Follow the steps below to complete the porting. For detailed instructions on creating folders and new .c and .h files, refer to section 1.4.2 in the [DHT11 Temperature and Humidity Sensor] chapter; we will not repeat it here. However, here we change the file names bsp_dht11.c and bsp_dht11.h to bsp_flame.c and bsp_flame.h, and change the folder name to flame.
Write Code
In the file bsp_flame.c, write the following code.
#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);
}
/******************************************************************
* Function Name: ADC_Flame_Init
* Function Description:
* Function Parameters: none
* Function Return: none
* Author: LC
* Notes: none
******************************************************************/
void ADC_Flame_Init(void)
{
gpio_config_t flame_config = {
.pin_bit_mask = (1ULL<<FLAME_GPIO_DO), // Configure pin
.mode =GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_DISABLE, // Disable pull-up
.pull_down_en = GPIO_PULLDOWN_DISABLE, // Disable pull-down
.intr_type = GPIO_INTR_DISABLE // Disable pin interrupt
};
gpio_config(&flame_config);
adc1_config_width(width);// 12-bit resolution
//ADC_ATTEN_DB_0: indicates reference voltage is 1.1V
//ADC_ATTEN_DB_2_5: indicates reference voltage is 1.5V
//ADC_ATTEN_DB_6: indicates reference voltage is 2.2V
//ADC_ATTEN_DB_11: indicates reference voltage is 3.3V
//adc1_config_channel_atten( channel,atten);// Set channel 0 and 3.3V reference voltage
// Allocate memory
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
// Initialize ADC characteristics so that conversion results and compensation factors can be correctly calculated
esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
}
/******************************************************************
* Function Name: Get_Adc_Flame_Value
* Function Description:
* Function Parameters:
* Function Return: corresponding scanned ADC value
* Author: LC
* Notes: none
******************************************************************/
unsigned int Get_Adc_Flame_Value(char CHx)
{
unsigned char i = 0;
unsigned int AdcValue = 0;
/* Since it samples SAMPLES times, loop SAMPLES times */
for(i=0; i< SAMPLES; i++)
{
/* Accumulate */
AdcValue+=adc1_get_raw(CHx);
}
/* Calculate average */
AdcValue=AdcValue / SAMPLES;
return AdcValue;
}
/******************************************************************
* Function Name: Get_FLAME_Percentage_value
* Function Description: Read flame AO value and return percentage
* Function Parameters: none
* Function Return: returns percentage
* Author: LC
* Notes: none
******************************************************************/
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;
}
/******************************************************************
* Function Name: Get_FLAME_Do_value
* Function Description: Read flame DO value, returns 0 or 1
* Function Parameters: none
* Function Return:
* Author: LC
* Notes: none
******************************************************************/
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
In the file bsp_flame.h, write the following code.
#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 // Default reference voltage, unit mV
#define FLAME_GPIO_AO 1
#define FLAME_GPIO_DO 2
#define channel ADC_CHANNEL_0 // ADC measurement channel
#define width ADC_WIDTH_BIT_12 // ADC resolution
#define atten ADC_ATTEN_DB_11 // ADC attenuation
#define unit ADC_UNIT_1 // ADC1
// Number of samples
#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);
#endif2
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
Porting Verification
In the main function of your own project, write the following code.
/*
* LCSC-Openkits (LCKFB) software and hardware materials and related expansion board software and hardware materials are all open source on the official website.
* Dev board official website: www.lckfb.com
* Technical support resides on the forum; any technical questions are welcome for exchange and learning at any time.
* LCKFB Forum: club.szlcsc.com
* Follow our Bilibili account: [LCSC-Openkits (LCKFB)] to keep up with our latest updates!
* We do not make money by selling boards; we take cultivating engineers as our mission.
* 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
Driver code:
File Download
📌 Materials Download Center (click to jump)
📌 In the Materials Download Center -> Module Porting Materials Download, inside the compressed package of this chapter.