MQ-3 Alcohol Detection Sensor
The gas-sensitive material used in the MQ-3 gas sensor is tin dioxide (SnO2), which has low conductivity in clean air. When alcohol vapor is present in the environment where the sensor is located, the conductivity of the sensor increases with the increase of alcohol vapor concentration in the air. A simple circuit can convert the change in conductivity into an output signal corresponding to the gas concentration.
Module Source
Purchase link: https://detail.tmall.com/item.htm?abbucket=0&id=695089814069&ns=1&spm=a21n57.1.0.0.5668523c1NVcMb Materials download link: https://pan.baidu.com/s/1B8WhPIzTmWwQsFFVayRpAA?pwd=9966 Materials extraction code: 9966
Specifications
Operating voltage: 3.3V-5V Operating current: 150MA Output method: DO interface for digital output, AO interface for analog output Read method: ADC Number of pins: 4 Pin (2.54mm pitch header)
View Materials
The MQ-3 gas sensor has high sensitivity to alcohol and can resist the interference of gasoline, smoke, and water vapor. This sensor can detect a variety of alcohol concentrations and is a low-cost sensor suitable for various applications.
Its corresponding schematic diagram is shown in Figure 2.31.3.1-2. The AO output is the voltage directly output by the MQ-3 sensor, so it is analog; DO is the high/low level output after voltage comparison by LM393, so it is digital. For the specific principle, please refer to 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. Just note that here we change the file names bsp_dht11.c and bsp_dht11.h to bsp_mq3.c and bsp_mq3.h, and the folder name to MQ3.
Write Code
In the file bsp_mq3.c, 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-05 LCKFB-lp first version
*/
#include "bsp_mq3.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);
}
void delay_1ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_1us(unsigned int us)
{
ets_delay_us(us);
}
/******************************************************************
* Function Name: ADC_DMA_Init
* Function Description: Initialize ADC+DMA function
* Function Parameters: None
* Function Return: None
* Author: LC
* Notes: None
******************************************************************/
void ADC_MQ3_Init(void)
{
gpio_config_t flame_config = {
.pin_bit_mask = (1ULL<<MQ3_DO_PIN), //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 it can correctly calculate conversion results and compensation factors
esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
}
/******************************************************************
* Function Name: Get_Adc_Dma_Value
* Function Description: Calculate the average value of DMA saved data and output
* Function Parameters: CHx which scan data
* Function Return: Corresponding scanned ADC value
* Author: LC
* Notes: None
******************************************************************/
unsigned int Get_Adc_MQ3_Value(char CHx)
{
unsigned char i = 0;
unsigned int AdcValue = 0;
/* Because it collects 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_MQ3_Percentage_value
* Function Description: Read MQ3 value and return percentage
* Function Parameters: None
* Function Return: Returns percentage
* Author: LC
* Notes: None
******************************************************************/
unsigned int Get_MQ3_Percentage_value(void)
{
int adc_max = 4095;
int adc_new = 0;
int Percentage_value = 0;
adc_new = Get_Adc_MQ3_Value(channel);
Percentage_value = ((float)adc_new/adc_max) * 100;
return Percentage_value;
}
/******************************************************************
* Function Name: Get_MQ3_DO_value
* Function Description: Get the level status of the MQ3 DO pin
* Function Parameters: None
* Function Return: 0=No alcohol value above sensitivity detected 1=Alcohol value above sensitivity detected
* Author: LC
* Notes: Adjust the sliding resistor on the module to adjust the sensitivity
******************************************************************/
char Get_MQ3_DO_value(void)
{
if( gpio_get_level(MQ3_DO_PIN) == 0 )
{
return 0;
}
else
{
return 1;
}
}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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
In the file bsp_mq3.h, 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-05 LCKFB-lp first version
*/
#ifndef _BSP_MQ3_H_
#define _BSP_MQ3_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 MQ3_AO_PIN 1
#define MQ3_DO_PIN 2
#define DEFAULT_VREF 1100 //Default reference voltage, unit mV
#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 ADC_MQ3_Init(void);
unsigned int Get_Adc_MQ3_Value(char CHx);
unsigned int Get_MQ3_Percentage_value(void);
char Get_MQ3_DO_value(void);
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void delay_1us(unsigned int us);
void delay_1ms(unsigned int ms);
#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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Porting Verification
In the main function of your 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-05 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_mq3.h"
void app_main(void)
{
ADC_MQ3_Init();
printf("MQ3 demo start\r\n");
while(1)
{
printf("%d%%\r\n", Get_MQ3_Percentage_value() );
delay_1ms(1000);
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Power-on effect:
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.