MQ-2 烟雾传感器 ESP32-S3 驱动实战:ADC 读取与阈值校准 3 步完成
2026/7/11 23:59:58 网站建设 项目流程

MQ-2 烟雾传感器 ESP32-S3 驱动实战:ADC 读取与阈值校准 3 步完成

在智能家居和工业安全监测领域,烟雾检测是一个至关重要的环节。MQ-2 作为一款高性价比的半导体烟雾传感器,因其对多种可燃气体(如液化气、丙烷、氢气等)的高灵敏度检测能力而广受欢迎。本文将聚焦于如何在 ESP32-S3 平台上快速实现 MQ-2 传感器的驱动开发,从硬件连接到软件实现,再到数据校准,带你三步完成一个可靠的烟雾检测系统。

1. 硬件连接与传感器预热

1.1 MQ-2 传感器工作原理

MQ-2 采用二氧化锡(SnO2)作为气敏材料,其电导率会随环境中可燃气体浓度的增加而升高。传感器内部包含微型加热器,需要预热至 200-300℃ 才能正常工作。这一特性决定了我们在使用前必须进行充分的预热。

关键参数对比表

参数典型值说明
工作电压5V±0.1V加热器与回路电压
加热电流≤150mA预热阶段最大电流
预热时间≥20秒建议预热 1-2 分钟更稳定
检测范围300-10000ppm可燃气体浓度范围
响应时间<10秒90% 响应时间

1.2 ESP32-S3 连接方案

ESP32-S3 的 ADC 输入范围通常为 0-3.3V,而 MQ-2 的模拟输出(AO)在 5V 供电下可能超过此范围。推荐以下两种连接方式:

方案一:电阻分压电路

# 分压计算(R1=10kΩ, R2=20kΩ) Vout = Vin * (R2 / (R1 + R2)) # 5V -> 3.33V

方案二:直接连接注意事项

  • 确保传感器 AO 输出不超过 3.3V
  • 可串联 1kΩ 电阻保护 ADC 引脚

推荐接线表

MQ-2 引脚ESP32-S3 连接说明
VCC5V需外部 5V 电源
GNDGND共地连接
AOGPIO1 (ADC1_CH0)模拟信号输出
DOGPIO2数字阈值输出(可选)

提示:实际开发中,建议先使用万用表测量 AO 引脚电压范围,确保不超过 ESP32-S3 的 ADC 最大输入电压。

2. 软件驱动实现

2.1 ADC 配置与数据采集

ESP32-S3 的 ADC 具有 12 位分辨率,但实际有效位数(ENOB)约为 11 位。我们需要配置适当的衰减参数来匹配输入电压范围。

关键代码实现

#include "driver/adc.h" #include "esp_adc_cal.h" #define MQ2_ADC_CHANNEL ADC1_CHANNEL_0 #define DEFAULT_VREF 1100 // 单位mV void adc_init() { adc1_config_width(ADC_WIDTH_BIT_12); adc1_config_channel_atten(MQ2_ADC_CHANNEL, ADC_ATTEN_DB_11); // ADC 特性校准 esp_adc_cal_characteristics_t *adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t)); esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars); } uint32_t read_adc() { uint32_t adc_reading = 0; // 多次采样取平均 for (int i = 0; i < 64; i++) { adc_reading += adc1_get_raw(MQ2_ADC_CHANNEL); } return adc_reading >> 6; // 64次平均 }

2.2 数字滤波处理

传感器输出常含有噪声,推荐采用移动平均滤波结合中值滤波的方案:

#define FILTER_WINDOW_SIZE 10 typedef struct { uint16_t buffer[FILTER_WINDOW_SIZE]; uint8_t index; } filter_t; uint16_t filter_reading(filter_t *filter, uint16_t new_value) { filter->buffer[filter->index] = new_value; filter->index = (filter->index + 1) % FILTER_WINDOW_SIZE; // 计算移动平均 uint32_t sum = 0; for (int i = 0; i < FILTER_WINDOW_SIZE; i++) { sum += filter->buffer[i]; } return sum / FILTER_WINDOW_SIZE; }

2.3 加热器控制优化

为降低功耗,可采用间歇加热模式:

void heater_control(bool enable) { gpio_set_level(HEATER_GPIO, enable); if (enable) { // 首次加热延迟2分钟 vTaskDelay(pdMS_TO_TICKS(120000)); } else { // 关闭加热器后延迟10秒再读取 vTaskDelay(pdMS_TO_TICKS(10000)); } }

3. 阈值校准与浓度换算

3.1 三点校准法

在清洁空气和两种已知浓度气体环境下采集数据:

  1. 清洁空气基准值

    Ro = Rs_air / 9.8 # 对于MQ-2,空气中RS/RO约9.8
  2. 1000ppm 丙烷测试

    Rs_gas = (Vcc - Vout) * RL / Vout ratio = Rs_gas / Ro
  3. 建立浓度-电阻比曲线

    float get_gas_concentration(float ratio) { // MQ-2 特性曲线近似公式 float ppm = pow(10, (log10(ratio) - 0.42) / -0.38); return ppm; }

典型校准数据表

气体类型浓度 (ppm)电阻比 (Rs/Ro)
清洁空气09.8±2.5
丙烷10002.0±0.5
甲烷50000.8±0.2

3.2 温度补偿

由于传感器性能受温度影响,建议添加温度补偿:

float temperature_compensation(float raw_ppm, float temp_c) { // 温度补偿系数 (典型值) const float alpha = 0.05; // %/°C return raw_ppm * (1 + alpha * (25 - temp_c)); }

3.3 报警阈值设置

根据应用场景设置多级报警:

#define WARNING_LEVEL 300 // ppm #define DANGER_LEVEL 2000 // ppm void check_alarm(float ppm) { if (ppm > DANGER_LEVEL) { // 触发紧急报警 gpio_set_level(ALARM_GPIO, 1); } else if (ppm > WARNING_LEVEL) { // 触发预警 gpio_set_level(WARNING_GPIO, 1); } else { // 正常状态 gpio_set_level(ALARM_GPIO, 0); gpio_set_level(WARNING_GPIO, 0); } }

4. 实战优化技巧

4.1 长期稳定性处理

  • 自动基线校准:每24小时在确认环境清洁时自动更新Ro值
  • 老化补偿:记录传感器使用时间,按每月0.5%调整灵敏度

4.2 电源管理

void power_saving_mode() { // 间歇工作模式:加热10分钟,休眠50分钟 while(1) { heater_control(true); vTaskDelay(pdMS_TO_TICKS(600000)); // 工作10分钟 heater_control(false); esp_sleep_enable_timer_wakeup(3000000000); // 休眠50分钟 esp_deep_sleep_start(); } }

4.3 ESP32-S3 特有优化

  • 使用 ADC DMA 模式实现连续采样
  • 利用 RMT 外设实现精确的加热器 PWM 控制
  • 通过 WiFi 实现远程校准和阈值调整
// ADC DMA 配置示例 adc_digi_init_config_t adc_dma_config = { .max_store_buf_size = 1024, .conv_num_each_intr = 256, .adc1_chan_mask = BIT(MQ2_ADC_CHANNEL), .adc2_chan_mask = 0, }; adc_digi_initialize(&adc_dma_config);

在实际项目中,我们发现 ESP32-S3 的 ADC 在 11dB 衰减下,对 0-3.3V 信号的线性度最佳。通过采用上述方案,系统可以实现 ±5% 的浓度检测精度,完全满足大多数烟雾报警应用的需求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询