IoT 實作:MQ-4 瓦斯感測器 + ESP8266 即時 Line 通知系統

瓦斯已經帶給我們在生活中非常大的便利,但每隔一段時間,總會看到關於瓦斯氣爆、瓦斯漏氣危害的新聞報導。許多家庭因為日常中的一個不注意,就造成了難以挽回的遺憾。

如果我們能利用物聯網技術,製作一個自動監測環境中瓦斯濃度的警報系統,當偵測到濃度超過安全標準時,能即時:

  • 📱 發送 Line 通知到手機(個人或群組)
  • 🔔 發出本地警報聲提醒在場人員
  • 🪟 甚至自動啟動其他裝置(如打開換氣扇、窗戶)

這樣的系統就能大幅降低瓦斯危害的風險!本文將一步步帶您實現這個目標。


系統所需軟硬體元件

類別 元件名稱 說明
微控制器 WeMos D1 mini (ESP8266) 具備 Wi-Fi 功能的 Arduino 相容開發板
氣體感測器 MQ-4 甲烷/天然氣感測器 偵測 CH4 甲烷,靈敏度範圍 200~10000 ppm
通知服務 Line Notify 免費的 Line 官方通知 API,可發送至個人或群組
(選用)通知平台 IFTTT Webhooks 可作為 Line Notify 的替代觸發方式
(選用)監控介面 RemoteMe.org 提供 Web 儀表板與 APP 介面查看即時數值
(選用)手機APP Android 自製 APP 透過 TCP Socket 直接讀取 ESP8266 數值

關於 MQ-4 瓦斯感測器

MQ-4 氣體感測器是甲烷(CH4)、天然氣感測器模組。其內部含有一個帶電化學氣體感測器的小型加熱器,透過感測元件電阻值的變化來判斷氣體濃度。

MQ-4 重要規格說明:

  • 偵測氣體:甲烷(CH4)、天然氣(LPG)
  • 靈敏度範圍:200 至 10,000 ppm(官方規格表
  • 工作電壓:穩定的 5V 直流電
  • 工作電流:最少 150mA,建議 250mA 以上
  • ⚠️ 預熱時間:每次通電後至少需要 1 分鐘加熱穩定,才能取得準確數據

關於電流注意事項:由於 MQ-4 需要 150~250mA 的電流,而 WeMos D1 mini 的 3.3V 引腳只能提供 50mA,必須由外部電源(5V)直接供電給感測器,不能直接接在開發板引腳上。


電路接線圖

基本接線(使用 USB 5V 供電)

MQ-4 基本電路接線圖

外接電源接線(建議:更穩定的 5V 獨立電源)

MQ-4 外接電源電路接線圖

整體系統架構圖

瓦斯偵測系統架構圖

第一步:設定 Line Notify

WeMos D1 mini 透過 Line Notify 這個中介工具,可以在 MQ-4 偵測到瓦斯濃度超標時,即時發送通知到 Line 個人訊息或群組。

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

Line Notify 登入頁面

設定步驟:

  1. 進入 Line Notify 官網,點選右上角 「登入」,使用您的 Line 帳號登入。
  2. 登入後,點選右上角自己的帳號名稱,選擇 「個人頁面」
  3. 向下捲動找到 「發行存取權杖(開發人員用)」,點選 「發行權杖」
發行存取權杖
  1. 填寫權杖名稱(如:瓦斯偵測通知),方便之後辨識。
  2. 選擇接收通知的聊天室(可選擇個人訊息,或已建立的群組「瓦斯偵測通知」)。
選擇通知群組
  1. 按下 「發行」,系統會產生一組 Token 存取金鑰
複製 Token 金鑰

⚠️ 重要提醒:這組 Token 號碼只出現這一次!請務必立刻複製並妥善保存,之後無法再次查詢。

  1. 設定完成後,Line 會通知您有新的 Line Notify 服務建立,並提醒您邀請「Line Notify」加入指定群組。
Line Notify 已建立

第二步:程式碼設計(WeMos D1 mini / ESP8266)

基本版:取得感測器原始數值並發送 Line 通知

此版本程式碼使用 TridentTD_LineNotify 程式庫來發送 Line 通知。請先到該連結下載 .zip 壓縮檔,解壓縮後將資料夾放入 Arduino IDE 的 libraries 目錄下。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <TridentTD_LineNotify.h>

// ★ 修改成您自己的 Line Notify Token
#define LINE_TOKEN "your_line_notify_token_here"

// ★ 修改成您的 Wi-Fi 設定
const char* ssid     = "your_wifi_ssid";
const char* password = "your_wifi_password";

const int MQ4_PIN = A0;          // MQ-4 類比訊號接 A0 引腳

// 通知時間設定
const int COUNT_NORMAL  = 1800;  // 正常狀態:每 30 分鐘通知一次
const int COUNT_WARNING = 10;    // 超標狀態:每 10 秒通知一次
const int GAS_THRESHOLD = 500;   // 瓦斯濃度警戒值(原始 ADC 數值)

int count_number  = 0;
int count_seconds = COUNT_NORMAL;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  Serial.print("連線中");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\n連線成功!IP: " + WiFi.localIP().toString());
}

void loop() {
  int sensorValue = analogRead(MQ4_PIN);
  Serial.print("MQ-4 感測值: ");
  Serial.println(sensorValue);
  
  // 根據濃度設定通知間隔
  count_seconds = (sensorValue > GAS_THRESHOLD) ? COUNT_WARNING : COUNT_NORMAL;
  
  if (count_number >= count_seconds) {
    String message = "瓦斯濃度:" + String(sensorValue) + " (ADC值)\n";
    
    if (sensorValue > GAS_THRESHOLD) {
      message += "⚠️ 瓦斯濃度超標!請立即檢查瓦斯開關!";
    } else {
      message += "✅ 目前濃度正常";
    }
    
    LINE.setToken(LINE_TOKEN);
    LINE.notify("\n" + message);
    count_number = 0;
  }
  
  count_number++;
  delay(1000);  // 每秒執行一次
}

程式邏輯說明:

  • 正常狀態(濃度低於閾值):每 30 分鐘發送一次例行通知
  • 超標狀態(濃度高於閾值):每 10 秒持續發送警報通知,直到濃度恢復正常

第三步:高精度濃度計算(高級版)

為什麼需要高級版?

基本版取得的是 ESP8266 類比引腳的 ADC 原始數值(0~1023),這個數值並不等同於真實的 ppm 濃度。為了取得準確的 ppm 數值,我們需要根據 MQ-4 的規格表進行數學計算。

MQ-4 感測器原理

MQ-4 規格圖

MQ-4 感測器內建電阻(RS),其阻值會隨著氣體濃度改變:

  • 濃度越高 → RS 阻值越低
  • 濃度越低 → RS 阻值越高

感測器還需要串聯一個負載電阻 RL(通常為 10kΩ~47kΩ),用於調整靈敏度。阻值越大,感測器越靈敏。

電路如下:

感測器簡化電路
感測器引腳說明
引腳接線圖

計算公式推導(歐姆定律應用)

根據歐姆定律(V = I × R),以及 RS 和 RL 串聯的電路,我們可以推導出感測器電阻 RS 的公式:

RS = [(Vc × RL) / VRL] - RL

其中:

  • Vc = 電源電壓(5V)
  • RL = 負載電阻值
  • VRL = RL 兩端測量到的電壓

從 MQ-4 規格表的特性曲線圖(log-log 刻度)中,我們可以讀出 CH4 濃度與 RS/R0 比值的關係:

MQ-4 特性曲線圖

參考曲線圖中的兩個點 (200, 2.6) 和 (5000, 0.9),計算對數線性方程式:

斜率 m = log(0.9/2.6) / log(5000/200) = -0.329
截距 b = log(0.9) - (-0.329) × log(5000) = 1.17

ppm 濃度公式:
x (ppm) = 10 ^ { [log(RS/R0) - b] / m }

步驟一:先測量 R0 值(空氣中的基準電阻)

將以下程式燒錄到 WeMos D1 mini,放置在通風良好的正常空氣中跑幾分鐘,待數值穩定後記下 R0 值:

計算 R0 值的程式碼

步驟二:帶入 R0 值計算真實 ppm

帶入 R0 值的程式碼

高級版整合(自動計算 R0 + Line 通知)

上面兩步驟合而為一,開機自動計算 R0,並即時換算出真實的 CH4 ppm 濃度:

高級版程式碼 - 第一部分
高級版程式碼 - 第二部分
高級版程式碼 - 第三部分

收到的 Line 通知範例(高級版):

Line 通知內容 - 1
Line 通知內容 - 2

第四步(選用):透過 IFTTT 通知 Line

除了直接使用 Line Notify API 外,也可以透過 IFTTT(If This Then That) 這個自動化平台來觸發 Line 通知。IFTTT 串接了 Gmail、Twitter、Facebook、Line 等大量知名平台的服務,是物聯網整合的利器。

IFTTT 官方網站https://ifttt.com/

IFTTT 設定步驟:

  1. 進入 IFTTT 網站,點選「Sign up」註冊並登入(支援 Google/Facebook 第三方登入)。
  2. 點選「Create」建立新的自動化服務。
IFTTT 建立服務
  1. 點選「+ This」設定觸發條件。
選擇 This
  1. 搜尋「webhooks」並選擇 Webhooks 服務。
選擇 Webhooks
  1. 選擇「Receive a web request」。
Receive web request
  1. 填入事件名稱「gas_notify」,按下建立。
填入事件名稱
  1. 點選「+ That」設定執行動作,搜尋並選擇「Line」服務。
選擇 Line
  1. 選擇「Send message」,設定接收通知的對象(個人或群組),訊息內容中可使用 Value1Value2Value3 三個欄位帶入動態數值。
設定 Line 訊息
  1. 確認設定無誤後按下完成。
完成設定
  1. 完成後,在 IFTTT 首頁找到剛建立的事件,點選 Webhooks 圖示 → 右上角「Documentation」,取得您的 Webhooks 專屬 Key
查看 Webhooks Key
複製 Key
  1. 若測試失敗,請先確認 Line Notify 連動服務已啟用。回到剛建立的服務,點選 Line 圖示確認連動狀態:
確認 Line 連動
同意並連動

按下「同意並連動」後,Line 會收到連動成功的提示訊息:

連動成功通知

IFTTT 介面也會顯示 Line 連動服務為 Active 狀態:

IFTTT Line 狀態

使用 IFTTT 的程式碼修改(ESP8266 部分):

IFTTT 程式碼 1
IFTTT 程式碼 2
IFTTT 程式碼 3

透過 IFTTT 收到的 Line 通知:

IFTTT Line 通知 1
IFTTT Line 通知 2

第五步(選用):使用 RemoteMe 建立 Web 儀表板

若想在瀏覽器或手機上即時查看瓦斯濃度的數值儀表板,可以使用 RemoteMe.org 這個免費服務,不需要自己架設伺服器。

RemoteMe 官方網站RemoteMe.org

設定步驟:

  1. 前往 RemoteMe.org 註冊並登入帳號。
RemoteMe 登入
  1. 進入「Variables」選項,點選右上角「+Add」新增變數:
  • NameGas_detection
  • ModeLocal
  • TypeInteger
新增 Gas_detection 變數
  1. 前往「Devices」,新增「New Network Device (Esp)」:
  • Type:Arduino
  • NameESP_Gas_detection
新增 ESP 設備
設備設定
  1. 在設備旁點選三條線圖示,選擇「Code Generator Wizard」,依精靈步驟設定:
Code Generator Wizard
  • 步驟一:勾選 Gas_detection 變數
步驟一
  • 步驟二:填入 Wi-Fi SSID 和密碼
步驟二
  • 步驟三:啟動「直接連線」
步驟三
  • 步驟四:啟動 Debug Serial,鮑率設 115200
步驟四
  1. 下載並修改生成的程式碼,加入類比訊號讀取並傳送至 setGas_detection() 函數:
修改後的程式碼
  1. 新增一個 Web 設備(Web_Gas_ppm),建立儀表板介面:
新增 Web 設備
填入 Web 設備名稱
  1. 點選設備旁的箭頭 → 選擇「index」→「Edit with wizard」:
點選 index
Edit with wizard
  1. 插入「Insert Component」→ 選擇「gauge」儀表元件:
選擇 gauge
gauge 設定
  1. 設定儀表參數:
  • NameGas_detection
  • TitleGas ppm
  • Min0Max1200Step100
儀表設定完成
完成圖
  1. 完成後可以選擇開新視窗查看,或生成 URL/QR Code 分享使用:
查看方式選項
URL 和 QR Code
QR Code 完成

最終成果 — 即時在網頁和手機上查看瓦斯濃度值:

網頁版儀表板
手機版介面

第六步(選用):自己開發 Android APP 讀取 ESP8266 數值

若您有 Android 開發經驗,也可以自行開發 APP,透過 TCP Socket 直接與 ESP8266 通訊,即時接收瓦斯感測數值。

基本架構:

  • ESP8266 和 Android 手機必須在同一個區域網路(同一個 Wi-Fi)
  • ESP8266 在接收到數值後,主動透過 TCP 傳送給 APP
  • APP 使用一個 TCP Server(Port 8266)持續監聽接收資料,另一個 Thread 負責更新 UI 顯示

ESP8266 程式碼:

ESP8266 APP 通訊程式碼

Android APP 程式碼(MainActivity + MobileServer + Layout XML):

Android MainActivity 程式碼
Android MobileServer 程式碼
Layout XML 介面

APP 執行結果:

Android APP 顯示結果

結語

這篇文章介紹了多種實現 MQ-4 瓦斯濃度偵測系統的方法,涵蓋從基本的 ADC 數值讀取,到利用對數公式計算真實 ppm 濃度、透過 Line Notify 即時通知、IFTTT 整合、RemoteMe Web 儀表板,以及自製 Android APP。

物聯網的強大之處在於它的靈活性與實用性 — 我們可以用相對低廉的成本,在家中建構一套守護家人安全的智慧系統。隨著 5G 通訊技術逐漸普及,物聯網應用將更加無縫地融入我們的日常生活,許多生活上的需求也將整合在手機或穿戴式裝置上,讓我們的生活更加安全、便捷。

您可以進一步參考:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端