1. MQ-2烟雾传感器模块概述
MQ-2烟雾传感器是工业级可燃气体检测的经典方案,采用半导体气敏材料SnO2作为核心元件。这个火柴盒大小的模块在家庭安防、工业监测领域已经服役超过15年,我经手过的智能家居项目中80%的烟雾报警器都基于这个方案。它的核心优势在于对液化气、丙烷、氢气的高灵敏度(0.1-10mg/L),同时兼顾烟雾颗粒检测功能。
模块的工作温度范围-20℃~50℃,适合绝大多数室内环境。典型应用场景包括:
- 厨房燃气泄漏监测(响应时间<10秒)
- 地下室CO浓度检测
- 工厂车间烟雾预警系统
- 智能消防联动装置
2. 硬件设计与接口说明
2.1 模块电路解析
MQ-2采用经典的惠斯通电桥结构,核心元件是表面镀有SnO2的陶瓷管。当可燃气体接触敏感材料时,SnO2的导电率会随气体浓度升高而增大,导致电桥输出变化。模块内置的LM393比较器将模拟信号转换为数字输出,同时保留AO模拟输出引脚。
关键电路参数:
- 加热电阻:31Ω±3Ω(工作电流约130mA)
- 负载电阻:10kΩ(影响灵敏度)
- 预热时间:≥24小时(首次使用)
注意:模块需要持续通电预热才能稳定工作,冷启动时读数会有明显漂移
2.2 STM32接口方案
推荐使用STM32F103C8T6最小系统板,接线方式:
| MQ-2引脚 | STM32连接点 | 备注 |
|---|---|---|
| VCC | 5V输出 | 需独立LDO供电 |
| GND | GND | 共地 |
| DO | PA0 | 数字输出(可接中断) |
| AO | PA1 | ADC1通道1 |
ADC采样建议配置:
- 12位分辨率
- 连续转换模式
- 采样周期:239.5周期
- 启用DMA传输
c复制// ADC初始化代码片段
void ADC1_Init(void) {
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
3. 软件算法实现
3.1 浓度标定方法
MQ-2的电阻比(Rs/R0)与气体浓度呈非线性关系,需要分段处理:
- 获取洁净空气中的R0值:
c复制float Get_R0(void) {
float adc_sum = 0;
for(int i=0; i<50; i++) {
adc_sum += ADC_GetValue();
Delay_ms(100);
}
float RL = 10.0; // 负载电阻10kΩ
return (1023.0/(adc_sum/50)-1)*RL;
}
- 浓度计算公式(以丙烷为例):
code复制Rs/R0 = 1.8 * C^-0.42
其中:
C为气体浓度(ppm)
Rs = (1023/ADC_Value -1)*RL
3.2 数字滤波处理
传感器输出存在±5%的波动,推荐采用滑动加权滤波:
c复制#define FILTER_LEN 10
float gas_filter[FILTER_LEN] = {0};
float Weighted_Filter(float new_val) {
static int index = 0;
float sum = 0, weight_sum = 0;
gas_filter[index] = new_val;
index = (index + 1) % FILTER_LEN;
for(int i=0; i<FILTER_LEN; i++) {
float weight = 1.0/(abs(i-index)+1); // 距离当前值越近权重越高
sum += gas_filter[i] * weight;
weight_sum += weight;
}
return sum/weight_sum;
}
4. 实战调试技巧
4.1 灵敏度校准
-
使用标准气体(2000ppm丙烷)测试时:
- 旋转模块背面的电位器,直到DO指示灯刚好点亮
- 记录此时AO电压值作为报警阈值
-
温度补偿方法:
c复制float Temp_Compensation(float raw_adc, float temp) {
// 温度系数:-0.3%/℃
return raw_adc * (1 + 0.003*(temp - 20));
}
4.2 常见故障排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 读数持续为0 | 加热丝断路 | 更换模块 |
| ADC值剧烈跳动 | 电源干扰 | 增加100uF电解电容 |
| 响应速度变慢 | 气孔堵塞 | 用酒精棉清洁白色防护罩 |
| 数字输出不动作 | 比较器基准电压偏移 | 重新调节蓝色电位器 |
5. 进阶应用设计
5.1 多传感器融合方案
在智能家居系统中,建议组合使用:
- MQ-2:检测可燃气体
- MQ-7:专门监测CO
- SHT30:温湿度补偿
数据融合算法:
c复制#define GAS_WEIGHT 0.6
#define CO_WEIGHT 0.3
#define HUM_WEIGHT 0.1
float Risk_Assessment(float gas, float co, float hum) {
// 湿度>70%时降低燃气灵敏度
if(hum > 70) gas *= 0.8;
return GAS_WEIGHT*gas + CO_WEIGHT*co - HUM_WEIGHT*hum;
}
5.2 低功耗设计
电池供电场景下的优化策略:
-
间歇工作模式:
- 加热:5V/130mA,持续30秒
- 采样:3.3V/10mA,持续2秒
- 休眠:<50uA
-
硬件改造:
- 将加热电阻改为PWM控制
- 增加MOSFET开关电路
c复制void Power_Save_Mode(void) {
GPIO_SetBits(HEAT_CTRL_GPIO, HEAT_CTRL_PIN); // 开启加热
Delay_ms(30000);
GPIO_ResetBits(HEAT_CTRL_GPIO, HEAT_CTRL_PIN);
ADC_GetValue(); // 采样
__WFI(); // 进入停止模式
}
实际项目中,配合STM32的停机模式(Stop Mode)可将整体功耗控制在1mA以下,使纽扣电池供电成为可能。我在一个智能烟感产品中采用这种方案,CR2032电池可以持续工作18个月。
