← Quay lại danh sách ESP32 Nâng Cao
Khóa học:
1 Bài 1: Lập Trình ESP32 Giao Tiếp MQTT - Publish và Subscribe 2 Bài 2: Lập Trình Đa Nhân (Dual Core) trên ESP32 với FreeRTOS 🔒 3 Bài 3: Lập Trình Cập Nhật Firmware Qua Không Gian (OTA) cho ESP32 🔒 4 Bài 4: Lập Trình Chế Độ Deep Sleep và Các Nguồn Đánh Thức ESP32 🔒 5 Bài 5: Lập Trình ESP32-CAM Truyền Video Streaming và Nhận Diện Khuôn Mặt 🔒 6 Bài 6: Lập Trình ESP32-CAM Chụp Ảnh và Lưu vào Thẻ MicroSD 🔒 7 Bài 7: Lập Trình Giao Tiếp ESP-NOW trên ESP32 🔒 8 Bài 8: Lập Trình ESP-NOW Giao Tiếp Một-Nhiều (One-to-Many) trên ESP32 🔒 9 Bài 9: Lập Trình Điều Khiển ESP32 Qua Telegram Bot 🔒 10 Bài 10: Lập Trình Cập Nhật Firmware Từ Xa (OTA) cho ESP32 với AsyncElegantOTA 🔒 11 Bài 11: Lập Trình ESP32 Kết Nối Firebase Realtime Database 🔒 12 Bài 12: Lập Trình ESP32 BLE Server và Client (Bluetooth Low Energy) 🔒 13 Bài 13: Lập Trình ESP32 Kết Nối và Lưu Trữ Dữ Liệu với InfluxDB 🔒 14 Bài 14: Lập Trình ESP32 Thực Hiện HTTPS Requests (Arduino IDE) 🔒 15 Bài 15: Lập Trình Giao Diện Đồ Họa LVGL trên ESP32 Cheap Yellow Display (CYD) 🔒 16 Bài 16: Lập Trình Đa Nhiệm ESP32 với FreeRTOS trên Arduino IDE 🔒 17 Bài 17: Lập Trình Giao Tiếp Giữa Các Task ESP32 với FreeRTOS Queues 🔒 18 Bài 18: Lập Trình ESP32 với FreeRTOS - Sử dụng Semaphore 🔒 19 Bài 19: Lập Trình Điều Khiển ESP32 với FreeRTOS Mutex 🔒

Bài 1: Lập Trình ESP32 Giao Tiếp MQTT - Publish và Subscribe

🎯 Độ khó: Dễ ⏱️ Thời lượng: 45 phút 📘 Khóa: ESP32 Nâng Cao
💡 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
📌 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
📌 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
📌 Cảm biến BME280
Sơ đồ khối kết nối
📌 Sơ đồ khối kết nối
Cấu hình Node-RED
📌 Cấu hình Node-RED
Thiết lập Dashboard
📌 Thiết lập Dashboard
Cấu hình MQTT Node
📌 Cấu hình MQTT Node
Luồng dữ liệu MQTT
📌 Luồng dữ liệu MQTT
Kiểm tra kết nối
📌 Kiểm tra kết nối
Giao diện điều khiển
📌 Giao diện điều khiển
Hiển thị dữ liệu
📌 Hiển thị dữ liệu
Kết quả thực tế
📌 Kết quả thực tế
Tổng kết hệ thống
📌 Tổng kết hệ thống
🔌 2. Sơ Đồ Đấu Dây & Linh Kiện
Linh kiệnChân ESP32Ghi chú
BME280 SDAGPIO 21Giao tiếp I2C
BME280 SCLGPIO 22Giao tiếp I2C
LED (+)GPIO 2Chân điều khiển
LED (-)GNDQua điện trở 220 Ohm
💻 3. Chương Trình Mã Nguồn C++ Arduino / ESP32
⚡ Arduino C++ (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.