mq2 gas sensor
Posted: Tue Apr 05, 2022 4:08 pm
Hello all, I am using an example sketch (adc1_example_main.c) from idf framework. I am using `ADC_CHANNEL_0` (not channel 6 like in sketch) which I presume corresponds to the "VP" pin on the esp32 wroom. I am trying to read the analog output from the mq2 sensor but nothing changes in terms of readings. I get a stagnant "Raw: 4095 Voltage 1063mV" reading from the sketch. The levels drop if i change the pin to an incorrect one so I assume everything is connected properly. Please if anyone might have some insight I would be so thankful!
- /* ADC1 Example
- This example code is in the Public Domain (or CC0 licensed, at your option.)
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "driver/gpio.h"
- #include "driver/adc.h"
- #include "esp_adc_cal.h"
- #define DEFAULT_VREF 1100 //Use adc2_vref_to_gpio() to obtain a better estimate
- #define NO_OF_SAMPLES 64 //Multisampling
- static esp_adc_cal_characteristics_t *adc_chars;
- #if CONFIG_IDF_TARGET_ESP32
- static const adc_channel_t channel = ADC_CHANNEL_6; //GPIO34 if ADC1, GPIO14 if ADC2
- static const adc_bits_width_t width = ADC_WIDTH_BIT_12;
- #elif CONFIG_IDF_TARGET_ESP32S2
- static const adc_channel_t channel = ADC_CHANNEL_6; // GPIO7 if ADC1, GPIO17 if ADC2
- static const adc_bits_width_t width = ADC_WIDTH_BIT_13;
- #endif
- static const adc_atten_t atten = ADC_ATTEN_DB_0;
- static const adc_unit_t unit = ADC_UNIT_1;
- static void check_efuse(void)
- {
- #if CONFIG_IDF_TARGET_ESP32
- //Check if TP is burned into eFuse
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
- printf("eFuse Two Point: Supported\n");
- } else {
- printf("eFuse Two Point: NOT supported\n");
- }
- //Check Vref is burned into eFuse
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
- printf("eFuse Vref: Supported\n");
- } else {
- printf("eFuse Vref: NOT supported\n");
- }
- #elif CONFIG_IDF_TARGET_ESP32S2
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
- printf("eFuse Two Point: Supported\n");
- } else {
- printf("Cannot retrieve eFuse Two Point calibration values. Default calibration values will be used.\n");
- }
- #else
- #error "This example is configured for ESP32/ESP32S2."
- #endif
- }
- static void print_char_val_type(esp_adc_cal_value_t val_type)
- {
- if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
- printf("Characterized using Two Point Value\n");
- } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
- printf("Characterized using eFuse Vref\n");
- } else {
- printf("Characterized using Default Vref\n");
- }
- }
- void app_main(void)
- {
- //Check if Two Point or Vref are burned into eFuse
- check_efuse();
- //Configure ADC
- if (unit == ADC_UNIT_1) {
- adc1_config_width(width);
- adc1_config_channel_atten(channel, atten);
- } else {
- adc2_config_channel_atten((adc2_channel_t)channel, atten);
- }
- //Characterize ADC
- adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
- esp_adc_cal_value_t val_type = esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
- print_char_val_type(val_type);
- //Continuously sample ADC1
- while (1) {
- uint32_t adc_reading = 0;
- //Multisampling
- for (int i = 0; i < NO_OF_SAMPLES; i++) {
- if (unit == ADC_UNIT_1) {
- adc_reading += adc1_get_raw((adc1_channel_t)channel);
- } else {
- int raw;
- adc2_get_raw((adc2_channel_t)channel, width, &raw);
- adc_reading += raw;
- }
- }
- adc_reading /= NO_OF_SAMPLES;
- //Convert adc_reading to voltage in mV
- uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
- printf("Raw: %d\tVoltage: %dmV\n", adc_reading, voltage);
- vTaskDelay(pdMS_TO_TICKS(1000));
- }
- }