從工業(yè)時代開始,我們?nèi)祟惥鸵恢痹谘杆侔l(fā)展。隨著每一次進步,我們也污染了我們的環(huán)境,并最終使環(huán)境退化。現(xiàn)在全球變暖是一個令人擔憂的威脅,甚至我們呼吸的空氣也變得至關(guān)重要。因此,空氣質(zhì)量監(jiān)測也開始變得越來越重要。因此,在本文中,我們將學習如何將任何MQ系列氣體傳感器與Arduino一起使用,并以PPM(百萬分之一)顯示輸出。PPM也表示為毫克/升(mg/L)。這些傳感器通常可用,對于測量如下所示的不同類型的氣體也很可靠
MQ 系列氣體傳感器
二氧化碳 : MG-811
一氧化碳:MQ-9
總揮發(fā)性有機化合物(TVOC):CCS811
二氧化碳當量:CCS811
金屬氧化物: CCS811
氨: MQ-137
空氣質(zhì)量: MQ-135
液化石油氣、酒精、煙霧:MQ2
我們已經(jīng)將MQ2用于煙霧傳感,MQ-135用于空氣質(zhì)量監(jiān)測項目。在這里,我將使用sainsmart的MQ-137傳感器來測量氨(以ppm為單位)。有了傳感器,我瀏覽了所有可用的教程,發(fā)現(xiàn)沒有關(guān)于如何以ppm為單位測量氣體的適當文檔。大多數(shù)教程要么只處理模擬值,要么介紹一些常數(shù),這些常數(shù)對于測量所有類型的氣體都不可靠。因此,在網(wǎng)上擺弄了很長時間后,我終于找到了如何使用這些MQ系列氣體傳感器使用Arduino測量ppm的方法。我從底部解釋的內(nèi)容,沒有任何庫,以便您可以將本文用于任何可用的氣體傳感器。
準備硬件:
MQ 氣體傳感器既可以作為模塊購買,也可以單獨作為傳感器購買。如果您的目的是僅測量ppm,那么最好單獨購買傳感器,因為該模塊僅適用于使用數(shù)字引腳。因此,如果您已經(jīng)購買了該模塊,那么您必須執(zhí)行一個小技巧,這將進一步討論。現(xiàn)在,假設(shè)您已經(jīng)購買了傳感器。傳感器的引腳排列和連接如下所示
如您所見,您只需將“H”的一端連接到電源,將“H”的另一端連接到地面。然后結(jié)合 A 和兩個 B。將一組連接到電源電壓,另一組連接到模擬引腳。電阻器 RL在使傳感器工作方面起著非常重要的作用。因此,請記下您正在使用的值,建議使用47k的值。
如果您已經(jīng)購買了模塊,那么您應(yīng)該跟蹤PCB走線以找到R的值L在董事會中。Grauonline已經(jīng)為我們完成了這項工作,下面給出了MQ氣體傳感器板的電路圖。
如您所見,電阻器RL(R2)連接在Aout引腳和接地之間,因此如果您有一個模塊,則值為RL可以通過在模塊的 Vout 引腳和 Vcc 引腳上使用電阻模式下的萬用表進行測量。在我的sainsmart MQ-137 氣體傳感器中,RL 的值為 1K,位于下圖所示的位置。
但是,該網(wǎng)站聲稱它提供了一個可變的R電位器L正如您在電路圖中清楚地看到的那樣,這不是真的,電位器用于設(shè)置運算放大器的可變電壓,與R無關(guān)L.因此,我們必須手動焊接上面顯示的SMD電阻(1K),并且我們必須在接地和Vout引腳上使用自己的電阻器,該電阻器將充當RL。RL 的最佳值將是數(shù)據(jù)表建議的 47K,因此我們將使用相同的值。
MQ氣體傳感器的PPM測量方法:
現(xiàn)在我們知道了 R 的值L讓我們繼續(xù)了解如何實際測量這些傳感器的ppm。像所有傳感器一樣,從數(shù)據(jù)表開始。MQ-137數(shù)據(jù)表在此處提供,但請確保您找到適合您的傳感器的正確數(shù)據(jù)表。在數(shù)據(jù)表中,我們只需要一個圖表,該圖表將針對(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 的值對于空氣是恒定的(粗藍線),因此我們可以利用這一點來發(fā)揮我們的優(yōu)勢,并說當傳感器在新鮮空氣中工作時,Rs/Ro 的值將為 3.6 參考下圖
Rs/Ro = 3.6
從數(shù)據(jù)表中,我們還得到了一個計算 Rs 值的公式。公式如下所示。如果你有興趣知道這個公式是如何得出的,你可以通過jay con系統(tǒng)閱讀,我也想感謝他們幫助我解決這個問題。
在這個公式中,Vc的值是我們的電源電壓(+5V),R的值是R的值。L是我們已經(jīng)計算過的那個(我的傳感器為 47K)。如果我們編寫一個小的Arduino程序,我們也可以找到V的值。RL最后計算 Rs 的值。我在下面給出了一個Arduino程序,該程序讀取模擬電壓(VRL) 并使用此公式計算 Rs 的值,最后將其顯示在串行監(jiān)視器中。該程序通過評論部分得到了很好的解釋,所以我在這里跳過了它的解釋,以使本文保持簡短。
/*
* 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的值會有所不同,允許傳感器預(yù)熱至少10小時,然后使用Ro的值。
我得出的結(jié)論是,對于我的傳感器,Ro 的值為30KΩ(當 RL為 47kΩ)。您的可能會略有不同。
測量 Rs 的值:
現(xiàn)在我們知道了 Ro 的值,我們可以使用上述兩個公式輕松計算 Rs 的值。請注意,之前計算的 Rs 值適用于新鮮空氣條件,當空氣中存在氨時,該值將不同。計算 Rs 的值不是一個大問題,我們可以在最終程序中直接處理。
與PPM相關(guān)的Rs/Ro比率:
現(xiàn)在我們知道如何測量 Rs 和 Ro 的值,我們將能夠找到它的比率 (Rs/Ro)。然后我們可以使用圖表(如下所示)來關(guān)聯(lián) PPM 的相應(yīng)值。
雖然NH3線(青色)似乎是線性的,但實際上不是線性的。外觀是因為鱗片劃分不均勻。因此,Rs/Ro 和 PPM 之間的關(guān)系實際上是對數(shù),可以用下面的等式表示。
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
就是這樣,現(xiàn)在我們已經(jīng)計算了 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.
在繼續(xù)程序之前,我們需要輸入負載電阻 (RL)、斜率 (m)、截距 (b) 和新鮮空氣阻力 (Ro) 的值。獲取所有這些值的過程已經(jīng)解釋過了,所以現(xiàn)在讓我們輸入它們
#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)并將其轉(zhuǎn)換為電壓(0V至5V),因為模擬讀數(shù)將僅返回0到1024之間的值。
VRL = analogRead(MQ_sensor)*(5.0/1023.0); //Measure the voltage drop and convert to 0-5V
現(xiàn)在,計算了VRL的值,您可以使用上面討論的公式來計算Rs的值以及比率(Rs / Ro)
ratio = Rs/Ro; // find ratio Rs/Ro
最后,我們可以使用對數(shù)公式計算 PPM,并將其顯示在我們的串行監(jiān)視器上,如下所示
double ppm = pow(10, ((log10(ratio)-b)/m)); //use formula to calculate ppm Serial.print(ppm); //Display ppm
在具有Arduino和MQ-137的硬件上顯示PPM值:
所有的理論已經(jīng)足夠了,讓我們用傳感器和LCD構(gòu)建一個簡單的電路來顯示PPM中的氣體值。這里我使用的傳感器是MQ137,用于測量氨,我的設(shè)置的電路圖如下所示。
如電路圖所示連接傳感器和LCD,并上傳程序結(jié)束時給出的代碼。您必須如上所述修改 Ro 值。如果您使用除 4.7K 以外的任何其他電阻作為 RL,請同時更改參數(shù)值。
在獲取任何讀數(shù)之前,請至少讓設(shè)置通電 2 小時(建議 48 小時以獲得更準確的值)。這段時間稱為加熱時間,在此期間傳感器預(yù)熱。在此之后,您應(yīng)該能夠看到 PPM 的值和 LCD 屏幕上顯示的電壓,如下所示。
現(xiàn)在為了確保這些值是否真的與氨的存在有關(guān),讓我們將這個設(shè)置放在一個封閉的容器中,并將氨氣送入其中以檢查值是否在增加。我沒有合適的 PPM 儀表進行校準,如果有人可以測試此設(shè)置并讓我知道,那就太好了。
/*
* 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
}
-
氣體傳感器
+關(guān)注
關(guān)注
14文章
540瀏覽量
37649 -
PPM
+關(guān)注
關(guān)注
0文章
46瀏覽量
16960 -
Arduino
+關(guān)注
關(guān)注
187文章
6464瀏覽量
186667
發(fā)布評論請先 登錄
相關(guān)推薦
評論