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