MQ-3氣體感測器模組

利用 MQ-3 酒精氣體感測器模組,可偵測空氣中的酒精、乙醇濃度,適用於酒測、呼氣分析、智慧車鎖、居家安全等應用。透過類比輸出,可即時讀取氣體變化並進行判斷,適合用於物聯網與感測器入門教學。

氣體感測器模組電路圖

  • Raspberry Pi Pico W

  • Raspberry Pi Pico W 擴充板

  • MQ-3氣體感測器模組

  • 母 – 母 杜邦線

Arduino 程式如下

// KEYES MQ-3 酒精感測器 + Raspberry Pi Pico W
// 讀取類比輸出並在序列埠顯示數值與簡易判斷(含預熱時間)

const int MQ3_PIN = A0;          // MQ-3 類比輸出接 Pico W 的 A0
const int LED_PIN = LED_BUILTIN; // Pico W 內建 LED

// === 預熱時間設定(以「分鐘」為單位) ===
const int PREHEAT_MINUTES = 1;   // 建議預熱 10 分鐘以上
const unsigned long PREHEAT_MS = (unsigned long)PREHEAT_MINUTES * 60UL * 1000UL;

// 簡單序列印出控制
unsigned long lastPreheatPrint = 0;

// 這個門檻值要依實際環境微調:
// Pico W 的 ADC 是 12-bit(0~4095),
// 可以先觀察「乾淨空氣」的數值,再決定門檻。
int alcoholThreshold = 2000;     // 範例值,請之後用乾淨空氣/酒精實測微調

void setup() {
  pinMode(MQ3_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  analogReadResolution(12);

  Serial.begin(115200);
  while (!Serial) {
    // 等待序列埠就緒(USB 連線)
  }

  Serial.println("MQ-3 酒精感測器 - Pico W 測試");
  Serial.print("預熱時間設定:");
  Serial.print(PREHEAT_MINUTES);
  Serial.println(" 分鐘");
  Serial.println("預熱期間只顯示倒數,不做酒精濃度判斷");
  Serial.println("===========================================");
}

void loop() {
  unsigned long now = millis();

  // ============================
  //  預熱階段:只做倒數提示
  // ============================
  if (now < PREHEAT_MS) {
    // 關閉 LED
    digitalWrite(LED_PIN, LOW);

    // 每 1 秒輸出一次剩餘時間
    if (now - lastPreheatPrint >= 1000) {
      lastPreheatPrint = now;

      unsigned long remainMs = PREHEAT_MS - now;
      unsigned long remainSec = remainMs / 1000;
      unsigned long remainMin = remainSec / 60;
      unsigned long remainSecInMin = remainSec % 60;

      Serial.print("預熱中,剩餘約 ");
      Serial.print(remainMin);
      Serial.print(" 分 ");
      Serial.print(remainSecInMin);
      Serial.println(" 秒...");
    }

    return; // 還在預熱,下面的偵測邏輯先不跑
  }

  // ============================
  //  預熱完成,開始正式量測
  // ============================

  // 讀多次取平均,讓數值穩定一點
  const int samples = 10;
  long sum = 0;

  for (int i = 0; i < samples; i++) {
    int val = analogRead(MQ3_PIN); // 0 ~ 4095
    sum += val;
    delay(5);                      // 小延遲,避免太快
  }

  int rawValue = sum / samples;    // 平均後的 ADC 值

  // 將 ADC 值轉換為電壓(這裡以 5V 來換算)
  float voltage = rawValue * (5.0 / 4095.0);

  // 判斷是否有較高濃度酒精
  bool alcoholDetected = (rawValue > alcoholThreshold);

  // 控制 LED:有偵測到就亮
  digitalWrite(LED_PIN, alcoholDetected ? HIGH : LOW);

  // 印出資訊
  Serial.print("ADC Raw = ");
  Serial.print(rawValue);
  Serial.print("\tVoltage = ");
  Serial.print(voltage, 3);
  Serial.print(" V\tStatus = ");

  if (alcoholDetected) {
    Serial.println("Alcohol Detected(酒精濃度較高)!!");
  } else {
    Serial.println("Normal / Clean Air(正常或低濃度)");
  }

  delay(200); // 每 200ms 更新一次
}

程式執行結果

程式適用酒精(乙醇),如:消毒酒精,或人體呼吸中的酒精含量,最為靈敏。

程式中可設定閾值(程式預設2000)。

若酒精濃度超過閾值,則序列埠監控視窗會顯示酒精濃度較高,而PICO W內建的 LED燈會亮起。

程式執行後,會進預熱時間倒數(時間可自訂,建議10分鐘以上)。

未偵測到酒精,則顯示正常或低濃度。

若偵測到酒精,則會顯示酒精濃度較高。

而PICO W內建的 LED燈會亮起。

Last updated

Was this helpful?