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

### STM32F103C8T6最小系统板连接MQ135气体传感器 #### 硬件连接说明 为了实现STM32F103C8T6与MQ135气体传感器的数据交互,需按照如下方式进行硬件连接: -MQ135气体传感器的VCC引脚连接至STM32的3.3V电源。 -MQ135气体传感器的GND引脚接到STM32的地线上。 - MQ135气体传感器的AO(模拟输出)应连接到STM32的一个ADC输入通道上,比如PA0[^1]。 对于串口调试或其他外设通信需求,则可以参照已有配置模式,如通过USART接口配合USB转TTL模块完成数据传输设置。 #### 示例代码展示 下面给出一段用于初始化读取来自MQ135传感器数值的基础程序框架。此部分假设已经完成了必要的库文件引入以及启动文件编写工作。 ```c #include "stm32f1xx_hal.h" // 定义使用的ADC通道号, 对应于PA0 #define ADC_CHANNEL 0 static void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); // 配置系统时钟 MX_GPIO_Init(); // 初始化GPIO端口 MX_ADC1_Init(); // 初始化ADC转换器 while (1) { uint32_t adcValue; /* 开始一次单次转换 */ if(HAL_OK == HAL_ADC_Start(&hadc1)){ if(HAL_OK == HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY)){ adcValue = HAL_ADC_GetValue(&hadc1); printf("ADC Value:%lu\r\n",adcValue); } } HAL_Delay(1000); // 延迟一秒再进行下一轮采样 } } /* ADC初始化函数 */ void MX_ADC1_Init(void){ hadc1.Instance = ADC1; ADC_ChannelConfTypeDef sConfig = {0}; // ADC参数配置... __HAL_RCC_ADC1_CLK_ENABLE(); hadc1.Init.ScanConvMode = DISABLE; // 单一通道模式 hadc1.Init.ContinuousConvMode= DISABLE; // 手动触发模式 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐 hadc1.Init.NbrOfConversion = 1; // 只有一个通道参与转换 if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(__FILE__, __LINE__); } /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_0; // 设置为第0通道即PA0 sConfig.Rank = 1; // 排序等级为第一个位置 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 设定采样时间为三个周期 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(__FILE__, __LINE__); } } ``` 上述代码实现了基本的功能——从指定的ADC通道获取电压值,将其打印出来供进一步分析处理。需要注意的是,在实际应用中可能还需要考虑更多细节问题,例如温度补偿算法的应用等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点灯之王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值