MQ-2烟雾检测传感器
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~3000摄氏度时,二氧化锡表面吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至面变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息。烟雾浓度越大导电率越大,输出电阻越低,则输出的模拟信号就越大。
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-24706531953.12.4cd36a4bho6MgR&id=522572009794
资料下载链接:
https://pan.baidu.com/s/1ETxqg03p5fEjKS7AZ2kV6w
资料提取码:dfr1
规格参数
工作电压:5V
工作电流:150MA
输出方式: DO接口为数字量输出 AO接口为模拟量输出
读取方式:ADC
管脚数量:4 Pin(2.54mm间距排针)
原理解析
MQ-2烟雾传感器对液化气、天然气、城市煤气灵敏度较高。需要注意的是:在使用之前必须加热一段时间,否则其输出的电阻和电压不准确。其检测可燃气体与烟雾的范围是100~10000ppm(ppm为体积浓度。 1ppm=1立方厘米/1立方米)。带有双路信号输出(模拟量输出AO和数字量输出DO)。当气体浓度未超过设定阈值时,数字接口DO口输出低电平,模拟接口AO电压基本为0v左右;当气体影响超过设定阈值时,模块数字接口DO输出高电平,模拟接口AO输出的电压会随着气体的影响慢慢增大。阈值由模块上的可调电阻控制。
其对应的原理图见图2.2.3.1-2,AO输出为MQ-2传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的2.3.3.1 查看资料。
因此DO引脚可以配置为GPIO的输入模式,AO引脚需要配置为ADC模拟输入模式。
移植过程
引脚选择
移植至工程
我们的目标是将例程移植至ESP32-S3开发板上。已经为大家提供了完整的驱动代码,按照以下步骤,即可完成移植。
具体新建文件夹和新建c和h文件在 【DHT11温湿度传感器】章节中的1.4.2小节中有详细的教学,这里就不再多说了。
只不过这里我们将文件名 bsp_dht11.c 和 bsp_dht11.h 换成 bsp_mq2.c 和 bsp_mq2.h,文件夹名字改为mq2。
代码写入
在 bsp_mq2.c 文件中写入:
#include "bsp_mq2.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_DMA_Init
* 函 数 说 明:初始化ADC+DMA功能
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void ADC_MQ2_Init(void)
{
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_Dma_Value
* 函 数 说 明:对DMA保存的数据进行平均值计算后输出
* 函 数 形 参:CHx 第几个扫描的数据
* 函 数 返 回:对应扫描的ADC值
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int Get_Adc_MQ2_Value(void)
{
unsigned char i = 0;
unsigned int AdcValue = 0;
/* 因为采集 SAMPLES 次,故循环 SAMPLES 次 */
for(i=0; i < SAMPLES; i++)
{
/* 累加 */
AdcValue += adc1_get_raw(channel);
}
/* 求平均值 */
AdcValue = AdcValue / SAMPLES;
return AdcValue;
}
/******************************************************************
* 函 数 名 称:Get_MQ2_Percentage_value
* 函 数 说 明:读取MQ2值,并且返回百分比
* 函 数 形 参:无
* 函 数 返 回:返回百分比
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int Get_MQ2_Percentage_value(void)
{
int adc_max = 4095;
int adc_new = 0;
int Percentage_value = 0;
adc_new = Get_Adc_MQ2_Value();
Percentage_value = ((float)adc_new/adc_max) * 100;
return Percentage_value;
}
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
在 bsp_mq2.h文件中写入:
#ifndef _BSP_MQ2_H_
#define _BSP_MQ2_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 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 GPIO_AO 1
//采样次数
#define SAMPLES 30
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void ADC_MQ2_Init(void);
unsigned int Get_Adc_MQ2_Value(void);
unsigned int Get_MQ2_Percentage_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
到这里移植完成了,请移步到 5.5 进行移植验证。
移植验证
在main.c中输入代码如下
#include <stdio.h>
#include "bsp_mq2.h"
void app_main(void)
{
ADC_MQ2_Init();
printf("Start....\n");
delay_ms(1000);
while(1)
{
printf("MQ2_Value: %d\n",Get_Adc_MQ2_Value());
printf("MQ2_Percentage: %d%%\n",Get_MQ2_Percentage_value());
delay_ms(1000);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上电效果:
驱动代码: