1、MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。 MQ-2气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。
2、MQ-2标准工作条件:
MQ-2传感器原理图:
3、MQ-2烟雾传感器模块特点:
- 具有信号输出指示。
- 双路信号输出(模拟量输出及TTL电平输出)。
- TTL输出有效信号为低电平。(当输出低电平时信号灯亮,可直接接单片机)
- 模拟量输出0~5V电压,浓度越高电压越高。
- 对液化气,天然气,城市煤气有较好的灵敏度。
- 结果受温湿度影响。
4、正常环境下(即没有被测气体),传感器以模拟量输出时,OUT端的电压在1v左右,当传感器检测到被测气体时,电压每升高0.1v,实际被测气体的浓度增加200ppm。(简单的说:1ppm = 1mg/kg = 1mg/L = 1x10-6常用来表示气体浓度,或者溶液浓度。)
特别提醒:传感器通电后,需要预热20s左右,测量的数据才稳定,传感器发热属于正常现象,因为内部有电热丝,如果烫手就不正常了。
5、Sensor_Smoke.c文件
#include "Sensor_Smoke.h"
/*传感器初始化*/
void MQ2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;//定义 GPIO 初始化结构体变量
ADC_InitTypeDef ADC_InitStruct;//定义 ADC初始化结构体变量
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);//使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能 ADC1 时钟
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;//模拟输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;// 上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);//初始化
ADC_DeInit(ADC1); //复位 ADC
ADC_StructInit(&ADC_InitStruct);//使用默认值填充 ADC_InitStruct成员
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续转换模式
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐
ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用外部触发
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; //12 位模式
ADC_Init(ADC1,&ADC_InitStruct);//ADC 初始化
ADC_ChannelConfig(ADC1,ADC_Channel_0,ADC_SampleTime_239_5Cycles);//选择 ADC 通道 0 周期采样时间
ADC_GetCalibrationFactor(ADC1); //校准 ADC
ADC_Cmd(ADC1,ENABLE);//ADC 使能
}
/*读取 ADC 转换后的值*/
uint16_t Get_ADCValue(void)
{
ADC_StartOfConversion(ADC1); //开启通道转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次转换的结果
}
/*MQ2传感器数据处理*/
float MQ2_GetPPM(void)
{
float MQ2_Value = 0.0f;
float MQ2_PPM = 0.0f;
MQ2_Value = ADC_Value *(3.3 / 4096);
MQ2_PPM = ((MQ2_Value - 1) /0.1) * 200;
return MQ2_PPM;
}
6、Sensor_human.h文件
#ifndef _SENSOR_SMOKE_
#define _SENSOR_SMOKE_
#include "stm32f0xx.h"
void MQ2_Init(void);
uint16_t Get_ADCValue(void);
float MQ2_GetPPM(void);
#endif
7、主函数
#include "Sensor_Smoke.h"
#include "delay.h"
#include "adc.h"
#include "usart.h"
#include <stdio.h>
int main()
{
MQ2_Init();//传感器初始化
USART1_init();//串口初始化
while(1)
{
printf("烟雾浓度为:%.2f ppm\n",MQ2_GetPPM());//计算烟雾浓度并通过串口打印
delay_ms(100);
}
}