# MQ-3氣體感測器模組

<figure><img src="https://1275793585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LaZQFBYOS3O0ksiEmR1%2Fuploads%2F0NfN60QY2mhCX9ttwBP2%2Fimage.png?alt=media&#x26;token=f95b36e2-1389-4347-bfc9-93cb13d63d35" alt=""><figcaption></figcaption></figure>

### **氣體感測器模組電路圖**

* Raspberry Pi Pico W
* Raspberry Pi Pico W 擴充板
* MQ-3氣體感測器模組
* 母 – 母 杜邦線

{% hint style="success" %}
*<mark style="color:$warning;">**MQ-3 氣體感測器模組是類比訊號輸入。本範例模組的 A0 腳位需接至Raspberry Pi Pico擴充板 A0/D26 腳位。**</mark>*
{% endhint %}

<figure><img src="https://1275793585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LaZQFBYOS3O0ksiEmR1%2Fuploads%2FEhAYXudAavwzOiiDeCbA%2Fimage.png?alt=media&#x26;token=0c537021-efd3-4994-b228-25d5b7d10fa4" alt="" width="464"><figcaption></figcaption></figure>

### **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分鐘以上)。

<figure><img src="https://1275793585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LaZQFBYOS3O0ksiEmR1%2Fuploads%2F5wSpub1qf4soz3InsnDh%2Fimage.png?alt=media&#x26;token=6d321a3c-d198-4d5c-89f4-47d3efcb2fbf" alt="" width="353"><figcaption></figcaption></figure>

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

<figure><img src="https://1275793585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LaZQFBYOS3O0ksiEmR1%2Fuploads%2Fclft2cdLoHdZhYMdI2MI%2Fimage.png?alt=media&#x26;token=9f7b2dd5-25c8-4a84-aa43-cd26afb1be7b" alt="" width="410"><figcaption></figcaption></figure>

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

<figure><img src="https://1275793585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LaZQFBYOS3O0ksiEmR1%2Fuploads%2FCh8RzQ0W9dZxirZY2qsN%2Fimage.png?alt=media&#x26;token=0d273a93-5b2b-4a6d-b805-3d38b4bc8b1f" alt="" width="419"><figcaption></figcaption></figure>

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

<figure><img src="https://1275793585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LaZQFBYOS3O0ksiEmR1%2Fuploads%2F38KrrFxisLPX4Dkw8tUO%2Fimage.png?alt=media&#x26;token=65b0594b-7434-44d3-a449-10a947448e54" alt="" width="323"><figcaption></figcaption></figure>
