💡 Tóm tắt bài học: Bài học này hướng dẫn bạn cách sử dụng giao thức MQTT để ESP32 gửi dữ liệu cảm biến BME280 và nhận lệnh điều khiển từ Node-RED. Đây là nền tảng quan trọng để xây dựng các hệ thống IoT thông minh và tự động hóa nhà thông minh.
📖 1. Lý Thuyết & Kiến Thức Nền Tảng
MQTT (Message Queuing Telemetry Transport) là giao thức truyền tin nhắn nhẹ, hoạt động theo mô hình Publish/Subscribe.

📌 Tổng quan hệ thống MQTT
Trong hệ thống này, ESP32 đóng vai trò là Client, kết nối với MQTT Broker (như Mosquitto trên Raspberry Pi).

📌 Kiến trúc MQTT Broker
Cảm biến BME280 sử dụng giao thức I2C để truyền dữ liệu nhiệt độ và độ ẩm.

📌 Cảm biến BME280

📌 Sơ đồ khối kết nối

📌 Cấu hình Node-RED

📌 Thiết lập Dashboard

📌 Cấu hình MQTT Node

📌 Luồng dữ liệu MQTT

📌 Kiểm tra kết nối

📌 Giao diện điều khiển

📌 Hiển thị dữ liệu

📌 Kết quả thực tế

📌 Tổng kết hệ thống
🔌 2. Sơ Đồ Đấu Dây & Linh Kiện
| Linh kiện | Chân ESP32 | Ghi chú |
|---|
| BME280 SDA | GPIO 21 | Giao tiếp I2C |
| BME280 SCL | GPIO 22 | Giao tiếp I2C |
| LED (+) | GPIO 2 | Chân điều khiển |
| LED (-) | GND | Qua điện trở 220 Ohm |
💻 3. Chương Trình Mã Nguồn C++ Arduino / ESP32
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
// Cấu hình WiFi và MQTT
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* mqtt_server = "192.168.1.X"; // IP của Raspberry Pi
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_BME280 bme;
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
if (!bme.begin(0x76)) Serial.println("Không tìm thấy BME280");
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
// Đọc và publish dữ liệu mỗi 5 giây
float t = bme.readTemperature();
client.publish("esp32/temperature", String(t).c_str());
delay(5000);
}
void callback(char* topic, byte* message, unsigned int length) {
// Xử lý lệnh nhận được từ MQTT
String messageTemp;
for (int i = 0; i < length; i++) messageTemp += (char)message[i];
if (String(topic) == "esp32/output") {
digitalWrite(2, (messageTemp == "on") ? HIGH : LOW);
}
}
📝 4. Giải Thích Thuật Toán & Mã Nguồn C++
1. Libraries: Sử dụng PubSubClient để xử lý giao thức MQTT và Adafruit_BME280 để đọc cảm biến. 2. Setup: Khởi tạo Serial, kết nối WiFi và cấu hình MQTT Broker. Hàm callback được dùng để lắng nghe các thông điệp từ Broker. 3. Loop: Duy trì kết nối MQTT bằng client.loop(), đọc dữ liệu từ cảm biến và gửi lên Broker thông qua client.publish().
🚀 5. Thử Nghiệm Vận Hành & Khắc Phục Lỗi (Troubleshooting)
Sau khi nạp code, mở Serial Monitor ở tốc độ 115200 baud để theo dõi trạng thái kết nối. Nếu ESP32 không kết nối được, hãy kiểm tra địa chỉ IP của MQTT Broker và thông tin WiFi. Bạn có thể kiểm tra dữ liệu bằng cách sử dụng công cụ MQTT Explorer trên máy tính hoặc Dashboard của Node-RED.