Trong bài này, chúng ta sử dụng Flame Sensor (cảm biến lửa) để phát hiện ngọn lửa hoặc nguồn sáng hồng ngoại mạnh. Đây là cảm biến rất phổ biến trong DIY/maker, thường dùng cho:
- Cảnh báo cháy sớm
- Phát hiện lửa / tia lửa
- Demo hệ thống an toàn – báo động
- Kết hợp còi, relay, cloud cảnh báo
Bài viết gồm 2 ví dụ code:
- Đọc cảm biến lửa local (Serial)
- Gửi trạng thái phát hiện lửa lên IoTLabs Cloud MQTT để theo dõi realtime
1) Flame Sensor là gì?
- Flame Sensor phát hiện tia hồng ngoại (IR) phát ra từ ngọn lửa
- Thường dùng diode IR nhạy bước sóng ~760–1100nm
- Module phổ biến có:
- DO (Digital Output) → có/không có lửa
- AO (Analog Output) → cường độ (tuỳ module)
📌 Trong Level 1, ta chỉ dùng DO (digital) cho đơn giản & ổn định.
2) Chuẩn bị
Phần cứng
- ESP32-C3 SuperMini (Tenstar Robot)
- Flame Sensor module (KY-026 / tương đương)
- Breadboard + dây
Chân sử dụng
- DO → GPIO4
- VCC → 5V
- GND → GND
⚠️ Khuyến nghị cấp 5V để module hoạt động ổn định
DO vẫn an toàn cho ESP32 (3.3V logic)
3) Nối dây Flame Sensor với ESP32
Flame Sensor ESP32-C3 SuperMini
------------------------------------
VCC ------------ 5V
GND ------------ GND
DO ------------ GPIO4
Chỉnh độ nhạy
- Dùng biến trở trên module
- Điều chỉnh sao cho:
- Không có lửa → DO = HIGH
- Có lửa gần → DO = LOW
4) Logic đọc & lưu ý quan trọng
| Trạng thái | GPIO |
|---|---|
| Không có lửa | HIGH |
| Phát hiện lửa | LOW |
📌 Lưu ý thực tế:
- Ánh sáng mặt trời mạnh có thể gây nhiễu
- Không dùng làm thiết bị PCCC chuyên nghiệp
- Phù hợp demo – học tập – cảnh báo sớm
Ví dụ 1 — Code local đơn giản (phát hiện lửa)
Mục tiêu: in trạng thái Có lửa / Không có lửa ra Serial.
// ===== Flame Sensor Local Read =====
const int FLAME_PIN = 4;
int lastState = HIGH;
void setup() {
Serial.begin(115200);
delay(200);
pinMode(FLAME_PIN, INPUT);
Serial.println("Flame sensor monitor started...");
}
void loop() {
int state = digitalRead(FLAME_PIN);
if (state != lastState) {
if (state == LOW) {
Serial.println("🔥 PHÁT HIỆN NGỌN LỬA!");
} else {
Serial.println("🟢 Không có lửa");
}
lastState = state;
}
delay(50);
}
5) Chuẩn dữ liệu realtime cho IoTLabs Cloud
Topic
iotlabs/<orgId>/devices/<deviceId>/telemetry
Payload JSON
{
"ts": 1760000000,
"metrics": {
"flame": 1
},
"status": {
"flame": "detected"
}
}
| flame | Ý nghĩa |
|---|---|
| 0 | không có lửa |
| 1 | phát hiện lửa |
Ví dụ 2 — Gửi trạng thái phát hiện lửa lên IoTLabs Cloud MQTT
Chiến lược:
- Chỉ gửi khi trạng thái thay đổi
- Tránh spam & cảnh báo giả
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
// ===== CONFIG =====
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";
// ===== FLAME =====
const int FLAME_PIN = 4;
int lastState = HIGH;
WiFiClientSecure net;
PubSubClient mqtt(net);
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(400);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void connectMQTT() {
net.setInsecure(); // demo nhanh
mqtt.setServer(MQTT_HOST, MQTT_PORT);
while (!mqtt.connected()) {
if (mqtt.connect("esp32c3-flame", MQTT_USER, MQTT_PASS)) {
Serial.println("MQTT connected");
break;
}
delay(1000);
}
}
void setup() {
Serial.begin(115200);
pinMode(FLAME_PIN, INPUT);
connectWiFi();
connectMQTT();
}
void loop() {
if (!mqtt.connected()) connectMQTT();
mqtt.loop();
int state = digitalRead(FLAME_PIN);
if (state != lastState) {
lastState = state;
long ts = millis() / 1000;
String payload = "{";
payload += "\"ts\":" + String(ts) + ",";
payload += "\"metrics\":{\"flame\":" + String(state == LOW ? 1 : 0) + "},";
payload += "\"status\":{\"flame\":\"";
payload += (state == LOW ? "detected" : "none");
payload += "\"}}";
mqtt.publish(MQTT_TOPIC, payload.c_str());
Serial.println(payload);
}
delay(50);
}
6) Lỗi thường gặp & kinh nghiệm
- Báo lửa giả
- Giảm độ nhạy bằng biến trở
- Tránh ánh nắng trực tiếp
- Phát hiện chậm
- Đưa cảm biến gần nguồn lửa hơn
- Spam MQTT
- Luôn kiểm tra state change
7) Ứng dụng thực tế
- Cảnh báo cháy sớm (DIY)
- Kết hợp còi / relay
- Kết hợp nhiệt độ (Level 2)
- Gửi Telegram / App notification (Level 3)


