从工业时代开始,我们人类就一直在迅速发展。随着每一次进步,我们也污染了我们的环境,并最终使环境退化。现在全球变暖是一个令人担忧的威胁,甚至我们呼吸的空气也变得至关重要。因此,空气质量监测也开始变得越来越重要。因此,在本文中,我们将学习如何将任何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,那么最好单独购买传感器,因为该模块仅适用于使用数字引脚。因此,如果您已经购买了该模块,那么您必须执行一个小技巧,这将进一步讨论。现在,假设您已经购买了传感器。传感器的引脚排列和连接如下所示
如您所见,您只需将“H”的一端连接到电源,将“H”的另一端连接到地面。然后结合 A 和两个 B。将一组连接到电源电压,另一组连接到模拟引脚。电阻器 RL在使传感器工作方面起着非常重要的作用。因此,请记下您正在使用的值,建议使用47k的值。
如果您已经购买了模块,那么您应该跟踪PCB走线以找到R的值L在董事会中。Grauonline已经为我们完成了这项工作,下面给出了MQ气体传感器板的电路图。
如您所见,电阻器RL(R2)连接在Aout引脚和接地之间,因此如果您有一个模块,则值为RL可以通过在模块的 Vout 引脚和 Vcc 引脚上使用电阻模式下的万用表进行测量。在我的sainsmart MQ-137 气体传感器中,RL 的值为 1K,位于下图所示的位置。
但是,该网站声称它提供了一个可变的R电位器L正如您在电路图中清楚地看到的那样,这不是真的,电位器用于设置运算放大器的可变电压,与R无关L.因此,我们必须手动焊接上面显示的SMD电阻(1K),并且我们必须在接地和Vout引脚上使用自己的电阻器,该电阻器将充当RL。RL 的最佳值将是数据表建议的 47K,因此我们将使用相同的值。
MQ气体传感器的PPM测量方法:
现在我们知道了 R 的值L让我们继续了解如何实际测量这些传感器的ppm。像所有传感器一样,从数据表开始。MQ-137数据表在此处提供,但请确保您找到适合您的传感器的正确数据表。在数据表中,我们只需要一个图表,该图表将针对(Rs / Ro)与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 参考下图
Rs/Ro = 3.6
从数据表中,我们还得到了一个计算 Rs 值的公式。公式如下所示。如果你有兴趣知道这个公式是如何得出的,你可以通过jay con系统阅读,我也想感谢他们帮助我解决这个问题。
在这个公式中,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的值。
我得出的结论是,对于我的传感器,Ro 的值为30KΩ(当 RL为 47kΩ)。您的可能会略有不同。
测量 Rs 的值:
现在我们知道了 Ro 的值,我们可以使用上述两个公式轻松计算 Rs 的值。请注意,之前计算的 Rs 值适用于新鲜空气条件,当空气中存在氨时,该值将不同。计算 Rs 的值不是一个大问题,我们可以在最终程序中直接处理。
与PPM相关的Rs/Ro比率:
现在我们知道如何测量 Rs 和 Ro 的值,我们将能够找到它的比率 (Rs/Ro)。然后我们可以使用图表(如下所示)来关联 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,用于测量氨,我的设置的电路图如下所示。
如电路图所示连接传感器和LCD,并上传程序结束时给出的代码。您必须如上所述修改 Ro 值。如果您使用除 4.7K 以外的任何其他电阻作为 RL,请同时更改参数值。
在获取任何读数之前,请至少让设置通电 2 小时(建议 48 小时以获得更准确的值)。这段时间称为加热时间,在此期间传感器预热。在此之后,您应该能够看到 PPM 的值和 LCD 屏幕上显示的电压,如下所示。
现在为了确保这些值是否真的与氨的存在有关,让我们将这个设置放在一个封闭的容器中,并将氨气送入其中以检查值是否在增加。我没有合适的 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
+关注
关注
0文章
46浏览量
16997 -
Arduino
+关注
关注
188文章
6469浏览量
186969
发布评论请先 登录
相关推荐
评论