ESP32, IOT物聯網

【ESP32教學】第三十七篇:MQ-2 煙霧與易燃氣體感測器:ADC 類比讀取、靈敏度校正、蜂鳴器防護警報與雙範例實作

DIY 居家安全警報系統:ESP32 與 MQ-2 煙霧氣體檢測專題應用情境圖

一、 實驗說明:為什麼選擇 ESP32 結合 MQ-2 氣體感測器?

在打造 IoT 物聯網智慧家庭防護專題時,結合 ESP32 開發板 與 MQ-2 氣體感測模組 是最熱門且實用的組合!

核心技術與感測原理

  1. 二氧化錫 () 半導體氣敏材料: 在潔淨空氣中, 電導率較低;當環境中出現煙霧、瓦斯(LPG)、甲烷、丙烷、丁烷、氫氣或酒精等易燃氣體時,感測器電導率上升。

  2. 雙訊號輸出 (AO / DO):

    • AO (Analog Output): 輸出類比電壓。由於 ESP32 內建 12 位元 ADC(範圍 0 ~ 4095),可提供更細緻的氣體濃度變化解析。

    • DO (Digital Output): 透過板載 LM393 比較器手動設定觸發門檻,超過設定濃度時輸出數位低電平。

  3. 加熱元件預熱需求: 模組內部設有加熱絲,通電後需經預熱使氣體分子順利吸附與反應。

二、 ???? MQ-2 模組說明:腳位與靈敏度調節

MQ-2 模組整合了 LM393 比較器晶片與可變電阻。

???? 模組腳位定義表 (Pin Definition)

腳位名稱 (Pin) 類型 功能說明 (Description) ESP32 開發板建議連接腳位
VCC 電源 電源正極,建議外接 5V 供加熱絲使用 5V (或 VIN)
GND 電源 電源接地 GND
DO (Digital Out) 開關訊號 數位輸出(超過門檻輸出 LOW) GPIO 4 (或任意數位輸入腳)
AO (Analog Out) 類比訊號 類比電壓輸出(濃度越高,數值越大) GPIO 34 (ADC1 專屬輸入腳)

⚙️ 靈敏度微調步驟:

  1. 將模組通電預熱約 1~3 分鐘。

  2. 觀看板載的訊號指示燈 (Signal LED)。

  3. 旋轉藍色可變電阻,調整至 LED 剛好熄滅;當有打火機氣體或煙霧靠近時,LED 亮起即完成門檻設定。

三、 ???? 準備好你的硬體工具了嗎?

在開始進行電路接線與程式編寫前,建議備齊 ESP32 開發板與 MQ-2 氣體感測模組,確保居家安全物聯網專題流暢:

???? 推薦選購: 歡迎直接購買米羅為您搭配好的 ESP32 物聯網應用學習套件,新手零基礎也能輕鬆上手!

四、 實驗所需材料與電路接線圖 (Hardware Setup)

本專題結合 ESP32 開發板、MQ-2 模組 與 蜂鳴器 (Buzzer),打造智慧氣體防護系統。

⚠️ 注意事項:

  • MQ-2 加熱絲功率較大,建議將 MQ-2 的 VCC 連接至 ESP32 的 5V (VIN) 供電,以確保加熱穩定。

  • ESP32 的 ADC 腳位(如 GPIO 34、35、36、39)僅支援 0~3.3V 電壓輸入。好在 MQ-2 的 AO 輸出電平最高約為 3.3V ~ 4V 左右,為安全起見,建議透過 AO 串接一個 10k 分壓電阻或直接接至 ADC1 腳位讀取。

???? 準備材料

  • ESP32 開發板 x 1

  • MQ-2 煙霧氣體感測器模組 x 1

  • 有源蜂鳴器 (Buzzer) x 1

  • LED 發光二極體 + 220Ω 電阻 x 1

  • USB 傳輸線 x 1

  • 杜邦線 若干

⚡ 腳位對接說明 (Pin Mapping)

MQ-2 / 蜂鳴器腳位 功能說明 ESP32 對應引腳
MQ-2 VCC 加熱與模組電源 (5V) 5V (或 VIN)
MQ-2 GND 電源接地 GND
MQ-2 AO 氣體濃度類比訊號 GPIO 34 (ADC1_CH6)
MQ-2 DO 門檻觸發數位訊號 GPIO 4
Buzzer (+) 蜂鳴器正極 GPIO 23
LED (+) 警報指示燈 GPIO 2 (板載LED或外接)

五、 程式碼實作範例

???? 程式範例一:使用 DO 數位門檻警報 (Digital Threshold Alarm)

本範例透過 ESP32 讀取 MQ-2 的 DO 數位腳位。當偵測到氣體超標時,立即觸發 GPIO 2 發光並驅動蜂鳴器警報。

const int MQ2_DO_PIN = 4;   // MQ-2 DO 連接至 ESP32 GPIO 4
const int BUZZER_PIN = 23;  // 蜂鳴器連接至 ESP32 GPIO 23
const int LED_PIN = 2;      // 警報 LED 連接至 ESP32 GPIO 2

void setup() {
  pinMode(MQ2_DO_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  
  Serial.begin(115200);
  Serial.println("ESP32 MQ-2 數位門檻防護警報系統初始化...");
}

void loop() {
  int sensorState = digitalRead(MQ2_DO_PIN);

  if (sensorState == LOW) { // MQ-2 觸發時 DO 輸出 LOW
    Serial.println("【警告】ESP32 偵測到煙霧/易燃氣體濃度過高!");
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(BUZZER_PIN, HIGH); // 觸發蜂鳴器
  } else {
    digitalWrite(LED_PIN, LOW);
    digitalWrite(BUZZER_PIN, LOW);  // 恢復正常
  }
  
  delay(200);
}

???? 程式範例二:使用 AO 類比讀取與動態門檻警報 (ESP32 12-bit ADC & Level Monitoring)

本範例利用 ESP32 的 12 位元 ADC(範圍 0 ~ 4095)讀取 MQ-2 的 AO 類比數值,在序列埠監視器輸出即時濃度,並在數值超過設定門檻時啟動聲光警報。


const int MQ2_AO_PIN = 34;   // MQ-2 AO 連接至 ESP32 GPIO 34 (ADC1)
const int BUZZER_PIN = 23;   // 蜂鳴器連接至 ESP32 GPIO 23
const int LED_PIN = 2;       // 警報 LED 連接至 ESP32 GPIO 2

// ESP32 ADC 解析度為 12-bit (0 ~ 4095),設定氣體觸發門檻
const int GAS_THRESHOLD = 1500; 

void setup() {
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  
  // ESP32 ADC 設定(可選:設定衰減以擴大輸入電壓範圍)
  analogSetAttenuation(ADC_11db); 

  Serial.begin(115200);
  Serial.println("ESP32 MQ-2 類比氣體濃度監測系統啟動...");
}

void loop() {
  int analogVal = analogRead(MQ2_AO_PIN);

  Serial.print("ESP32 讀取氣體濃度類比值 (AO): ");
  Serial.println(analogVal);

  if (analogVal > GAS_THRESHOLD) {
    Serial.println("⚠️ 警告:氣體濃度超越安全臨界值!");
    
    // 間歇性警報聲光效果
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(BUZZER_PIN, HIGH);
    delay(100);
    digitalWrite(LED_PIN, LOW);
    digitalWrite(BUZZER_PIN, LOW);
    delay(100);
  } else {
    digitalWrite(LED_PIN, LOW);
    digitalWrite(BUZZER_PIN, LOW);
    delay(500);
  }
}

六、 常見問題與除錯 (FAQ)

Q1:MQ-2 剛接上 ESP32 時發熱是正常的嗎?

  • 解答: 是正常的。MQ-2 內部有加熱絲需持續發熱才能使半導體氣敏材料發揮效用。若發燙至燙傷或冒煙,請立即檢查 5V 與 GND 是否接反。

Q2:在乾淨空氣中,ESP32 讀到的類比數值 (AO) 偏高或浮動?

  • 解答: MQ-2 首次啟用或久未使用時,表面會吸附殘餘雜質。請讓 ESP32 保持通電、持續預熱 12~24 小時,讓加熱絲完全清除雜質,數值就會下降並穩定。

Q3:ESP32 的 ADC 讀取數值不準確或碰到 4095 頂天?

  • 解答: 請確認 AO 腳位是接在 ESP32 的 ADC1 專屬腳位(例如 GPIO 34、35、36、39),並在程式碼中加上 analogSetAttenuation(ADC_11db); 以支援 0 ~ 3.3V 的輸入電壓範圍。

???? 延伸閱讀與推薦課程

???? 上一篇回顧:第三十六篇:專題ESP32氣象站+電子時鐘 OpenWeather 天氣預報搭配 ILI9341顯示螢幕

???? 總索引:ESP32 新手零基礎入門到 AI 人工智慧與 IoT 物聯網專題實作索引