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

描述

从工业时代开始,我们人类就一直在迅速发展。随着每一次进步,我们也污染了我们的环境,并最终使环境退化。现在全球变暖是一个令人担忧的威胁,甚至我们呼吸的空气也变得至关重要。因此,空气质量监测也开始变得越来越重要。因此,在本文中,我们将学习如何将任何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,那么最好单独购买传感器,因为该模块仅适用于使用数字引脚。因此,如果您已经购买了该模块,那么您必须执行一个小技巧,这将进一步讨论。现在,假设您已经购买了传感器。传感器的引脚排列和连接如下所示

PPM

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

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

PPM

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

PPM

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

PPM

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

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

PPM

事实证明,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 参考下图

PPM

Rs/Ro = 3.6

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

PPM

在这个公式中,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的值。

PPM

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

测量 Rs 的值:

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

与PPM相关的Rs/Ro比率:

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

PPM

虽然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,用于测量氨,我的设置的电路图如下所示。

PPM

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

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

PPM

现在为了确保这些值是否真的与氨的存在有关,让我们将这个设置放在一个封闭的容器中,并将氨气送入其中以检查值是否在增加。我没有合适的 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

}

 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分