MQ-2烟雾浓度传感器

这篇具有很好参考价值的文章主要介绍了MQ-2烟雾浓度传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本实验将采集到的传感器数据利用ADC转换,将转换后的电压值显示在串口调试助手上

一、模块简介

MQ-2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当烟雾传感器所处环境中存在可燃气体时,烟雾传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该烟雾传感器气体浓度相对应的输出信号。

MQ-2烟雾浓度传感器

MQ-2气体烟雾传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种气体传感器可检测多种可燃性气体,是一款适合多种应用的低成本烟雾传感器。

1. 模块特性:
MQ-2烟雾传感器在较宽的浓度范围内对可燃气体有良好的灵敏度
对液化气、丙烷、氢气 的灵敏度较高
长寿命、低成本
简单的驱动电路即可

2. 主要应用:
家庭用气体泄漏报警器
工业用可燃烟雾气体报警器
便携式烟雾气体检测器

3. 产品参数:

型号 QT-MQ-2
工作电压 DC5v
工作电流 150mA
产品类型 半导体器敏元器件
检测气体 烟雾、液化石油气、天然气和丙烷等
检测浓度 300~10000ppm(可燃气体)
尺寸 32mm×20mm×22mm
输出 支持开关数字信号、浓度模拟信号输出
重量 7.4g

二、工作原理

MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~3000摄氏度时,二氧化锡表面吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从面使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至面变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息烟雾浓度越大导电率越大,输出电阻越低,则输出的模拟信号就越大。
MQ-2烟雾浓度传感器

1. 引脚说明:
VCC:电源正极接口,可外接3.3~5v供电电源
GND:电源负极接口,可外接电源负极或地线(GND)
DO:数字信号输出接口(0和1),可外接单片机的GPIO
AO:模拟信号输出接口,可外接单片的ADC采样通道

2. 硬件连接:

模块引脚 GPIO
VCC 3.3V / 5V
GND GND
DO NC(空)
AD PA1

用杜邦线把模块的VCC和GND分别与单片机的3.3V(或5V)和GND连接;
把DO与单片机的其中一个GPIO连接;
把AD与单片机的其中一个ADC采样通道连接。

注:传感器通电后,需要先预热约60s后测量的数据才稳定。通电后传感器会出现正常的轻度发热现象,因为内部有电热丝。

3. 烟雾检测
当可燃气体浓度小于指定的阈值时,DO输出高电平,大于指定的阈值时则输出低电平。

4. 阈值调节
模块中蓝色的电位器是用于调节阀值,顺时针旋转,阈值会越大,逆时针越小。

5. 使用AO接口
与DO不同,AO会输出模拟信号,因此需要与单片机的ADC采样通道连接。单片机可以通过此模拟信号来获取可燃气体浓度大小。

6. 原理图
MQ-2烟雾浓度传感器

三、程序设计

ADC

 #include "adc.h"
 #include "delay.h"
   
		   
//初始化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_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的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;
} 	 

USART

#include "sys.h"
#include "usart.h"	  

#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 

/*使用microLib的方法*/
 /* 
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
   
    return ch;
}
int GetKey (void)  { 

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/
 
#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	  
  
void uart_init(u32 bound)
{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟

	//USART1_TX   GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

	//USART1_RX	  GPIOA.10初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

	//USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 
#if SYSTEM_SUPPORT_OS 	//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntExit();  											 
#endif
} 
#endif	

main

int main(void)
 {	 
  u16 adcx;
	float temp;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200			 	
 	Adc_Init();		  		//ADC初始化

       
	while(1)
	{

		adcx=Get_Adc_Average(ADC_Channel_1,10);
		printf("\r\n ADC模拟信号为: %d \r\n\r\n",adcx);   //ADC的值
		temp=adcx*(3.3/4096);    
		printf("\r\n 数字电压为: %f \r\n\r\n",temp);//电压值
		 
		delay_ms(250);	
	}
 }

MQ-2烟雾浓度传感器文章来源地址https://www.toymoban.com/news/detail-454201.html

到了这里,关于MQ-2烟雾浓度传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MQ2烟雾传感器 - STM32F103C8T6-HAL库

    ADC.c 文件 ADC.h文件 main函数中的调用

    2024年04月26日
    浏览(15)
  • STM32开发——ADC(烟雾传感器)

    目录 1.ADC简介 2.项目简介 3.CubeMX设置 4.函数代码 作用:用于读取电压值,然后转换为数字量传给单片机,单片机再通过计算,可以得到电压值。  ADC的性能指标 量程:能测量的电压范围 分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如:8、10、12、1

    2024年02月09日
    浏览(15)
  • LabVIEW-模拟传感器采集数据并预测数据

    已知某传感器过去的一段时间内采集的数据为d1,d2,d3,......,dn,现欲以m点的数据宽度,预测 tao 步后的数据值,即将一维的时间序列数据重构为如下m+1列的形式: d(1)    d(2 )   .......    d(m),        d(m+tao) d(2)    d(3 )   .......    d(m+1),    d(m+tao+1) ......................

    2024年02月16日
    浏览(19)
  • STM32读取MQ2烟雾浓度数据判断烟雾是否超标

    MQ2传感器是一种可探测多种气体的传感器,常用于监测烟雾、液化气、丙酮、乙醇、甲醛、天然气等有害气体。MQ2传感器基于半导体敏感元件,通过检测气体中有害物质的浓度变化来实现气体检测。 MQ2传感器具有以下特点: 可靠性高:采用优质半导体敏感元件,响应速度快

    2024年02月16日
    浏览(16)
  • STM32学习记录——烟雾传感器的使用

    文章目录 前言 一、学习目的 二、模块介绍 三、代码记录 总结        这次记录一下烟雾传感器的学习,由于烟雾传感器的资料比较杂,算法比较多,对我来说也比较难,所以我的代码中算法部分是不太具有参考价值,但是也可以做到随烟雾浓度的变化数值呈线性相关,以

    2024年02月09日
    浏览(18)
  • Java采集传感器数据,亲测有效!

    先说背景 , 最近公司项目需要用到传感器,采集设备温湿度,倾斜角,电流…,公司采购采购了一个温湿度传感器给我们开发测试使用,如下图: 看着还挺精致有没有。 有了这个温湿度传感器,我们如何读取其采集到的数据呢。需要一个 RS485转串口工具 ,下面这个蓝色的

    2024年01月15日
    浏览(21)
  • ARM开发,stm32mp157a-A7核IIC实验(采集温湿度传感器值)

    ---iic.h封装时序协议头文件--- ---iic.c封装时序函数实现--- ---si7006.h读取温湿度头文件--- ---si7006.c读取温湿度函数--- ---main.c主函数测试---

    2024年02月11日
    浏览(16)
  • 车载测试:详解ADAS传感器(相机)标定数据采集方法

    1.基本原理 相机外参标定,通过拍摄多角度棋盘格标定相机外参。 2.外参标定板设计 标定板分为垂直标定板和水平标定板,由于地面的水平标定板不容易被检测到,本文采用垂直标定板进行相机标定。 在标定过程中标定板需要和车身坐标成正交状态,也就是标定板垂直边需

    2024年02月13日
    浏览(34)
  • 【物联网】MPU6050传感器数据采集与滤波算法

    当谈到嵌入式电子设备和机器人的姿态控制和运动检测时,MPU6050往往是一个备受关注的传感器模块。它是一款小巧但功能强大的六轴传感器,集成了三轴加速度计和三轴陀螺仪。在本博客中,我们将详细介绍MPU6050的特点、工作原理以及与stm32配合的使用方法,后面看情况更新

    2024年02月14日
    浏览(16)
  • STM32+DHT11采集温湿度传感器数据

            DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅

    2024年02月07日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包