Phần 3: Gửi dữ liệu qua MQTT
1. Giới thiệu về giao thức MQTT - nguyên lý hoạt động cơ bản, 2. Cài đặt thư viện MQTT cho ESP32 - hướng dẫn thêm thư viện, 3. Viết mã để kết nối ESP32 với MQTT broker - hướng dẫn chi tiết cách cấu hình và lập trình, 4. Gửi dữ liệu từ DHT22 qua MQTT - viết mã để gửi dữ liệu, 5. Kiểm tra gửi dữ liệu - hướng dẫn cách kiểm tra dữ liệu gửi thành công qua MQTT.
Phần 3: Gửi dữ liệu qua MQTT
1. Giới thiệu về giao thức MQTT
MQTT (Message Queuing Telemetry Transport) là một giao thức truyền thông nhẹ, được thiết kế để kết nối các thiết bị IoT với nhau trong môi trường không ổn định, như mạng di động hoặc mạng không dây. MQTT hoạt động theo mô hình publisher-subscriber, trong đó:
- Publisher: Là thiết bị gửi dữ liệu, trong trường hợp này là ESP32 đọc dữ liệu từ cảm biến DHT22.
- Subscriber: Là thiết bị hoặc ứng dụng nhận dữ liệu, có thể là một dashboard trên web hoặc ứng dụng di động.
- Broker: Là máy chủ trung gian giúp quản lý và chuyển tiếp thông điệp giữa publisher và subscriber.
Nguyên lý hoạt động của MQTT rất đơn giản: khi một thiết bị gửi dữ liệu (publish) đến một chủ đề (topic), broker sẽ phân phối dữ liệu đó đến tất cả các thiết bị đang đăng ký (subscribe) vào chủ đề đó.
2. Cài đặt thư viện MQTT cho ESP32
Để sử dụng giao thức MQTT trên ESP32, chúng ta cần cài đặt thư viện PubSubClient. Dưới đây là các bước để thêm thư viện vào dự án của bạn:
- Mở Arduino IDE.
- Chọn Sketch > Include Library > Manage Libraries...
- Tìm kiếm PubSubClient trong cửa sổ Library Manager.
- Nhấn nút Install để cài đặt thư viện.
Lưu ý: Đảm bảo rằng bạn đã cài đặt thư viện WiFi cho ESP32 trước khi cài đặt thư viện MQTT.
3. Viết mã để kết nối ESP32 với MQTT broker
Để kết nối ESP32 với MQTT broker, bạn cần cấu hình thông tin như địa chỉ IP của broker, cổng và thông tin xác thực (nếu có). Dưới đây là mã mẫu để thực hiện điều này:
#include <WiFi.h>
#include <PubSubClient.h>
// Thông tin WiFi
const char* ssid = "Tên_WiFi_của_bạn";
const char* password = "Mật_khẩu_WiFi_của_bạn";
// Thông tin MQTT
const char* mqtt_server = "broker.hivemq.com"; // Địa chỉ broker
const int mqtt_port = 1883; // Cổng
const char* mqtt_user = ""; // Tên người dùng (nếu có)
const char* mqtt_password = ""; // Mật khẩu (nếu có)
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void setup_wifi() {
delay(10);
Serial.println("Kết nối đến mạng WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Đã kết nối đến mạng WiFi");
}
4. Gửi dữ liệu từ DHT22 qua MQTT
Để gửi dữ liệu từ cảm biến DHT22 qua MQTT, trước tiên bạn cần đọc dữ liệu từ cảm biến và sau đó publish nó lên một chủ đề cụ thể. Dưới đây là mã mẫu cho phần này:
#include <DHT.h>
#define DHTPIN 4 // Chân kết nối cảm biến DHT22
#define DHTTYPE DHT22 // Loại cảm biến
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// Các phần cài đặt trước đó
dht.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float h = dht.readHumidity(); // Đọc độ ẩm
float t = dht.readTemperature(); // Đọc nhiệt độ
// Kiểm tra nếu đọc dữ liệu không thành công
if (isnan(h) || isnan(t)) {
Serial.println("Không thể đọc từ cảm biến DHT!");
return;
}
// Tạo chuỗi dữ liệu để gửi
String payload = "Nhiệt độ: " + String(t) + "°C, Độ ẩm: " + String(h) + "%";
// Gửi dữ liệu qua MQTT
client.publish("esp32/dht22", payload.c_str());
Serial.println("Gửi dữ liệu: " + payload);
delay(2000); // Gửi dữ liệu mỗi 2 giây
}
void reconnect() {
while (!client.connected()) {
Serial.print("Đang kết nối đến MQTT...");
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println("Đã kết nối");
} else {
Serial.print("Lỗi, mã lỗi: ");
Serial.print(client.state());
delay(2000);
}
}
}
5. Kiểm tra gửi dữ liệu
Để kiểm tra xem dữ liệu đã được gửi thành công qua MQTT, bạn có thể sử dụng một số công cụ như MQTT.fx hoặc MQTT Explorer. Dưới đây là các bước để kiểm tra:
- Tải và cài đặt một trong các ứng dụng MQTT client như MQTT.fx hoặc MQTT Explorer.
- Kết nối đến cùng một broker mà ESP32 đang sử dụng (địa chỉ và cổng).
- Đăng ký (subscribe) vào chủ đề mà bạn đã gửi dữ liệu, ví dụ: esp32/dht22.
- Quan sát dữ liệu hiển thị trên ứng dụng khi ESP32 gửi dữ liệu.
Tip: Nếu bạn gặp vấn đề trong việc kết nối, hãy kiểm tra lại thông tin WiFi và MQTT broker. Đảm bảo rằng ESP32 có kết nối internet ổn định.
Với các bước trên, bạn đã hoàn thành việc gửi dữ liệu từ cảm biến DHT22 qua giao thức MQTT. Trong phần tiếp theo, chúng ta sẽ tìm hiểu cách hiển thị dữ liệu trên một dashboard real-time.
