我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址:https://www.books.com.tw/products/0010901195
前言
本篇是前篇(第六篇 ESP32類比讀取(analogRead):小夜燈)的另一種應用,主要談的是mq系列的氣體感測器,相同的是使用類比讀取,只是這顆感測器其實用途不大,做簡易實驗可,但是要做精確的研究,建議換商用的感測器,mq這系列的,坑太大了。
mq系列有一個龐大的家族,在台灣市面上常見的大概是mq2, mq9, mq135這幾個,根據原廠提供的規格表(下圖),每一顆都有其主要感測的氣體,如果你有特定需要感測的目標,則依照下表去購買。
一般為了授課方便,我會拿容易取得的消毒用酒精進行測試,畢竟上課時間你不可能搬一個瓦斯筒來測試,所以我會選擇mq2, mq135, mq3這幾個,而mq2是最常見的。讀者若需要mq系列更詳細的細節,可參考原廠網站: https://playground.arduino.cc/Main/MQGasSensors/。
一、實驗目的
本次實驗要學習利用氣體感測器感測是否有有害氣體洩漏,本處以容易取得的酒精取代瓦斯,並以燈號顯示環境的嚴重程度,當然後續講到網路及藍芽時,就可以透過網路發布LINE訊息給管理員進行緊急處置,請讀者持續關注。
- 感測有害氣體洩漏嚴重:紅燈
- 感測有害氣體洩漏徵兆:黃燈
- 感測環境氣體狀況正常:綠燈
二、材料準備
- ESP32主板+麵包板
- 紅、黃、綠LED燈各1
- 杜邦線若干
- 酒精棉片若干:用來模擬瓦斯外洩
- mq2氣體感應器:mq2外型如下圖,外型有點像麥克風,四跟腳位與上一篇的光敏電阻完全一樣,AO=類比輸出、DO=數位輸出,而在外罩內部是二氧化錫線,其工作原理是當空氣中有可燃氣體時,則會改變線的導電率,藉由變化來提供濃度「數值」的參考。
這裡必須要說明一下mq系列的使用方式,根據原廠的說明,由於出廠時會有些雜質附著在二氧化錫線上,因此開機後2hr內的數值會偏高,也會聞到一股淡淡的燒焦味(有人會以為晶片燒掉而暫停實驗),然後慢慢走向穩定,而個人建議至少等24hr會比較穩定。另外有人會問如果從mq拿到的數值代表什麼含意,是ppm還是ml?個人的意見是這個數值只是提供您「相對」比較用的,並不能準確轉換成ppm或者其他「絕對」數值。為什麼?
根據原廠提供的規格表會發現,能影響mq2數值的種類相當多,而我們空氣中或多或少都會殘留這些有機氣體,影響到感測的數值,但它只會反應一個數值,所以到底是給予哪一種氣體的數值已經無法知道?雖然網路可以搜尋到一些轉換ppm的公式(例如: http://sandboxelectronics.com/?p=165 ),但我實際套用後發現誤差相當大,個人建議是放棄轉ppm的方式,改以相對方式比較。
這裡對於要使用mq系列夥伴的建議是,先在環境中靜至一段時間,長期觀察數值的穩定狀態,根據筆者經驗,每顆mq都有自己的個性,有些50-100,有些200-400之間跳動,因此強加上一個固定門檻值是不行的,只能改成相對的方式,就是將長期的觀察值設定為正常狀態例如正常=100,接下來利用酒精靠近測試,例如跳至=700,了解mq的敏感度後,就可決定一個門檻數值,例如超過300代表濃度黃燈警戒,超過600則是亮出紅燈警告。由於每一個人的環境與感測器的狀況不同,這個數值由每個人測試後自行決定。
以上這種方式也可以用程式自動作長期取樣,等後續較深入的課程再做說明。
三、ESP32線路佈置
線路佈置方式與上一篇完全相同。只須將光敏電阻移除,換成mq2即可,相同的我們一樣使用AO作為類比輸出,接在ESP32麵包板左側序號5,實際GPIO13。
四、程式撰寫
相同的我們先測試mq2是否正常,我們將analogRead瓦斯數值放置在變數GasValue中,並顯示在視窗中查看。
void setup() {
Serial.begin(115200);
pinMode(13, INPUT);//選告GPIO 13作為輸入(Mq2氣體感測)
}
void loop() {
int GasValue;//宣告變數GasValue
GasValue = analogRead(13); //讀取的GPIO 13讀取的數值放在GasValue
Serial.println(GasValue); //GasValue顯示在序列視窗
delay(100);
}
經過不斷檢驗與比較後,我們測試的門檻值分別為
1.綠燈正常:0~200
2.黃燈提示:200~400
3.紅燈警報:400以上
接下來我們可以寫程式來完成上述的設定。
void setup() {
Serial.begin(115200);
pinMode(15, OUTPUT);//選告GPIO15作為輸出(綠色LED)
pinMode(2, OUTPUT);//選告GPIO 2作為輸出(黃色LED)
pinMode(4, OUTPUT);//選告GPIO 4作為輸出(紅色LED)
pinMode(13, INPUT);//選告GPIO 13作為輸入(Mq2氣體感測)
}
void loop() {
int GasValue;//宣告變數GasValue
GasValue = analogRead(13); //讀取的GPIO 13讀取的數值放在GasValue
Serial.println(GasValue); //GasValue顯示在序列視窗
if (GasValue < 200) {
//小於200,代表一切正常,亮綠燈
digitalWrite(15, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
}
if (GasValue >= 200 && GasValue < 400) {
//200-400之間,黃燈顯示外洩警戒
digitalWrite(15, LOW);
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
}
if (GasValue >= 400) {
//超過600,發出外洩警報
digitalWrite(15, LOW);
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
}
delay(100);
}
另外一個好玩的則是可以當作口臭感測器或屁感測器,畢竟人體是一個大型有機物,呼出的空氣內有大量的有機氣體,因此也可以嘗試對感測器呼一口氣,會有意想不到的效果喔。
延伸閱讀
???? 第八篇 超音波測距及蜂鳴器製作倒車雷達
我想請問一下!我照上面路線圖MQ2接Esp32這樣。
如果把MQ2換成MQ3再按照上面一樣的路線!
這樣也是一樣可以運作嗎?
概念就是接點都一樣然後只是感測器不同而已?
沒錯,一模一樣