Cảm biến khí ga: MQ, điện hóa, xúc tác, NDIR – cấu tạo, nguyên lý, chế tạo và đọc MQ-2 bằng ESP32
Cảm biến khí ga hoạt động thế nào: bán dẫn SnO₂ họ MQ, điện hóa, xúc tác, hồng ngoại NDIR, cách chế tạo cảm biến bán dẫn và đọc module MQ-2 bằng ESP32 để tính Rs/R0, ước lượng ppm.
Cảm biến khí ga phát hiện khí cháy nổ (LPG trong bình gas, khí thiên nhiên, hydro), khí độc (CO, H₂S, NH₃) hoặc đo nồng độ CO₂ trong phòng. Mỗi loại khí và mỗi yêu cầu (rẻ hay chính xác, báo động hay đo liên tục) có một nguyên lý cảm biến phù hợp. Bài viết giải thích cấu tạo và nguyên lý của cảm biến bán dẫn oxit kim loại (họ MQ), cảm biến điện hóa, cảm biến xúc tác và cảm biến hồng ngoại NDIR, cách chế tạo cảm biến bán dẫn, rồi hướng dẫn đọc module MQ-2 bằng ESP32: tính điện trở cảm biến, tỉ số Rs/R0 và ước lượng nồng độ khí.
1. Cảm biến khí đo gì, có những loại nào

- Nồng độ khí tính theo ppm (phần triệu thể tích) hoặc % thể tích: 1 % = 10 000 ppm. Không khí ngoài trời có khoảng 420 ppm CO₂.
- Với khí cháy, ngưỡng nguy hiểm là giới hạn nổ dưới (LEL): khoảng 5 % thể tích với metan, khoảng 2 % với LPG (propan, butan). Máy đo khí cháy thường báo theo % LEL, ví dụ báo động ở 10 % đến 20 % LEL.
- Khí độc như CO nguy hiểm ở nồng độ thấp hơn nhiều, từ vài chục ppm nếu hít lâu, nên cần cảm biến đo được tới vài ppm.
| Loại | Nguyên lý | Khí thường đo | Đặc điểm |
|---|---|---|---|
| Bán dẫn oxit kim loại (MOS) | Điện trở lớp SnO₂ nung nóng giảm khi có khí khử | LPG, metan, hydro, cồn, khói, CO | Rẻ, bền, nhạy; kém chọn lọc, trôi theo nhiệt độ và độ ẩm |
| Điện hóa | Khí phản ứng ở điện cực trong chất điện phân, sinh dòng điện | CO, H₂S, O₂, NO₂, NH₃, Cl₂ | Chọn lọc, chính xác ở ppm thấp, tốn rất ít điện; tuổi thọ vài năm |
| Xúc tác (pellistor) | Khí cháy bị đốt trên hạt có chất xúc tác, hạt nóng lên | Khí cháy (% LEL) | Đo được hầu hết khí cháy; cần oxy, dễ bị ngộ độc |
| Hồng ngoại không tán sắc (NDIR) | Khí hấp thụ ánh sáng hồng ngoại ở bước sóng riêng | CO₂, metan, môi chất lạnh | Ổn định, ít trôi; giá cao hơn, chỉ đo khí hấp thụ hồng ngoại |
| Quang ion hóa (PID) | Đèn tử ngoại ion hóa phân tử khí, đo dòng ion | Hơi dung môi, hợp chất hữu cơ bay hơi | Rất nhạy (ppb); không chọn lọc giữa các chất hữu cơ |
2. Cảm biến bán dẫn oxit kim loại (họ MQ)

Cấu tạo
- Lõi là một ống gốm nhôm oxit nhỏ, phủ một lớp thiếc dioxit (SnO₂) xốp. Hai đầu ống có hai vòng điện cực vàng (A, B) để đo điện trở Rs của lớp SnO₂.
- Một dây nung Ni-Cr (H) luồn trong lòng ống giữ lớp nhạy khí ở vài trăm °C. Với MQ-2, dây nung khoảng 33 Ω, cấp 5 V, tiêu thụ khoảng 150 mA, nên cảm biến ấm tay khi chạy.
- Nắp hai lớp lưới thép không gỉ cho khí đi vào nhưng ngăn ngọn lửa lan ra ngoài, vì bên trong có dây nung nóng đặt trong môi trường có thể chứa khí cháy.
- Sáu chân: hai chân A, hai chân B (nối chung bên trong) và hai chân H. Các loại MQ khác nhau (MQ-2, MQ-3, MQ-4, MQ-7, MQ-135...) khác ở thành phần lớp nhạy, chất xúc tác pha thêm và nhiệt độ nung, nên nhạy nhất với những khí khác nhau.
Nguyên lý
SnO₂ là bán dẫn loại n. Ở nhiệt độ cao, oxy trong không khí bám lên bề mặt hạt và lấy electron từ hạt, tạo thành ion O⁻. Bề mặt mỗi hạt vì vậy có một lớp nghèo electron, chỗ hai hạt chạm nhau có hàng rào thế ngăn electron đi qua: điện trở Rs lớn. Khi có khí khử như CO, H₂, metan, LPG hay hơi cồn, khí phản ứng với O⁻ trên bề mặt (ví dụ CO + O⁻ → CO₂ + e⁻) và trả electron về hạt. Lớp nghèo mỏng đi, hàng rào thấp xuống, Rs giảm. Nồng độ khí càng cao, Rs càng nhỏ.

Đường đặc tính Rs/R0

- Datasheet không cho Rs tuyệt đối vì mỗi cảm biến chênh lệch nhiều, mà cho tỉ số Rs/R0, với R0 là điện trở ở một điều kiện chuẩn. Với MQ-2, Rs trong không khí sạch xấp xỉ 9,8 lần R0, nên đo Rs ở chỗ thoáng rồi chia cho 9,8 là ra R0.
- Trên hai trục log, mỗi đường gần như thẳng: log(Rs/R0) = a + b × log(ppm). Từ Rs/R0 đo được và đường của khí đang quan tâm, tính ngược ra ppm.
- Cùng một Rs/R0 ứng với nồng độ rất khác nhau tùy khí, và cảm biến không phân biệt được đang ngửi khí nào. Vì vậy số ppm từ cảm biến MQ chỉ là ước lượng khi đã biết trước loại khí, và còn lệch theo nhiệt độ, độ ẩm.
- Cảm biến mới cần nung liên tục nhiều giờ (datasheet ghi trên 24 giờ) cho lớp nhạy ổn định; mỗi lần bật lại cũng cần vài phút để nóng đều.
3. Cảm biến điện hóa, xúc tác và hồng ngoại

- Điện hóa. Khí khuếch tán qua màng vào một pin nhỏ chứa chất điện phân. Ở điện cực làm việc (WE), khí bị oxy hóa (CO thành CO₂) hoặc bị khử (O₂, NO₂), sinh dòng điện cỡ nA đến µA tỉ lệ với nồng độ. Điện cực đối (CE) khép kín mạch, điện cực so sánh (RE) giữ cho điện thế của WE không đổi nhờ một mạch ổn thế. Đây là loại dùng trong máy báo CO gia đình và máy đo khí độc cá nhân.
- Xúc tác (pellistor). Hai hạt gốm nhỏ bọc quanh hai cuộn dây bạch kim được nung nóng; một hạt có chất xúc tác (hạt hoạt tính), hạt kia không (hạt bù). Khí cháy bị đốt trên hạt hoạt tính, hạt nóng thêm, điện trở cuộn dây tăng và mạch cầu Wheatstone lệch. Hạt bù trừ ảnh hưởng của nhiệt độ môi trường. Cần đủ oxy để đốt, và bị hỏng dần (ngộ độc) khi gặp hơi silicon, hợp chất chì, lưu huỳnh.
- Hồng ngoại không tán sắc (NDIR). Đèn phát hồng ngoại chiếu qua một ống chứa khí tới đầu thu có bộ lọc chỉ cho qua bước sóng khí đó hấp thụ (4,26 µm với CO₂). Càng nhiều khí, ánh sáng tới đầu thu càng yếu (định luật Beer–Lambert). Một kênh tham chiếu ở bước sóng khác bù cho đèn yếu dần. Không có phản ứng hóa học nên rất ổn định; đây là loại dùng trong máy đo CO₂ trong phòng.
4. Chế tạo cảm biến khí bán dẫn

- Đế gốm. Ống gốm nhôm oxit được in hai vòng điện cực vàng và hàn dây dẫn bạch kim. Loại MEMS đời mới thay ống gốm bằng một màng mỏng treo trên chip silic có dây nung vi mô, chỉ tốn vài chục mW và nóng lên rất nhanh, hợp với thiết bị chạy pin.
- Bột nhạy khí. SnO₂ (hoặc WO₃, ZnO, In₂O₃) hạt rất mịn; hạt càng nhỏ, tỉ lệ bề mặt càng lớn, cảm biến càng nhạy. Pha thêm một lượng nhỏ Pd, Pt làm chất xúc tác để tăng độ nhạy và thay đổi khí mà cảm biến nhạy nhất.
- Phủ và nung kết. Bột trộn chất kết dính thành hồ, quét lên ống, sấy rồi nung ở vài trăm °C để các hạt dính nhau thành lớp xốp có nhiều chỗ tiếp xúc giữa các hạt (chính các chỗ này tạo hàng rào thế).
- Dây nung và chân. Luồn dây nung Ni-Cr qua lòng ống, hàn dây của điện cực và dây nung vào sáu chân trên đế nhựa.
- Vỏ. Bọc nắp hai lớp lưới thép không gỉ để khí vào được mà ngọn lửa không lan ra.
- Già hóa và phân loại. Cấp điện nung nhiều giờ đến nhiều ngày cho lớp nhạy ổn định, rồi đo Rs trong khí chuẩn để loại bỏ hoặc phân nhóm cảm biến theo độ nhạy.
5. Thực hành: đọc module MQ-2 bằng ESP32
Linh kiện
- ESP32 DevKit V1 30 chân.
- Một module cảm biến khí MQ-2 (bốn chân VCC, GND, DO, AO), hai điện trở 10 kΩ và 20 kΩ.
- Breadboard, dây cắm; một bật lửa gas để thử.
Sơ đồ nối

| Module MQ-2 | ESP32 |
|---|---|
| VCC | VIN (5 V từ cổng USB) |
| GND | GND |
| AO | Qua điện trở 10 kΩ vào D34; từ D34 nối điện trở 20 kΩ xuống GND |
| DO | Không dùng (ngõ ra so sánh với ngưỡng chỉnh bằng biến trở trên module) |
Trên module, Rs của cảm biến và một điện trở tải RL (thường 1 kΩ) nối tiếp giữa 5 V và GND; AO là điện áp trên RL. Khi có nhiều khí, AO có thể lên gần 5 V, vượt quá mức ADC của ESP32 chịu được, nên phải qua cầu phân áp. Nên đo lại RL trên module bằng đồng hồ (rút module ra khỏi mạch) và sửa R_TAI nếu khác 1 kΩ.
Chương trình
/*
PYWORLD.VN - Đọc cảm biến khí ga bán dẫn MQ-2 bằng ESP32: tính Rs, tỉ số Rs/R0 và ước lượng nồng độ LPG
Module MQ-2 cấp 5 V từ chân VIN; ngõ AO qua cầu phân áp 10 kΩ / 20 kΩ vào D34 (ADC chỉ chịu tối đa khoảng 3,3 V)
Chờ làm nóng, tự lấy R0 trong không khí sạch; gõ "c" để lấy lại R0. Số ppm chỉ là ước lượng, không thay cho thiết bị báo khí đạt chuẩn
*/
#include <math.h>
#define CHAN_DO 34
const float VC_MV = 5000.0; // Điện áp nguồn của cảm biến (chân VIN khi cắm USB)
const float R_TAI = 1000.0; // Điện trở tải RL trên module (thường 1 kΩ, đo lại bằng đồng hồ)
const float R_TREN = 10000.0; // Cầu phân áp: AO -> 10 kΩ -> D34 -> 20 kΩ -> GND
const float R_DUOI = 20000.0;
const float TI_LE_KHONG_KHI = 9.83; // Rs/R0 trong không khí sạch, đọc từ đồ thị datasheet MQ-2
const float LOG_TI_LE_200 = 0.21; // Đường LPG xấp xỉ: log(Rs/R0) = 0,21 - 0,47 × (log(ppm) - log(200))
const float DO_DOC = -0.47;
const float NGUONG_CANH_BAO = 1000.0; // ppm LPG, ngưỡng in cảnh báo (tự chọn)
const unsigned long THOI_GIAN_LAM_NONG = 180000; // ms; lần đầu dùng cảm biến mới nên để làm nóng lâu hơn nhiều
float r0 = -1; // Ôm; âm nghĩa là chưa hiệu chuẩn
// Điện trở tải thực: RL song song với cầu phân áp (R_TREN + R_DUOI)
const float R_TAI_THUC = R_TAI * (R_TREN + R_DUOI) / (R_TAI + R_TREN + R_DUOI);
// Điện trở lớp nhạy khí Rs (Ôm), trung bình 32 lần đọc; trả về -1 nếu AO gần 0 (chưa cắm cảm biến)
float docRs() {
uint32_t tong = 0;
for (int i = 0; i < 32; i++) {
tong += analogReadMilliVolts(CHAN_DO);
delay(2);
}
float uAo = tong / 32.0 * (R_TREN + R_DUOI) / R_DUOI; // Điện áp AO trước cầu phân áp
if (uAo < 20) {
return -1;
}
return R_TAI_THUC * (VC_MV - uAo) / uAo; // Rs và RL nối tiếp giữa VC và GND
}
void hieuChuanR0() {
float tong = 0;
int dem = 0;
for (int i = 0; i < 20; i++) {
float rs = docRs();
if (rs > 0) {
tong += rs;
dem++;
}
delay(100);
}
if (dem == 0) {
Serial.println("Khong doc duoc cam bien: kiem tra day AO va nguon 5 V");
return;
}
r0 = tong / dem / TI_LE_KHONG_KHI;
Serial.printf("R0 = %.2f kOhm (Rs khong khi sach / %.2f)\n", r0 / 1000, TI_LE_KHONG_KHI);
}
void setup() {
Serial.begin(115200);
analogSetPinAttenuation(CHAN_DO, ADC_11db);
Serial.println("\nCam bien khi ga MQ-2: dang lam nong day nung");
}
void loop() {
unsigned long daChay = millis();
if (daChay < THOI_GIAN_LAM_NONG) {
Serial.printf("Dang lam nong: con %lu s\n", (THOI_GIAN_LAM_NONG - daChay) / 1000);
delay(10000);
return;
}
if (r0 < 0) {
hieuChuanR0(); // Lần đầu sau khi làm nóng: đặt cảm biến ở chỗ thoáng
return;
}
if (Serial.available()) {
String lenh = Serial.readStringUntil('\n');
lenh.trim();
if (lenh == "c") {
hieuChuanR0();
return;
}
}
float rs = docRs();
if (rs < 0) {
Serial.println("Khong doc duoc cam bien: kiem tra day AO va nguon 5 V");
} else {
float tiLe = rs / r0;
float ppm = pow(10, (log10(tiLe) - LOG_TI_LE_200) / DO_DOC + log10(200.0));
if (ppm < 200) {
Serial.printf("Rs %.2f kOhm | Rs/R0 %.2f | LPG < 200 ppm\n", rs / 1000, tiLe);
} else {
Serial.printf("Rs %.2f kOhm | Rs/R0 %.2f | LPG ~%.0f ppm%s\n", rs / 1000, tiLe, ppm,
ppm >= NGUONG_CANH_BAO ? " | CANH BAO: nong do khi cao" : "");
}
}
delay(1000);
}
Giải thích
- Điện áp đo ở D34 nhân 1,5 (tỉ lệ cầu phân áp) ra điện áp AO. Vì cầu phân áp 30 kΩ mắc song song với RL, điện trở tải thực là khoảng 968 Ω; chương trình tính sẵn giá trị này trong
R_TAI_THUC. - Rs = RL × (Vc − U_AO) / U_AO, với Vc = 5 V là nguồn của cảm biến. Nguồn VIN lấy từ USB có thể lệch vài phần trăm khỏi 5 V; đo lại và sửa
VC_MVnếu cần chính xác hơn. - Ba phút đầu chương trình chỉ in thời gian làm nóng. Sau đó nó tự lấy R0 bằng trung bình Rs chia 9,83, nên lúc này cảm biến phải ở chỗ thoáng, không có khí lạ. Gõ
cđể lấy lại R0 bất cứ lúc nào. - Nồng độ LPG tính theo đường xấp xỉ log(Rs/R0) = 0,21 − 0,47 × (log ppm − log 200). Dưới 200 ppm (ngoài phần đồ thị của datasheet) chương trình chỉ ghi "< 200 ppm". Từ 1000 ppm trở lên in thêm cảnh báo; ngưỡng này là giá trị tự chọn trong
NGUONG_CANH_BAO. - Thử bằng cách xả gas bật lửa (không bật lửa) ở cách cảm biến vài chục cm trong một hai giây, ở chỗ thoáng, xa nguồn lửa. Rs giảm gần như ngay lập tức và mất vài chục giây đến vài phút để trở lại.
Kết quả mong đợi

Module MQ-2 phù hợp để học nguyên lý, làm cảnh báo sớm hay bật quạt hút khi có khí lạ. Không dùng nó thay cho thiết bị báo rò rỉ gas đạt chuẩn trong bếp hay nhà xưởng: cảm biến không chọn lọc, trôi theo thời tiết và chưa được kiểm định. Nếu lắp cảnh báo LPG, đặt cảm biến thấp gần sàn vì LPG nặng hơn không khí; khí thiên nhiên (metan) nhẹ hơn nên đặt gần trần.
6. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Báo "Khong doc duoc cam bien" | Chưa nối AO, đứt dây, module chưa có nguồn 5 V | Kiểm tra dây theo bảng nối; đèn nguồn trên module phải sáng |
| Rs/R0 trôi mãi không ổn định | Cảm biến mới chưa được nung đủ lâu | Để cảm biến chạy liên tục một ngày rồi lấy lại R0 bằng lệnh c |
| Số ppm báo cao dù không có gas | Lấy R0 khi chưa nóng đủ hoặc ở chỗ có khí lạ (cồn, nước hoa, khói) | Mang ra chỗ thoáng, chờ ổn định rồi gõ c |
| Số đọc thay đổi theo giờ trong ngày | Rs phụ thuộc nhiệt độ và độ ẩm | Bình thường với cảm biến bán dẫn; dùng ngưỡng rộng, hoặc bù theo cảm biến nhiệt độ, độ ẩm |
| ESP32 khởi động lại khi cắm module | Dây nung tốn khoảng 150 mA, nguồn USB yếu | Dùng cáp và cổng USB tốt, hoặc cấp 5 V riêng (nối chung GND) |
| Điện áp ở D34 quá nhỏ trong không khí sạch | RL trên module nhỏ so với Rs | Vẫn đo được; nếu muốn tăng độ phân giải, thay RL bằng điện trở lớn hơn và sửa R_TAI |
7. Xem thêm
- Đọc ADC trên ESP32 và cầu phân áp.
- Gửi dữ liệu bằng MQTT với ESP32: đưa số đo khí lên máy chủ và bật relay quạt hút khi vượt ngưỡng.
- Các bài khác trong loạt: cảm biến độ ẩm (bù độ ẩm cho cảm biến khí), cảm biến nhiệt độ, cảm biến độ dẫn điện.
Xem thêm