You are currently viewing 物聯網範例-MQ 4瓦斯偵測濃度超標即時通知

物聯網範例-MQ 4瓦斯偵測濃度超標即時通知

        瓦斯已經帶給我們在生活中方便的使用,但一段期間中,總是會有新聞報導關於瓦斯氣爆、瓦斯漏氣、瓦斯危害….等等的新聞。多少家庭因為日常中沒注意或疏忽一些細節而造成這樣的結局。

        今天,若有人發明了一個感測器,它可以幫忙偵測我們在日常生活環境中,若是有瓦斯氣體洩露、超過標準ppm已經造成環境危險等等,而此時,感測器因可以判斷該瓦斯氣體已經屬危險標準而可即時通知相關人員的line有關瓦斯危險等訊息、或是用簡訊通知相關人員的手機、或是發出警報聲提醒該環境相關人員、或是即時通知相關的APP等作業、或是判斷瓦斯濃度超標而自動打開窗戶等等動作。

        以下,我們就一一來實現以上的這些方法,並找出合適的方案,來真的解決瓦斯在我們習習相關的生活中的危險,讓每個人可以安心使用。

軟硬體組成元件

  • Wi-fi ESP8266無線晶片:WeMos D1 mini
  • 瓦斯感測器:MQ-4 CH4 天然氣 甲烷感測器模組
  • 中介系統:Line Notify
  • 整合應用:Line APP(即時接到通知;個人或群組)

WeMos D1 mini是近年ESP8266較多人拿來使用開發的微控制器,只要google一下,會有非常多介紹可查詢,這裏我就不一一介紹。

MQ-4氣體感測器是甲烷、天然氣感測器模組,主要是在感測器內部裝有帶電化學氣體感測器的小型加熱器,是為了測量不同種類的氣體組合。我們可以對它進行校對,只要我們知道所測氣體的濃度。在工業使用上,校對是在特殊的計量實驗室中使用準確的探針和測試進行的。但在一般使用的情況下,我們只對它自生產的情況進行測試,而無需任何其他校對或設置。

針對MQ-4瓦斯感測器主要想法是製造一個自製的警報偵測器,當在廚房有人煮東西時忘了關瓦斯或是使用瓦斯熱水器有漏氣時,只要感測器偵測到濃度超標,就會發出一些警報聲並透過本套「瓦斯偵測設計系統」通知相關人員的line。一般情形下大約1小時通知提醒1次,當偵測到瓦斯濃度超標時,就會每10秒鐘一直發送line通知,直到將事情狀況查明再關掉瓦斯偵測系統。

本系統使用MQ-4天氣然、甲烷氣體感測器從生產商裏的說明可以查到靈敏度範圍從200到10000ppm(規格表) 。MQ4 模型必須以穩定的5v供電,根據規格書手冊中的聲明至少需要150mA(最好具有250mA),才能正常工作。這裏也提供把MQ4感測器外接電源器的電路圖。同樣,在獲得穩定的測量值之前,該模型至少需要1分鐘加熱。只有在此之後,您才能獲得一致的數據。

電路圖:

瓦斯偵測系統架構圖

Line設定

WeMos D1 mini是一個ESP8266具Wi-Fi網路功能的Arduino開發版微控制器。這裏我們設計的「架構圖」其中一段可以經由Line工具來即時通知。要達到這樣的功能需要第三方軟體Line notify做為中介工具。這樣當WeMos D1 mini上的MQ-4瓦斯感測器偵測到濃度超過標準ppm濃度,就可以即時傳送資料給Line notify,而Line notify再將收到的資料訊息傳送到Line中指定要通知的群組、相關人員瓦斯濃度超標「危險」訊息。

Line Notify 網站:https://notify-bot.line.me/zh_TW/

點選右上角”登入”後,輸入您的帳號、密碼登入後,再點選右上角自己帳號名稱下的”個人頁面”,接著在下方”發行存取權杖(開發人員用)”下點選”發行權杖”。

進入發行權杖畫面,接著建立權杖名稱,到這裏我們應該可以知道發行權杖的意思其實就是建立一組連動帳號的通行密碼 。為了讓開發人員方便辨識發行過的權杖設定,我們填寫入跟本系統相關的名稱如:****_瓦斯偵測;而在選擇要接收通知的聊天室,這裏可以選擇通知個人也可以是群組(如:瓦斯偵測通知)方便之後直接邀請人員加入群組就可。

然後,再按下”發行”按鍵後,會得到line_notify產生的一組Token號碼。注意:每一組發行權杖的號碼只有在這時發行後出現一次,之後是沒辦法查詢的。請務必複製貼在自己可以保存的地方。

接著看到Line Notify產生了剛剛建立的連動服務。

最後,同時Line會通知有一個新的Line Notify產生,請你到剛剛設定通知的群組邀請Line Notify加入該群組。到這裏為止就算設定完成Line Notify中介軟體的設定通知Line的服務。

WeMos D1 mini程式碼設計

WeMos D1 mini這塊ESP8266開發板,詳細使用說明,各位可以從這裏學習

瓦斯偵測程式碼版本-基本版

這邊瓦斯偵測程式碼會用到一個TridentTD_LineNotify程式庫,請各位到該網址下載後,解壓縮後將資料夾放到Arduino的libraries下。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <TridentTD_LineNotify.h>
// 修改成上述寄到登入郵箱的 Token號碼
#define LINE_TOKEN “1234567894654313246541654163544124651234612”

// 設定無線基地台SSID跟密碼
const char* ssid = “home SSID”;
const char* password = “********”;

const int MQ4A0 = A0;
int count_number;//判斷的參數
int count_seconds;//計算每秒鐘疊加的參數
const int count_seconds_gas_over = 5;//計算瓦斯濃度超標通知時間的參數,若超標則每5秒用line通知一次
const int count_seconds_gas_normal = 1800;//計算一般通知時間的參數,一般狀態,每30分鐘通知一次,60秒*30分=1800秒
const int gas_concentration = 500;//瓦斯濃度判斷參數,瓦斯濃度超標預設值為500

void setup(void)
{
Serial.begin(115200); // 設定速率 感測器
WiFi.mode(WIFI_STA);
// 連接無線基地台
WiFi.begin(ssid, password);
Serial.print(“nr nrWorking to connect”);
// 等待連線,並從 Console顯示 IP
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println(“”);
Serial.print(“Connected to “);
Serial.println(ssid);
Serial.print(“IP address: “);
Serial.println(WiFi.localIP());
}

void loop(void)
{
int result = analogRead(MQ4A0);
Serial.print(“MQ4: “);
Serial.println(result);//debug用
if(result > gas_concentration){
count_seconds = count_seconds_gas_over;
}else{
count_seconds = count_seconds_gas_normal;
}
if(count_number > count_seconds){
String gas_value = “”;
if(result > gas_concentration){
gas_value = “瓦斯濃度:”+String(result) + “ppmn瓦斯濃度已超標,請檢查您偵測的瓦斯開關有無關上。謝謝!”;
}else{
gas_value = “瓦斯濃度:”+String(result) + “ppm”;
}
// 通知Line群組
LINE.setToken(LINE_TOKEN);

// 先換行再顯示
LINE.notify(“n” + gas_value);

count_number = 0; //歸零再重新計算
}
count_number += 1;
delay(1000); //每秒鐘loop 一次
}

瓦斯偵測程式碼版本-高級版1

基本版的程式碼得到的瓦斯偵測濃度只是由類比引腳取得的感測值,嚴格來說,由讀取WeMos D1 mini類比輸出值不足以構成可靠的瓦斯氣體偵測系統的濃度值。我們應該要從MQ-4瓦斯感測器的規格表中依據它給的真正實驗值,計算出真正的瓦斯感測濃度值,要怎麼算出我們要的真正的瓦斯濃度感測值呢!以下我們一一來解說。

圖6-1

氣體感測器用於測量環境中氣體的濃度。有許多不同的類型,這取決於您要測量的內容。MQ-4氣體感測器可以測量液化石油氣(LPG),甲烷(CH4)。MQ-4感測器內建可變電阻,該電阻根據氣體濃度改變其值。如果濃度高,則電阻降低。如果濃度低,則電阻增加。除了內建電阻外,還必須包括一個負載電阻器。該電阻器用於調節感測器的靈敏度和精度。該值的範圍可以從2k Ohms到47k Ohms。值越高,感測器越敏感。它的電路圖如下。

圖6-2

其中H、A和B是感測器的引腳。感測器共有六個引腳,引腳A和B是各自連在一 起。所以總共有四個連接點。

                       

圖6-3、6-4

引腳A和B之間內建電阻,該電阻根據氣體濃度而變化。在H和H之間有一個用於加熱的內建電阻。

所以我們如何根據電阻的變化來計算氣體濃度?

 

圖6-5

首先,我們從MQ-4瓦斯氣體感測器的規格表中可以查到上面這張數據圖。根據感測器的電阻比(RS / R0)告訴我們氣體的濃度為百萬分之一(ppm)。RS是根據氣體濃度而變化的感測器電阻,R0是在沒有其他氣體存在或在新鮮空氣中的已知濃度下的感測器電阻。

計算公式:

從歐姆定律中來找出RS:   V = I x R

其中V是電壓,I是電流,R是電阻。從上面的電路圖中可以到看RS(它是引腳A和B之間的電阻)與RL是串聯的。我們簡化電路,如下所示:

圖6-6

我們把RS跟RL串聯在一起,如圖6-7所示。

圖6-7

根據歐姆定律,我們可以得出I:

        I = V / R

在我們的電路中哪個等於下面的公式:

        I = VC / (RS+RL)

回到圖6-6的原始電路,我們可以針對I和歐姆定律獲得的值來得到負載電阻上的輸出電壓。

        V = I x R
        VRL = [VC / (RS + RL)] x RL
        VRL = (VC x RL) / (RS + RL)

我們可以得到RS:

        VRL x (RS + RL) = VC x RL
        (VRL x RS) + (VRL x RL) = VC x RL
        (VRL x RS) = (VC x RL) – (VRL x RL)
        RS = [(VC x RL) – (VRL x RL)] / VRL
        RS = [(VC x RL) / VRL] – RL

此公式可以幫助我們找到不同氣體的感測器電阻值。

接著,從圖6-5中可以看出,空氣AIR中的電阻比率是一個常數:

        RS / R0 = 4.4 ppm

這個數字是當感測器處於正常狀態下,RS跟R0的比率值。因為它是常數,所以要算出R0值我們就需要在空氣中找到RS的值。而要得到這些值,我們需要將通過從感測器獲得模擬平均值讀數並將其轉換為電壓來完成。然後,再利用RS公式找到R0。

讓我們再解釋一下圖6-5其他值:

  1. 這張圖的比例為log對log。意思是在線性範圍內,氣體濃度相對於電阻比的行為是指數的。
  2. 氣體濃度的數據範圍是從200 ppm至10000 ppm。
  3. 即使電阻比與氣體濃度之間的關係看起來是線性的,但實際上並非如此。

首先,我們將此線視為直線。這樣,我們可以使用一個線性關係比率和濃度的公式。通過這樣做,我們可以找到任何比率值的氣體濃度,甚至在圖形邊界之外。我們將使用的公式是直線方程式,刻度log-log的方程式。直線方程式的公式是:

        y = mx + b

在這裏:

        y: Y 值
        x: X 值
        m: 直線的斜率
        b: Y 軸的截距

對於log-log刻度,公式如下所示:

        log(y) = m*log(x) + b

注意:這裏的log是以log10為主。

所以,首先我們先算出斜率。我們要從圖6-5中選擇2個點。在本例中,我們從CH4線中選擇了(200,2.6)和(5000,0.9)點。計算m的公式如下:

        m = [log(y) – log(y0)] / [log(x) – log(x0)]

我們可以用對數定律,得到以下結果:

        m = log(y/y0) / log(x/x0)

現在,將兩點的值替換x,x0,y和y0:

        m = log(0.9/2.6) / log(5000/200)
        m = -0.329

現在我們有了m,就可以計算y軸的截距了。我們可以從圖中選擇一個點(再次從LPG線中選擇一次)。在我們的案例中,我們選擇了(5000,0.9)

        log(y) = m*log(x) + b
        b = log(y) – m*log(x)
        b = log(0.9) – (-0.329)*log(5000)
        b = 1.17
這樣,我們得到了m和b,就可以使用以下公式找到任何比例的氣體濃度:

        log(x) = [log(y) – b] / m

而為了根據log-log圖獲得氣體濃度的真實值,我們需要找到x的反對數:

        x = 10 ^ {[log(y) – b] / m}

由第一段程式碼算出R0值

將程式碼上傳WeMos D1 mini後,讓程式跑一段時間,等待R0值穩定後,它就是我們前面解說的,要的在一般空氣中算出R0值了。然後再將這個R0值帶入下面程式碼。

到這裏基本上已經很完整的完成MQ-4瓦斯氣體偵測系統。得到的ppm值就是真實的瓦斯濃度。

註:本段內容參考處為這篇文章

瓦斯偵測程式碼版本-高級版2

上面高級版1我們已經可以真實的偵測出MQ-4瓦斯濃度值,而為了偵測瓦斯濃度,我們總不能每次到一個地方安裝都先跑第一段程式取得R0值後,再將R0值填入第二段程式後才正常偵測,還是說好的Line_notify的通知呢!所以在這裏我們就想辦法來把這兩個問題點整合起來,寫出一支程式就可以包含這全部的功能。這裏就直接放上程式碼了。

收到line notify通知的內容如下

由IFTTT路徑通知Line

除了使用LINE_NOTIFY提供的服務外,這裏也提供另一個非常多廠商支援及非常多人使用的IFTTT這個服務平台。IFTTT意思就是IF ( if ) T ( this ) T ( then ) T ( that ) ,也就是「若做了什麼 ( this ) 則 ( then ) 就執行什麼 ( that )」。IFTTT最厲害的地方是串接了市面上最知名平台的服務,如 Gmail、Twitter、Facebook、Line…等,也因為如此,這裏也提供了透過IFTTT的設定,串接Line_Notify的服務。

IFTTT設定(在IFTTT上串接Line_Notify):

連到IFTTT網址:https://ifttt.com/

進入 IFTTT 網站後就是點選「Sign up」註冊帳號並登入,可以選擇使用 Google 與 Facebook 的第三方登入,登入後第一頁就是瀏覽它已經能串的服務。直接選擇「Create」進入服務建立設定。

出現選擇服務的畫面,直接點選 + This處。

在搜尋欄位輸入”web”,出現有「webhooks」服務,並點選該服務。

繼續點選「Receive a web request」

在事件名稱欄位輸入本次觸發事件服務的名稱,這裏輸入「gas_notify」,接著按下建立觸發事件按鍵。

然後再選擇+That選項

事件觸發後要通知line服務,所以在搜尋欄位輸入line,然後點選line服務。

繼續點選「Send message」

在Recipient選項可以選預設「透過1對1聊天接受LINE Notify」,也可以下拉選單選擇其他個人或群組的通知;Message選項這裏提供三個Value欄位給開發人員使用,然後再按下建立活動按鍵。

最後再檢查一下,若無任何問題,就按下完成。

設定完成後,會在IFTTT服務的首頁看到剛剛建立完成的事件觸發服務設定,接下來請點選該服務的「webhooks」圖示,我們要查詢IFTTT提供跟webhooks連結的key。

選擇右上角的Documentation

可以查詢到IFTTT提供的key,這裏也是一個測試網頁,你可以在{event}填入本服務剛剛建立的名稱「gas_notify」,在value欄位那邊填入一些文字,再按下”Test It”按鍵,測試是否成功。

webhooks的key等等要在WeMos D1 mini程式碼中用到,可以先把它複製起來。

若測試沒成功的話,有可能是line的服務還沒設定連動服務設定。這時回到剛剛設好的事件服務處,點選line圖片後就可以看到Line Notify提供的連動服務選項。

按下「同意並連動」後,可以在自己的Line上看到Line Notify發送下列提示,表示已經設定成。

而在IFTTT上則看到Line連動服務狀態是Active狀態。

在WeMos D1 mini程式碼如下所示更改。

最後我們看到在line上收到的通知內容

設定由RemoteMe整合Web、APP查看瓦斯濃度

若不想使用line提供的line notify服務,也不想使用IFTTT提供的服務,想自己開發的話,有沒有辦法?這裏提供另一個服務,它就是使用RemoteMe服務。

首先到網址RemoteMe.org,若沒有帳戶的話先註冊一個帳號。

登入RemoteMe後, 到”Variables”選項,到右上角的”+Add”地方按下,出現”New Varibale”,這裏新增一個變數,是要顯示偵測瓦斯濃度的變數用。name、mode及type分別填入”Gas_detection”、”Local”、”Integer”,然後按下確定送出。

接著到”Devices”,新增一個”New Network Device(Esp)”介面,本介面是跟WeMos D1 mini連動的程式介面。

新增設備介面的type預設是Arduino,name填入”ESP_Gas_detection”,其他預設即可,再按下確定送出。

完成後,會產出一個剛剛設定好的設備,接著到該設備的右角旁點選設備項目的三條線圖示,出現的選項直接點選”Code Generator Wizard”程式碼產生器引導。

第一步,勾選剛剛設定好的瓦斯濃度變數。

第二步,填入ESP8266連網上線的區網SSID及密碼。

第三步,將”啟動直接連線”選項啟動。

第四步,Debug Serial啟動,鮑率可設定9600,這裏設定為115200。

最後設定完成後,可直接下載程式碼再開啟程式碼修改一下。

ESP8266程式碼要修改兩個地方,第一個是要加上定義類比訊號的變數,第二個是在loop函數內加上變數得到的值要傳到setGas_detection函數,讓RemoteMe介面使用。那我們要怎麼讓瓦斯偵測濃度偵測到的值顯示呢?

接著,我們再到”Devices”項目這裏,新增一個web功能的介面。

這裏,name填入Web_Gas_ppm,確認新增送出。

接著點選設備最右邊的向下顯示的箭頭。

選擇index,出現像下圖這樣的選項,點選”Edit with wizard…”。

選擇”Insert Component”

“Component”選”gauge”測量儀表圖示

這裏有些欄位要設定,”name”選變數”Gas_detection”、儀表板的名稱這裏是填入”Gas ppm”(您可以自行填入),min刻度填0,max刻度1200,區間刻度100,設定完成最後點選新增。

完成圖如下

要看到網頁版的儀表板顯示圖示,這裏提供兩種方式,一種是直接開一個新的網頁查看,另一種是產生一串網址,可以放到APP或其他瀏灠器使用。

下面是產生網址及QRCode圖示。

最後,我們可以從網頁上及手機上觀看瓦斯濃度值的變化。

自己寫APP讀取ESP8266

若想自己寫APP連結讀取ESP8266資料的話,這裏提供基本的APP程式碼及ESP8266程式碼。

APP使用Android Studio的IDE開發工具,程式語言是JAVA語法。

ESP8266程式比較單純,網路的條件是智慧手機及ESP8266要在同一個網段(若不在同一網段上的話有另外其他兩種作法,之後有機會再談)。在ESP8266連到網路後,同時也要知道APP智慧手機IP是多少,這樣就可以在讀到類比訊息後,將訊息即時傳到給APP端。

APP的程式主要要有兩支,一支是TCP Server一直監聽ESP8266端發出的資料(兩邊的Port我這裏設8266Port),一支是定時將接到的資料更新到layout上。以下是程式碼。

ESP8266程式碼

Android程式碼–MainActivity、MobileServer及Layout的xml程式碼

 

 

程式跑出來的結果

結語

介紹這麼多方法都可以執行瓦斯濃度偵測,其實物聯網的實用性一直可以被應用在我們生活中,相信之後5G通訊技術漸漸上路普及後,之後物聯網的應用會更平常化,許多我們生活上的需求也會被整合在手機或穿戴式裝備上。

This Post Has One Comment

  1. Danny

    您好,我正在用Raspberry Pi 上使用MQ4測量甲烷濃度,想請問一下為什麼RL是10k歐姆?
    是量測模組上那一段的電阻值呢(通電的情況下嗎)?

發佈留言