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-2 | ESP32-C3 |
|---|---|
| VCC | 5V |
| GND | GND |
| DO | GPIO4 |
Option B: dùng AO (để vẽ chart “mức độ”)
| MQ-2 | ESP32-C3 |
|---|---|
| VCC | 5V |
| GND | GND |
| AO | GPIO2 (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óismoke_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 > thresholdtrong 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


