#include "MQ-2.h" #include "esp_adc/adc_oneshot.h" #include "esp_check.h" #define MQ2_ADC_UNIT ADC_UNIT_1 #define MQ2_ADC_CHANNEL ADC_CHANNEL_7 #define MQ2_SAMPLE_COUNT 8 static const char *TAG = "MQ2"; static adc_oneshot_unit_handle_t s_adc_handle = NULL; static bool s_inited = false; esp_err_t mq2_init(void) { if (s_inited) { return ESP_OK; } adc_oneshot_unit_init_cfg_t init_cfg = { .unit_id = MQ2_ADC_UNIT, .ulp_mode = ADC_ULP_MODE_DISABLE, }; ESP_RETURN_ON_ERROR(adc_oneshot_new_unit(&init_cfg, &s_adc_handle), TAG, "adc new unit failed"); adc_oneshot_chan_cfg_t chan_cfg = { .atten = ADC_ATTEN_DB_12, .bitwidth = ADC_BITWIDTH_DEFAULT, }; ESP_RETURN_ON_ERROR(adc_oneshot_config_channel(s_adc_handle, MQ2_ADC_CHANNEL, &chan_cfg), TAG, "adc channel config failed"); s_inited = true; return ESP_OK; } esp_err_t mq2_read_raw(int *raw_out) { ESP_RETURN_ON_FALSE(raw_out != NULL, ESP_ERR_INVALID_ARG, TAG, "raw_out is null"); ESP_RETURN_ON_FALSE(s_inited, ESP_ERR_INVALID_STATE, TAG, "mq2 not inited"); int sum = 0; for (int i = 0; i < MQ2_SAMPLE_COUNT; ++i) { int sample = 0; ESP_RETURN_ON_ERROR(adc_oneshot_read(s_adc_handle, MQ2_ADC_CHANNEL, &sample), TAG, "adc read failed"); sum += sample; } *raw_out = sum / MQ2_SAMPLE_COUNT; return ESP_OK; } esp_err_t mq2_read_percent(float *percent_out) { ESP_RETURN_ON_FALSE(percent_out != NULL, ESP_ERR_INVALID_ARG, TAG, "percent_out is null"); int raw = 0; ESP_RETURN_ON_ERROR(mq2_read_raw(&raw), TAG, "read raw failed"); *percent_out = (raw * 100.0f) / 4095.0f; return ESP_OK; } bool mq2_is_alarm(float percent, float threshold_percent) { return percent >= threshold_percent; }