MQ2烟雾传感器

article/2025/8/28 1:15:25

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

2、MQ-2标准工作条件:

 MQ-2传感器原理图:

 3、MQ-2烟雾传感器模块特点:

  • 具有信号输出指示。
  • 双路信号输出(模拟量输出及TTL电平输出)。
  • TTL输出有效信号为低电平。(当输出低电平时信号灯亮,可直接接单片机)
  • 模拟量输出0~5V电压,浓度越高电压越高。
  • 对液化气,天然气,城市煤气有较好的灵敏度。
  • 结果受温湿度影响。

4、MQ-2灵敏度特性曲线:

 

我们以LPG曲线为例,根据曲线图可以列出部分Rs/R0与ppm的对应值,如下:

Rs/R0

1.651428

1.437143

1.257143

1.137143

1

0.574393

0.415581

0.305119

0.254795

ppm

200

300

400

500

600

2000

4000

7000

10000

根据以上对应值可以求出Rs/R0与ppm的计算公式,如下(使用Excel生成的公式):

                                                             ppm = 613.9f * pow(RS/R0, -2.074f)

ppm:为可燃气体的浓度。

VRL:电压输出值。

Rs:器件在不同气体,不同浓度下的电阻值。

R0:器件在洁净空气中的电阻值。

RL:负载电阻阻值。

特别提醒:传感器通电后,需要预热20s左右,测量的数据才稳定,传感器发热属于正常现象,因为内部有电热丝,如果烫手就不正常了。

5、Sensor_Smoke.c文件

#define CAL_PPM 20  // 校准环境中PPM值
#define RL			5		// RL阻值
static float R0; // 元件在洁净空气中的阻值// 传感器初始化
void MQ2_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct; // 定义 GPIO 初始化结构体变量ADC_InitTypeDef ADC_InitStruct; // 定义 ADC初始化结构体变量DMA_InitTypeDef DMA_InitStruct; // 定义DMA初始化结构体变量	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); // 使能 GPIOA 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); // 使能 ADC1 时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能DMA时钟GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; // 模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;	// ADC通道引脚GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化ADC_DeInit(ADC1);  // 复位 ADCADC_StructInit(&ADC_InitStruct); // 使用默认值填充 ADC_InitStruct成员ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 连续转换模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 数据对齐ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 禁止触发检测,使用软件触发ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward; // 启动向上扫描模式 (from CHSEL0 to CHSEL17)ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; // 12 位模式ADC_Init(ADC1,&ADC_InitStruct); // ADC 初始化ADC_ChannelConfig(ADC1,ADC_Channel_0,ADC_SampleTime_239_5Cycles); // 配置ADC注入通道0及周期采样时间ADC_GetCalibrationFactor(ADC1);  // 校准 ADCADC_Cmd(ADC1,ENABLE); // ADC 使能 	DMA_DeInit(DMA1_Channel1); // 复位DMA_StructInit(&DMA_InitStruct);	DMA_InitStruct.DMA_BufferSize = 1; // 整体的数据个数DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; // 指定外设为发送源DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; // 关闭两个存储区互相访问DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&ADC_Value; // 存储区基地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 存储区每次接收两个字节DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; // 存储区地址自增DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // 开启循环模式DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; // 外设地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设每次传输两个字节DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不自增DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 设置通道转换优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct); // 初始化ADC_DMARequestModeConfig(ADC1,ADC_DMAMode_Circular); // 使能ADC的DMA循环转换模式DMA_Cmd(DMA1_Channel1, ENABLE); //DMA 使能	ADC_DMACmd(ADC1, ENABLE); // ADC DMA 使能	ADC_StartOfConversion(ADC1); // 开始 ADC1 转换}
/********************************************* 1.651428	          200               ** 1.437143	          300               ** 1.257143	          400               ** 1.137143	          500               ** 1		          600               ** 0.928704	          700               ** 0.871296	          800               ** 0.816667	          900               ** 0.785714	          1000              ** 0.574393	          2000              ** 0.466047	          3000              ** 0.415581	          4000              ** 0.370478	          5000              ** 0.337031	          6000              ** 0.305119	          7000              ** 0.288169	          8000              ** 0.272727	          9000              ** 0.254795	          10000             **                                      ** ppm = 613.9f * pow(RS/RL, -2.074f)   ****************************************/// 传感器校准函数
void MQ2_PPM_Calibration(float RS)
{R0 = RS / pow(CAL_PPM / 613.9f, 1 / -2.074f);
}// MQ2传感器数据处理
float MQ2_GetPPM(void)
{float Vrl = 3.3f * ADC_Value / 4095.f;float RS = (3.3f - Vrl) / Vrl * RL; if(boot_time_ms < 3000) // 获取系统执行时间,3s前进行校准{MQ2_PPM_Calibration(RS);}float ppm = 613.9f * pow(RS/R0, -2.074f);return  ppm;
}

6、Sensor_human.h文件

#ifndef _SENSOR_SMOKE_H_
#define _SENSOR_SMOKE_H_#include "stm32f0xx.h"void   MQ2_Init(void);
float MQ2_GetPPM(void);#endif

7、主函数

int main()
{MQ2_Init(); // 传感器初始化USART1_Init(); // 串口初始化SYSTICK_Init(1); // 滴答定时器初始化while(1){printf("smoke:%.2f ppm\n", MQ2_GetPPM());//计算烟雾浓度并通过串口打印SYSTICK_DelayMs(100);}
}

源码下载链接:https://download.csdn.net/download/qq_41422043/12202498


http://chatgpt.dhexx.cn/article/SEnF4OYL.shtml

相关文章

MQ-2烟雾传感器

一、MQ-2烟雾传感器简介 MQ-2常用于家庭和工厂的气体泄漏监测装置&#xff0c;适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此&#xff0c;MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点&#xff1a;灵敏度高、响应快、稳定性好、寿…

MQ-2烟雾浓度传感器(STM32F103)

本实验是通过串口调试助手显示STM32F103C8T6采集到MQ-2传感器的电压值。 一、 概述 1. 简介 MQ-2可用于家庭和工厂的气体泄漏监装置&#xff0c;适宜于液化气、丁烷、丙烷、甲烷、酒精、烟雾等的探测。它的优点是灵敏度高、响应快、稳定性好。寿命长、驱动电路简单以及方便安…

MQ-2烟雾传感器的原理及使用教程

一、MQ-2烟雾传感器简介 MQ-2常用于家庭和工厂的气体泄漏监测装置&#xff0c;适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此&#xff0c;MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点&#xff1a;灵敏度高、响应快、稳定性好、寿命…

MQ-2烟雾传感器的使用

一、MQ-2烟雾传感器简介 MQ-2烟雾传感器采用在清洁空气中电导率较低的二氧化锡(SnO2)&#xff0c;属于表面离子式N型半导体。当MQ-2烟雾传感器在200到300摄氏度环境时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&a…

MQ-2烟雾传感器模块功能实现(STM32)

认识MQ-2模块与其工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半导体。当处于200~300摄氏度时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&#xff0c;从而使其电阻值增加。…

MQ-2烟雾浓度传感器

文章目录 一、模块简介二、工作原理三、程序设计 本实验将采集到的传感器数据利用ADC转换&#xff0c;将转换后的电压值显示在串口调试助手上 一、模块简介 MQ-2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当烟雾传感器所处环境中存在可燃气体时&a…

python杨辉三角输出指定行_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...

如何用python输出杨辉三角 程序输出需要实现如下效果&#xff1a; [1] [1,1] [1,2,1] [1,3,3,1] .. 方法&#xff1a;迭代&#xff0c;生成器 123456789101112131415161718192021 def triangles() L [1] while True: yiled L L [1] [L[i] L[I1] for i in range(len(L)-1)] …

蓝桥杯 python 杨辉三角

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

python杨辉三角 简单方法

何为杨辉三角&#xff0c;杨辉三角就是&#xff0c;第一行与第二行分别为1和1,1 再往后第三行就有规律了&#xff0c;除了开头和结尾的数&#xff08;都是1&#xff09;&#xff0c;每个数都是自己左上角和右上角的和。如图&#xff1a; 如何用编程把它实现呢&#xff1f;我们…

Python 杨辉三角

前言&#xff1a;我在学习Python的时候&#xff0c;正好学到列表推导式&#xff0c;于是这里尝试运用列表推导式来写一个杨辉三角。如果能点出其中不足或提出优化建议&#xff0c;感激不尽。 杨辉三角&#xff1a;杨辉三角左右两侧的数字都是1&#xff0c;而里面的数字等于它肩…

python杨辉三角

题目 杨辉三角形&#xff0c;也称帕斯卡三角&#xff0c;其定义为&#xff1a;顶端是 1,视为(row0).第1行(row1)(1&1)两个1,这两个1是由他们上头左右两数之和 (不在三角形内的数视为0).依此类推产生第2行(row2):011;112;101.第3行(row3):011;123; 213;101. 循此法可以产生以…

Python程序:输出杨辉三角的几种办法

文章目录 一、问题描述二、问题分析三、第一种方法1、具体代码2、运行结果3、程序的改进 四、第二种方法1、具体代码2、运行结果 五、总结分析 一、问题描述 给定一个非负整数 n&#xff0c;生成「杨辉三角」的前 n行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方…

用python实现杨辉三角的几种不同方式

杨辉三角的概念 比较详细的知识可以看这里&#xff0c;在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 4 6 4 1/ \ / \ / \ / \ / \ 1 5 10 10 5 1解法1&#xff1a;动态规…

【杨辉三角python】

文章目录 杨辉三角实现方法&#xff08;Python&#xff09; 一、杨辉三角是什么&#xff1f;二、杨辉三角解法 杨辉三角实现方法&#xff08;Python&#xff09; 一、杨辉三角是什么&#xff1f; 杨辉三角&#xff0c;是二项式系数在三角形中的一种几何排列&#xff0c;中国南…

Python实现杨辉三角(2种实现方案)

杨辉三角形&#xff0c;又称贾宪三角形、帕斯卡三角形&#xff0c;是二项式系数在三角形中的一种几何排列。 下图显示了杨辉三角的前 7 行&#xff1a; 递归打印杨辉三角 杨辉三角形中的数&#xff0c;正是(xy)的 N 次方幂展开式各项的系数&#xff0c;下面以递归的方法来打印…

【Python实现杨辉三角】

目录 什么是杨辉三角 杨辉三角解法 1. 定义法 2. 计算杨辉三角 补0法 3. 杨辉三角&#xff0c;对称法 4. 杨辉三角&#xff0c;单列表方法 5.列表嵌套&#xff08;二维数组&#xff09; 6. 新旧两行&#xff0c;一次性开辟新行 7.yield函数 8.zip函数 参考资料链接&…

c++自定义函数

对于小型应用程序来说不设计自定义函数完全可行&#xff0c;但随着程序越来越大&#xff0c;越来越复杂&#xff0c;实现的功能越来越多&#xff0c;如果不使用函数&#xff0c;main函数将变的越来越复杂越来越雍肿越来越令人难懂&#xff0c;而在更改程序的每一个功能的时候&a…

C++ 自定义函数

C的函数分两种&#xff1a; 今天&#xff0c;我们就来讲一下自定义函数。 好了&#xff0c;自定义函数讲完了&#xff0c;若想了解其他关于自定义函数的内容&#xff0c;请点击下面方框&#xff1a; C递归算法_闪耀的天狼星的博客-CSDN博客_c递归算法汉诺塔大家都玩过吧&#…

C语言:自定义函数实现对字符串的复制

#include <stdio.h> void f(char*str1,char*str2)//函数名为f&#xff0c;自定义字符串连接函数 {int i0;while(str2[i]!0) {str1[i]str2[i];//把b复制到a中i;}str1[i]\0;//添加字符串结束符 } int main() {char a[100],b[100];puts("请输入字符串:\n");gets…

C语言之自定义函数(综合)

//设定一个函数&#xff0c;来比较两个数之间的较大值 int get_max(int x, int y) {int z 0;if (x > y)z x;elsez y;return z;} int main() {int a 10;int b 20;int maxget_max(a, b);printf("%d", max);return 0; } //函数返回类型的地方写出&#xff1a;vo…