MQ-2烟雾传感器代码(STM32单片机驱动)
·
MQ-2烟雾传感器代码(STM32单片机驱动)
MQ-2烟雾传感器简介
MQ-2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当烟雾传感器所处环境中存在可燃气体时,烟雾传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该烟雾传感器气体浓度相对应的输出信号。
在使用时,会使用单片机的ADC采集对其进行信号采集
该传感器可以输出模拟信号和数字信号,本文使用的是模拟信号
MQ-2烟雾传感器采用在清洁空气中电导率较低的二氧化锡(SnO2),属于表面离子式N型半导体。当MQ-2烟雾传感器在200到300摄氏度环境时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。MQ-2烟雾传感器的探测范围极其的广泛,常用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。
MQ-2具有以下特点:
具有信号输出指示。
双路信号输出(模拟量输出及TTL电平输出)
TTL输出有效信号为低电平,当输出低电平时信号灯亮,可直接接单片机。
模拟量输出0~5V电压,浓度越高电压越高。
对液化气,天然气,城市煤气有较好的灵敏度。
具有长期的使用寿命和可靠的稳定性。
快速的响应恢复特性。
接线
使用了STM32F103ZET6单片机作为MCU,接线引脚为PA1,使用了单片机内部的ADC
三级目录
MQ2.C
//--------------------------------------------------------------------------------------------------
// 包含的头文件 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
//--------------------------------------------------------------------------------------------------
#include "MQ2.h"
#include "main.h"
//
/*
* 作者:PrairieOne
* csdn:PrairieOne
* 邮箱:prairieone1024@163.com
* 嵌入式技术交流群:738655377
*/
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
u16 MQ2_Value;
u8 temp_one;
void MQ2_Check(void)
{
MQ2_Value=Get_Adc_Average(ADC_Channel_1,10);
LCD_ShowString(0,152,48,16,16,"Smog:");
temp_one=((MQ2_Value*100)/4000)/10;
numToString(temp_one);
printf("Smog: %s\r\n\r\n", strValue);
LCD_ShowString(48,152,32,16,16,(u8 *)strValue);
LCD_ShowString(80,152,32,16,16,"%");
LCD_ShowString(0,168,80,16,16,"Smog Warn:");
esp8266_str_data("Smog", strValue);
if(temp_one>4)
{
Beep_One=0;
LCD_ShowString(80,168,48,16,16,"Warn");
}
else
{
Beep_One=1;
LCD_ShowString(80,168,48,16,16," ");
}
}
MQ2.H
#ifndef __MQ2_H
#define __MQ2_H
#include "sys.h"
void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
void MQ2_Check(void);
#endif
遇事不决,可问春风
交流群:583914666
更多推荐
已为社区贡献3条内容
所有评论(0)