基于STM32单片机的MQ-2烟雾气体模块并显示在OLED屏幕上

一、器件外观

二、模块概述  

MQ-2 气体传感器使用的气敏材料是在清洁空气中电导率较低的二氧化锡 (SnO2) 。当传感器所处环境中存在烟雾气体时,传感器的电导率随空气中烟雾气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-2 气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种烟雾气体,是一款适合多种应用的低成本传感器。

三、接口说明 

管脚编号名称功能
1VCC外接3.3v-5.0v电压
2GND接地线
3DOUT开关信号输出(0和1)
4AOUT模拟电压输出

注意事项:

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屏幕上。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯之王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值