Phần 4: Xây dựng hệ thống IoT hoàn chỉnh
1. Tổng quan về hệ thống - Khái quát cách thức hoạt động tổng thể của hệ thống IoT, 2. Gửi dữ liệu cảm biến - Hướng dẫn cụ thể về cách gửi dữ liệu cảm biến từ ESP32 lên cloud, 3. Nhận lệnh và điều khiển thiết bị - Cách nhận lệnh từ cloud và điều khiển thiết bị từ xa, 4. Thực hành với các cảm biến - Đưa vào ví dụ thực tế với một số loại cảm biến (Nhiệt độ, độ ẩm...), 5. Giải quyết các vấn đề phổ biến - Một số lỗi thường gặp và cách khắc phục.
Tổng quan về hệ thống
Trong phần này, chúng ta sẽ tìm hiểu về hệ thống IoT hoàn chỉnh sử dụng ESP32 để gửi và nhận dữ liệu qua giao thức MQTT với broker Mosquitto. Hệ thống này bao gồm các cảm biến, thiết bị đầu cuối (ESP32) và một cloud server nơi dữ liệu được lưu trữ và xử lý.
Cách thức hoạt động của hệ thống như sau:
- ESP32 kết nối với mạng Wi-Fi và broker Mosquitto.
- Cảm biến thu thập dữ liệu (như nhiệt độ, độ ẩm) và gửi dữ liệu này đến broker.
- Broker Mosquitto nhận dữ liệu và phân phối đến các thiết bị hoặc ứng dụng khác đăng ký nhận thông tin.
- Người dùng có thể gửi lệnh từ ứng dụng hoặc web để điều khiển thiết bị từ xa thông qua broker.
Gửi dữ liệu cảm biến
Để gửi dữ liệu cảm biến từ ESP32 lên cloud, trước tiên bạn cần cài đặt thư viện PubSubClient cho MQTT. Dưới đây là hướng dẫn chi tiết:
Bước 1: Cài đặt thư viện
Mở Arduino IDE, vào menu Sketch -> Include Library -> Manage Libraries.... Tìm kiếm và cài đặt thư viện PubSubClient.
Bước 2: Kết nối ESP32 và cảm biến
Giả sử bạn sử dụng cảm biến DHT11 để đo nhiệt độ và độ ẩm. Kết nối như sau:
- DHT11 VCC -> ESP32 3.3V
- DHT11 GND -> ESP32 GND
- DHT11 DATA -> ESP32 GPIO 4
Bước 3: Code gửi dữ liệu
Dưới đây là mã nguồn mẫu để gửi dữ liệu cảm biến lên broker:
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* mqtt_server = "YOUR_MQTT_BROKER";
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String payload = String("Temperature: ") + t + "°C, Humidity: " + h + "%";
client.publish("sensor/data", payload.c_str());
delay(2000);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
Code trên sẽ kết nối ESP32 với Wi-Fi và gửi dữ liệu nhiệt độ, độ ẩm lên broker Mosquitto mỗi 2 giây.
Nhận lệnh và điều khiển thiết bị
Để nhận lệnh từ cloud và điều khiển thiết bị từ xa, bạn cần đăng ký một topic mà ESP32 sẽ lắng nghe. Ví dụ, bạn có thể sử dụng topic device/control để nhận lệnh bật/tắt một thiết bị.
Bước 1: Đăng ký lắng nghe topic
Thêm đoạn mã sau vào hàm setup() để đăng ký lắng nghe:
client.subscribe("device/control");
Bước 2: Xử lý lệnh trong hàm loop()
Thêm đoạn mã sau vào hàm loop() để xử lý lệnh:
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (message == "ON") {
// Bật thiết bị
} else if (message == "OFF") {
// Tắt thiết bị
}
}
client.setCallback(callback);
Đoạn mã trên sẽ nhận lệnh từ topic device/control và thực hiện hành động tương ứng.
Thực hành với các cảm biến
Chúng ta đã sử dụng cảm biến DHT11 để thu thập dữ liệu nhiệt độ và độ ẩm. Bạn có thể mở rộng hệ thống này với các cảm biến khác như:
- Cảm biến ánh sáng (LDR)
- Cảm biến chuyển động (PIR)
- Cảm biến khí gas
Ví dụ, để sử dụng cảm biến LDR, bạn chỉ cần kết nối chân tín hiệu của cảm biến LDR vào một chân analog của ESP32 và đọc giá trị tương tự như cách đọc cảm biến DHT11.
Giải quyết các vấn đề phổ biến
Dưới đây là một số lỗi thường gặp khi làm việc với ESP32 và MQTT cùng cách khắc phục:
- Lỗi không kết nối được Wi-Fi: Kiểm tra lại tên SSID và mật khẩu, đảm bảo chúng chính xác.
- Lỗi không kết nối được đến broker: Kiểm tra địa chỉ IP của broker, cổng và đảm bảo broker đang hoạt động.
- Dữ liệu gửi không chính xác: Kiểm tra cách đọc dữ liệu từ cảm biến, đảm bảo cảm biến hoạt động bình thường.
Tip: Luôn kiểm tra console log trong Arduino IDE để xác định lỗi và theo dõi hoạt động của ESP32.
Hy vọng rằng hướng dẫn này sẽ giúp bạn xây dựng một hệ thống IoT hoàn chỉnh với ESP32 và cloud MQTT. Chúc bạn thành công!
