一、器件外观
二、模块概述
MQ-2 气体传感器使用的气敏材料是在清洁空气中电导率较低的二氧化锡 (SnO2) 。当传感器所处环境中存在烟雾气体时,传感器的电导率随空气中烟雾气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-2 气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种烟雾气体,是一款适合多种应用的低成本传感器。
三、接口说明
管脚编号 | 名称 | 功能 |
1 | VCC | 外接3.3v-5.0v电压 |
2 | GND | 接地线 |
3 | DOUT | 开关信号输出(0和1) |
4 | AOUT | 模拟电压输出 |
注意事项:
1. 可以调节电位器,调节固定的阈值,然后根据阈值可以让 D0 口输出 1 或者 0例如:调节阈值为 1.5v, 那么输出大于 1.5v 的值,则 D0 口输出 0,输出小于 1.5v 的值,则 D0 输出 1。2.电源极性不能接反,否则可能将芯片烧坏。3.AOUT为数据输出引脚,它可以输出为电压值,也可以输出烟雾气体浓度的百分比,具体得看代码的转换
四、模块功能实现流程图
该流程图是通过上面的转换公式,把数字量转化为电压值,如果器件供电为5V,则公式为:Vx=(5*数字量)/4096,如果想转为浓度的百分比则为:(100*数字量)/4096
四、代码实现
MCU只能去处理数字量,但是MCU不能去处理一些多值数据(模拟量),如果需要处理模拟量,需要借助模数转换器(ADC)进行转换,把模拟量转换为MCU可以处理的离散数字量。多数使用在传感器,和音频处理中。
所以在本次的MQ2烟雾浓度监测的实现采用的就是ADC模数转化,将检测到的数字量通过ADC转换为模拟量,下面是代码演示
#include "adc.h"
/***********************
函数名:ADC1_Init
函数功能:模数转换初始化
形参:void
返回值:void
函数说明:
烟雾浓度 ---PA5--ADC12_IN5
************************/
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//连续转化模式设置
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据左对齐
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//软件触发
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式
ADC_InitStructure.ADC_NbrOfChannel=1;//通道数
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式禁止设置
ADC_Init(ADC1,&ADC_InitStructure);
//ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
ADC_Cmd(ADC1,ENABLE);//使能指定ADC外设
ADC_ResetCalibration(ADC1);//使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1);//开启AD校准
ADC_GetCalibrationStatus(ADC1);//等待AD校准结束
}
/***********************
函数名:get_Adc_Value
函数功能:换取采样值
形参:u8 ch
返回值:u16
函数说明:
ch 转换通道 ADC_SampleTime_239Cycles5采样时间值 采样时间选择最长
1 采样通道数量
烟雾浓度 ---PA5--ADC12_IN5
************************/
u16 get_Adc_Value(u8 ch)//通道一采样值
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//ADC匹配通道
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//ADC软件转换启动
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待采样结束
return ADC_GetConversionValue(ADC1);//放回采样值
}
/***********************
函数名:Get_smog_Value
函数功能:烟雾浓度
形参:void
返回值:void
函数说明:
烟雾浓度 ---PA5--ADC12_IN5---0x05
************************/
u8 smog_value;
u8 buf3[20];
u8 light_flag=0;
void Get_smog_Value(void)
{
smog_value=0;
u16 Rec=0;
Rec=get_Adc_Value(0x05);//获取采样数值
smog_value = ((100 * Rec)/4096)-5;//烟雾浓度百分比
sprintf((char *)buf3,"smog:%ddB/m",smog_value);
if(light_flag ==0)
{
Oled_ShowAll(6,0,buf3);//显示中英字符串
}
}
以上就是烟雾浓度代码的实现,只需要调用对应的函数则可获得对应的数值,并显示在OLED屏幕上。