0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino测量MQ气体传感器的PPM

科技观察员 来源:circuitdigest 作者:阿斯文斯·拉吉 2022-11-21 16:44 次阅读

工业时代开始,我们人类就一直在迅速发展。随着每一次进步,我们也污染了我们的环境,并最终使环境退化。现在全球变暖是一个令人担忧的威胁,甚至我们呼吸的空气也变得至关重要。因此,空气质量监测也开始变得越来越重要。因此,在本文中,我们将学习如何将任何MQ系列气体传感器Arduino一起使用,并以PPM(百万分之一)显示输出。PPM也表示为毫克/升(mg/L)。这些传感器通常可用,对于测量如下所示的不同类型的气体也很可靠

MQ 系列气体传感器

二氧化碳 : MG-811

一氧化碳:MQ-9

总挥发性有机化合物(TVOC):CCS811

二氧化碳当量:CCS811

金属氧化物: CCS811

氨: MQ-137

空气质量: MQ-135

液化石油气、酒精、烟雾:MQ2

我们已经将MQ2用于烟雾传感,MQ-135用于空气质量监测项目。在这里,我将使用sainsmart的MQ-137传感器来测量氨(以ppm为单位)。有了传感器,我浏览了所有可用的教程,发现没有关于如何以ppm为单位测量气体的适当文档。大多数教程要么只处理模拟值,要么介绍一些常数,这些常数对于测量所有类型的气体都不可靠。因此,在网上摆弄了很长时间后,我终于找到了如何使用这些MQ系列气体传感器使用Arduino测量ppm的方法。我从底部解释的内容,没有任何库,以便您可以将本文用于任何可用的气体传感器。

准备硬件

MQ 气体传感器既可以作为模块购买,也可以单独作为传感器购买。如果您的目的是仅测量ppm,那么最好单独购买传感器,因为该模块仅适用于使用数字引脚。因此,如果您已经购买了该模块,那么您必须执行一个小技巧,这将进一步讨论。现在,假设您已经购买了传感器。传感器的引脚排列和连接如下所示

poYBAGN7OleAREBoAABA1mlTMo8984.jpg

如您所见,您只需将“H”的一端连接到电源,将“H”的另一端连接到地面。然后结合 A 和两个 B。将一组连接到电源电压,另一组连接到模拟引脚。电阻器 RL在使传感器工作方面起着非常重要的作用。因此,请记下您正在使用的值,建议使用47k的值。

如果您已经购买了模块,那么您应该跟踪PCB走线以找到R的值L在董事会中。Grauonline已经为我们完成了这项工作,下面给出了MQ气体传感器板的电路图。

poYBAGN7OlqAdmw1AACRptb4zuk370.png

如您所见,电阻器RL(R2)连接在Aout引脚和接地之间,因此如果您有一个模块,则值为RL可以通过在模块的 Vout 引脚和 Vcc 引脚上使用电阻模式下的万用表进行测量。在我的sainsmart MQ-137 气体传感器中,RL 的值为 1K,位于下图所示的位置。

poYBAGN7OlyAZBpYAAB9M-Xu-r0897.jpg

但是,该网站声称它提供了一个可变的R电位器L正如您在电路图中清楚地看到的那样,这不是真的,电位器用于设置运算放大器的可变电压,与R无关L.因此,我们必须手动焊接上面显示的SMD电阻(1K),并且我们必须在接地和Vout引脚上使用自己的电阻器,该电阻器将充当RL。RL 的最佳值将是数据表建议的 47K,因此我们将使用相同的值。

pYYBAGN7Ol2AHgucAAD18gUr6P4399.jpg

MQ气体传感器的PPM测量方法:

现在我们知道了 R 的值L让我们继续了解如何实际测量这些传感器的ppm。像所有传感器一样,从数据表开始。MQ-137数据表在此处提供,但请确保您找到适合您的传感器的正确数据表。在数据表中,我们只需要一个图表,该图表将针对(Rs / Ro)与PPM进行绘制,这是我们计算所需的图表。所以把它放在方便的地方。我的传感器的那个如下所示。

poYBAGN7Ol-AKwjhAACKbiHgyoM321.png

事实证明,MQ137传感器可以测量NH3,C2H6O甚至CO。但是,在这里我只对 NH3 的值感兴趣。但是,您可以使用相同的方法来计算您喜欢的任何传感器的ppm。这张图是我们找到 ppm 值的唯一来源,如果我们能以某种方式计算 Rs/Ro(X 轴)的比率,我们可以使用此图来查找 ppm(Y 轴)的值。要找到 Rs/Ro 的值,我们需要找到 Rs 的值和 Ro 的值。其中 Rs 是气体浓度下的传感器电阻,Ro 是清洁 Sir 中的传感器电阻。

是的。。。这就是计划,让我们看看如何摆脱困境......

计算清洁空气中的Ro值:

请注意,在图中,Rs/Ro 的值对于空气是恒定的(粗蓝线),因此我们可以利用这一点来发挥我们的优势,并说当传感器在新鲜空气中工作时,Rs/Ro 的值将为 3.6 参考下图

pYYBAGN7OmKAGDskAACWFju0rMw203.jpg

Rs/Ro = 3.6

从数据表中,我们还得到了一个计算 Rs 值的公式。公式如下所示。如果你有兴趣知道这个公式是如何得出的,你可以通过jay con系统阅读,我也想感谢他们帮助我解决这个问题。

poYBAGN7OmOAIS8fAAAQcy4SpZI929.png

在这个公式中,Vc的值是我们的电源电压(+5V),R的值是R的值。L是我们已经计算过的那个(我的传感器为 47K)。如果我们编写一个小的Arduino程序,我们也可以找到V的值。RL最后计算 Rs 的值。我在下面给出了一个Arduino程序,该程序读取模拟电压(VRL) 并使用此公式计算 Rs 的值,最后将其显示在串行监视器中。该程序通过评论部分得到了很好的解释,所以我在这里跳过了它的解释,以使本文保持简短。

/*
* Program to measure the value of R0 for a know RL at fresh air condition
* Program by: B.Aswinth Raj
* Dated: 28-12-2017
*/
//This program works best at a fresh air room with temperaure Temp: 20℃, Humidity: 65%, O2 concentration 21% and when the value of Rl is 47K

#define RL 47 //The value of resistor RL is 47K
void setup() //Runs only once
{
Serial.begin(9600); //Initialise serial COM for displaying the value
}

void loop() {
float analog_value;
float VRL;
float Rs;
float Ro;
for(int test_cycle = 1 ; test_cycle <= 500 ; test_cycle++) //Read the analog output of the sensor for 200 times
{
analog_value = analog_value + analogRead(A0); //add the values for 200
}
analog_value = analog_value/500.0; //Take average
VRL = analog_value*(5.0/1023.0); //Convert analog value to voltage
//RS = ((Vc/VRL)-1)*RL is the formulae we obtained from datasheet
Rs = ((5.0/VRL)-1) * RL;
//RS/RO is 3.6 as we obtained from graph of datasheet
Ro = Rs/3.6;
Serial.print("Ro at fresh air = ");
Serial.println(Ro); //Display calculated Ro
delay(1000); //delay of 1sec
}

注意:Ro的值会有所不同,允许传感器预热至少10小时,然后使用Ro的值。

pYYBAGN7OmSATMYKAAAjp3pv8Zs755.png

我得出的结论是,对于我的传感器,Ro 的值为30KΩ(当 RL为 47kΩ)。您的可能会略有不同。

测量 Rs 的值:

现在我们知道了 Ro 的值,我们可以使用上述两个公式轻松计算 Rs 的值。请注意,之前计算的 Rs 值适用于新鲜空气条件,当空气中存在氨时,该值将不同。计算 Rs 的值不是一个大问题,我们可以在最终程序中直接处理。

与PPM相关的Rs/Ro比率:

现在我们知道如何测量 Rs 和 Ro 的值,我们将能够找到它的比率 (Rs/Ro)。然后我们可以使用图表(如下所示)来关联 PPM 的相应值。

poYBAGN7OmWAU6DaAAC2fMOwxcU774.jpg

虽然NH3线(青色)似乎是线性的,但实际上不是线性的。外观是因为鳞片划分不均匀。因此,Rs/Ro 和 PPM 之间的关系实际上是对数,可以用下面的等式表示。

log(y) = m*log(x) + b

where, y = ratio (Rs/Ro) x = PPM m = slope of the line b = intersection point

要找到 m 和 b 的值,我们必须考虑气体管线上的两个点 (x1,y1) 和 (x2,y2)。在这里,我们正在处理氨,所以我考虑的两点是(40,1)和(100,0.8),如上图所示(标记为红色),带有红色标记。

m = [log(y2) - log(y1)] / [log(x2) - log(x1)] m = log(0.8/1) / log(100/40)

m = -0.243

同样,对于 (b),让我们从图中获取中点值 (x,y),即 (70,0.75),如上图所示(标记为蓝色)

b = log(y) - m*log(x) b = log(0.75) - (-0.243)*log(70)

b = 0.323

就是这样,现在我们已经计算了 m 和 b 的值,我们可以使用以下公式将 (Rs/Ro) 的值等同于 PPM

PPM = 10 ^ {[log(ratio) - b] / m}

Program to calculate PPM using MQ sensor:

Thecomplete programto calculate PPM using a MQ sensor is given below. Few important lines are explained below.

在继续程序之前,我们需要输入负载电阻 (RL)、斜率 (m)、截距 (b) 和新鲜空气阻力 (Ro) 的值。获取所有这些值的过程已经解释过了,所以现在让我们输入它们

#define RL 47 //The value of resistor RL is 47K #define m -0.263 //Enter calculated Slope #define b 0.42 //Enter calculated intercept #define Ro 30 //Enter found Ro value

然后读取传感器两端的压降(VRL)并将其转换为电压(0V至5V),因为模拟读数将仅返回0到1024之间的值。

VRL = analogRead(MQ_sensor)*(5.0/1023.0); //Measure the voltage drop and convert to 0-5V

现在,计算了VRL的值,您可以使用上面讨论的公式来计算Rs的值以及比率(Rs / Ro)

ratio = Rs/Ro; // find ratio Rs/Ro

最后,我们可以使用对数公式计算 PPM,并将其显示在我们的串行监视器上,如下所示

double ppm = pow(10, ((log10(ratio)-b)/m)); //use formula to calculate ppm Serial.print(ppm); //Display ppm

在具有Arduino和MQ-137的硬件上显示PPM值:

所有的理论已经足够了,让我们用传感器和LCD构建一个简单的电路来显示PPM中的气体值。这里我使用的传感器是MQ137,用于测量氨,我的设置的电路图如下所示。

poYBAGN7OmmAXeZrAADt5w1GUjo990.png

如电路图所示连接传感器和LCD,并上传程序结束时给出的代码。您必须如上所述修改 Ro 值。如果您使用除 4.7K 以外的任何其他电阻作为 RL,请同时更改参数值。

在获取任何读数之前,请至少让设置通电 2 小时(建议 48 小时以获得更准确的值)。这段时间称为加热时间,在此期间传感器预热。在此之后,您应该能够看到 PPM 的值和 LCD 屏幕上显示的电压,如下所示。

poYBAGN7OmuAaZ7jAADOngPkQqI854.jpg

现在为了确保这些值是否真的与氨的存在有关,让我们将这个设置放在一个封闭的容器中,并将氨气送入其中以检查值是否在增加。我没有合适的 PPM 仪表进行校准,如果有人可以测试此设置并让我知道,那就太好了。

/*

* Program to measure gas in ppm using MQ sensor

* Program by: B.Aswinth Raj

* Dated: 28-12-2017

*/

#define RL 47 //The value of resistor RL is 47K

#define m -0.263 //Enter calculated Slope

#define b 0.42 //Enter calculated intercept

#define Ro 20 //Enter found Ro value

#define MQ_sensor A0 //Sensor is connected to A4


#include //Header file for LCD from

const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; //Pins to which LCD is connected

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


void setup() {

lcd.begin(16, 2); //We are using a 16*2 LCD display

lcd.print("NH3 in PPM"); //Display a intro message

lcd.setCursor(0, 1); // set the cursor to column 0, line 1

lcd.print("-CircuitDigest"); //Display a intro message


delay(2000); //Wait for display to show info

lcd.clear(); //Then clean it

}


void loop() {


float VRL; //Voltage drop across the MQ sensor

float Rs; //Sensor resistance at gas concentration

float ratio; //Define variable for ratio



VRL = analogRead(MQ_sensor)*(5.0/1023.0); //Measure the voltage drop and convert to 0-5V

Rs = ((5.0*RL)/VRL)-RL; //Use formula to get Rs value

ratio = Rs/Ro; // find ratio Rs/Ro



float ppm = pow(10, ((log10(ratio)-b)/m)); //use formula to calculate ppm


lcd.print("NH3 (ppm) = "); //Display a ammonia in ppm

lcd.print(ppm);

lcd.setCursor(0, 1); // set the cursor to column 0, line 1

lcd.print("Voltage = "); //Display a intro message

lcd.print(VRL);


delay(200);

lcd.clear(); //Then clean it

}


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 气体传感器
    +关注

    关注

    14

    文章

    542

    浏览量

    37686
  • PPM
    PPM
    +关注

    关注

    0

    文章

    46

    浏览量

    16997
  • Arduino
    +关注

    关注

    188

    文章

    6469

    浏览量

    186969
收藏 人收藏

    评论

    相关推荐

    MQ-2普敏气体烟雾传感器

    MQ-2普敏气体烟雾传感器
    发表于 08-14 22:50

    arduino学习笔记35 - Arduino uno + MQ-2气体传感器演示实验

    一大早就遇到问题了,果断发帖求助,果断自行答案,虽然不是什么权威的解析,但是还是有点道理的,今天玩了一个Arduino+MQ-2气体传感器的实验,也写了一下文档,现在就发出来给大家,方便大家调试
    发表于 10-24 11:02

    MQ-5气体传感器

    有没有MQ-5气体传感器的AD库?自己想画的但是找不到他的各个引脚功能,怎么办
    发表于 03-14 14:42

    基于电化学传感器Arduino兼容电化学气体检测电路CN0357

    对不同的气体传感器系统进行原型设计。对于测量ppm气体浓度分数很重要的应用,使用ADA4528-2和ADR3412使电路性能适合与16位AD
    发表于 03-12 10:39

    MQ-2气体传感器模块介绍

    传感器,Pellistor基本上测量所有可燃气体,但它们对通过烧结物更快扩散的较小分子更敏感。可测量的浓度范围通常从几百 ppm 到几个体积
    发表于 06-23 07:29

    如何使用lua脚本为MQ7、MQ135气体传感器和颗粒物传感器编码?

    如何使用 lua 脚本为 MQ7、MQ135 气体传感器和颗粒物传感器编码。
    发表于 04-27 07:23

    如何使用MQ8传感器

    我正在使用这个工作库从传感器中提取 PPM 中的 H2 和酒精。 我只需要项目的 PPM,因为我想将其作为 osc 消息发送。 但是库的代码是编的所以我只能用整个数据表而不是ppm
    发表于 05-16 08:14

    MQ307A型CO气体传感器

    MQ307A型CO气体传感器 MQ307A是一种SnO2半导体气体传感器,它在探测CO
    发表于 04-13 16:31 34次下载

    MQ-138气体传感器

    MQ-138气体传感器 应用于家庭、环境的有害气体探测装置。
    发表于 04-14 15:07 195次下载

    MQ系列气体传感器的详细中文资料概述

    本文档的主要内容介绍的是MQ系列气体传感器的详细中文资料概述包括了:MQ-2到MQ-9
    发表于 06-08 08:00 256次下载
    <b class='flag-5'>MQ</b>系列<b class='flag-5'>气体</b><b class='flag-5'>传感器</b>的详细中文资料概述

    dfrobot模拟LPG气体传感器 (MQ6)介绍

    基于气敏元件的MQ6气体传感器,可以很灵敏的检测到空气中的丁烷、丙烷、LNG、LPG等气体。与Arduino专用
    的头像 发表于 11-19 10:16 2427次阅读
    dfrobot模拟LPG<b class='flag-5'>气体</b><b class='flag-5'>传感器</b> (<b class='flag-5'>MQ</b>6)介绍

    使用MQ 2气体传感器的烟雾探测

    电子发烧友网站提供《使用MQ 2气体传感器的烟雾探测.zip》资料免费下载
    发表于 10-27 09:38 6次下载
    使用<b class='flag-5'>MQ</b> 2<b class='flag-5'>气体</b><b class='flag-5'>传感器</b>的烟雾探测<b class='flag-5'>器</b>

    使用MQ3酒精传感器Arduino Breathalyzer项目

    电子发烧友网站提供《使用MQ3酒精传感器Arduino Breathalyzer项目.zip》资料免费下载
    发表于 11-02 16:19 2次下载
    使用<b class='flag-5'>MQ</b>3酒精<b class='flag-5'>传感器</b>的<b class='flag-5'>Arduino</b> Breathalyzer项目

    MQ 2气体传感器Arduino

    电子发烧友网站提供《MQ 2气体传感器Arduino.zip》资料免费下载
    发表于 11-17 10:24 2次下载
    <b class='flag-5'>MQ</b> 2<b class='flag-5'>气体</b><b class='flag-5'>传感器</b><b class='flag-5'>Arduino</b>

    基于MQ传感器的空气分析仪

    我想只使用低成本的 MQ 传感器来监控空气中的每个组件,所以我订购了一套 9 个 MQ 传感器并做了这个项目。其中我可以仅使用一些 MQ
    发表于 12-07 11:31 4次下载