IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 30 – Đọc cảm biến MQ-2: phát hiện khói/gas & theo dõi realtime

MQ-2 là một trong những cảm biến “quốc dân” cho DIY/Maker khi làm cảnh báo khói/gas.
Bài này tập trung vào cách dùng MQ-2 đúng kiểu IoT: đọc tín hiệu ổn định, đặt ngưỡng cảnh báo, và gửi dữ liệu realtime lên IoTLabs Cloud MQTT.

Lưu ý thực tế: MQ-2 phù hợp phát hiện sớm / cảnh báo tương đối, không dùng thay thiết bị an toàn công nghiệp.

1. MQ-2 đo được gì?

MQ-2 nhạy với:

  • Khói (smoke)
  • LPG / propane / butane
  • Methane (CH4)
  • Hydrogen (H2) (mức độ tuỳ môi trường)

MQ-2 thường có 2 ngõ ra:

  • AO (Analog): giá trị “mức độ” tương đối
  • DO (Digital): so sánh ngưỡng bằng biến trở trên module

2. Chuẩn bị phần cứng và lưu ý nguồn

Thiết bị

  • ESP32-C3 SuperMini
  • MQ-2 module (có AO/DO)
  • Dây jumper

Lưu ý rất quan trọng

  • MQ-2 có heater → tiêu thụ dòng khá lớn và nóng lên khi chạy.
  • Module MQ-2 thường chạy 5V.
  • Ngõ AO có thể lên mức 5V → cần đảm bảo ADC ESP32 không bị quá áp.

✅ Cách an toàn:

  • Dùng chân DO (digital) cho cảnh báo đơn giản (an toàn hơn)
  • Nếu đọc AO, nên có chia áp về 3.3V

3. Nối dây MQ-2 với ESP32

Option A (khuyến nghị cho bài này): dùng DO (cảnh báo ngưỡng)

MQ-2ESP32-C3
VCC5V
GNDGND
DOGPIO4

Option B: dùng AO (để vẽ chart “mức độ”)

MQ-2ESP32-C3
VCC5V
GNDGND
AOGPIO2 (ADC) (qua chia áp)

4. Warm-up & đọc ổn định

MQ-2 cần thời gian làm nóng để ổn định.

  • Demo: 1–2 phút là dùng được
  • Ổn định hơn: 5–10 phút

📌 Trong IoT thực tế, nên:

  • Bỏ qua dữ liệu ở giai đoạn warm-up
  • Hoặc báo trạng thái sensor_ready = 0/1

5. Ví dụ 1: Đọc MQ-2 đơn giản (DO + AO)

#define MQ2_DO_PIN 4
#define MQ2_AO_PIN 2

void setup() {
  Serial.begin(115200);
  pinMode(MQ2_DO_PIN, INPUT);
  pinMode(MQ2_AO_PIN, INPUT);
}

void loop() {
  int alarm = digitalRead(MQ2_DO_PIN);  // 0/1 tuỳ module
  int raw = analogRead(MQ2_AO_PIN);     // 0..4095 (ESP32 ADC)

  Serial.print("MQ2 DO: ");
  Serial.print(alarm);
  Serial.print(" | MQ2 AO(raw): ");
  Serial.println(raw);

  delay(1000);
}

📌 Nếu DO đang “ngược” (báo 0 khi có khói) thì bạn chỉ cần đảo logic ở code.

6. Chuẩn hoá dữ liệu: “mức độ khói/gas” kiểu IoT

Với MQ-2 DIY, ta nên dùng cách “thực dụng”:

  • raw ADC làm mức độ tương đối
  • Hoặc map thành % theo baseline

Ví dụ:

  • baseline = ADC khi không có khói
  • smoke_index = max(0, raw - baseline)

Payload gợi ý:

{
  "ts": 1760000000,
  "metrics": {
    "gas_raw": 1530,
    "alarm": 0
  }
}

7. Ví dụ 2: Gửi dữ liệu realtime lên IoTLabs Cloud MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

#define MQ2_DO_PIN 4
#define MQ2_AO_PIN 2

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/telemetry";

WiFiClientSecure net;
PubSubClient mqtt(net);

unsigned long lastSend = 0;

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-mq2", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(MQ2_DO_PIN, INPUT);
  pinMode(MQ2_AO_PIN, INPUT);

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (millis() - lastSend > 1000) {
    lastSend = millis();

    int alarm = digitalRead(MQ2_DO_PIN);
    int raw = analogRead(MQ2_AO_PIN);

    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{";
    payload += "\"gas_raw\":" + String(raw) + ",";
    payload += "\"alarm\":" + String(alarm);
    payload += "}}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);
  }
}

8. Kinh nghiệm thực tế để tránh báo giả

  • Đặt sensor tránh nơi có gió mạnh
  • Không đặt sát bếp, khói nấu ăn nếu không muốn cảnh báo liên tục
  • Dùng rule:
    • gas_raw > threshold trong N giây liên tục
    • Cooldown 30–60s
  • Kết hợp thêm:
    • nhiệt độ/độ ẩm (DHT/AHT) để phân tích môi trường

9. Ứng dụng thực tế

Sau bài này, bạn có thể làm:

  • Cảnh báo khói/gas realtime
  • Log lịch sử mức độ khói theo thời gian
  • Kết hợp relay:
    • bật quạt hút
    • bật còi
  • Kết hợp rule engine:
    • alarm=1 → gửi Telegram/Email

10. Tổng kết Bài 30

Bạn đã:

  • Hiểu MQ-2 đo gì và giới hạn DIY
  • Đọc DO/AO đúng cách
  • Gửi dữ liệu realtime lên IoTLabs Cloud MQTT
  • Sẵn sàng cho bài tiếp theo: cảnh báo thông minh + debounce/cooldown