AI Hunter
Member
Hôm nay chúng ta sẽ cắt dây rốn (cáp USB) để con chip tự do bay nhảy trên mạng Wifi.
Nhiệm vụ:
1. ESP32 kết nối vào Wifi nhà bạn.
2. ESP32 kết nối vào MQTT Broker (đang chạy trên máy tính của bạn).
3. Khi Server gửi lệnh "ON", ESP32 phải nhận được ngay lập tức.
Đây là lỗi phổ biến nhất của người mới (Newbie Trap).
Trên máy tính, bạn truy cập MQTT bằng
Nó cần địa chỉ IP LAN của máy tính.
Để giao tiếp MQTT, chúng ta cần thư viện
Mở file
(Sau khi lưu file, PlatformIO sẽ tự động tải thư viện về).
Copy toàn bộ đoạn code sau vào
LƯU Ý: Hãy sửa lại 3 dòng đầu tiên (Wifi và IP Broker) cho đúng với nhà bạn.
Bây giờ hãy thử làm "Jarvis" điều khiển nó.
Bạn có thể dùng phần mềm **MQTT Explorer** (đã cài ở Season 2) hoặc dùng lệnh Terminal trên máy tính:
Gửi lệnh Bật:
Mở terminal máy tính (nơi chạy Docker), gõ: (Nếu không có `mosquitto_pub` thì dùng MQTT Explorer publish vào topic `home/livingroom/light` với nội dung `ON`)
Ngay lập tức:
Gửi lệnh Tắt:
Gửi nội dung `OFF` vào topic `home/livingroom/light`.
=> Đèn LED tắt.
Bạn vừa thiết lập xong "hệ thần kinh" cho Jarvis.
Từ giờ, Server (hoặc App Mobile) chỉ cần gửi tin nhắn vào MQTT, con chip ESP32 sẽ nhận được ngay lập tức dù ở bất cứ đâu trong nhà.
Nhưng... điều khiển cái đèn LED bé tí trên mạch thì làm được gì? Chẳng lẽ dùng để soi lỗ kiến?
Chúng ta cần điều khiển thiết bị điện 220V thật sự: Đèn tuýp, Quạt máy.
Để làm được điều đó an toàn (không bị điện giật chết), chúng ta cần một linh kiện trung gian: **Relay**.
Nhiệm vụ:
1. ESP32 kết nối vào Wifi nhà bạn.
2. ESP32 kết nối vào MQTT Broker (đang chạy trên máy tính của bạn).
3. Khi Server gửi lệnh "ON", ESP32 phải nhận được ngay lập tức.
1. Tìm địa chỉ IP máy chủ MQTT
Đây là lỗi phổ biến nhất của người mới (Newbie Trap).
Trên máy tính, bạn truy cập MQTT bằng
localhost. Nhưng ESP32 là một thiết bị riêng biệt, nó không hiểu localhost là máy tính của bạn.Nó cần địa chỉ IP LAN của máy tính.
- Windows: Mở CMD, gõ
ipconfig. Tìm dòng IPv4 Address (Ví dụ:192.168.1.5). - Mac/Linux: Mở Terminal, gõ
ifconfighoặcip a.
2. Cài đặt thư viện PubSubClient
Để giao tiếp MQTT, chúng ta cần thư viện
PubSubClient nổi tiếng.Mở file
platformio.ini trong dự án của bạn và thêm dòng lib_deps vào cuối:
INI:
[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
monitor_speed = 115200 ; Chỉnh tốc độ log cho khớp
lib_deps =
knolleary/PubSubClient @ ^2.8
3. Viết Code (src/main.cpp)
Copy toàn bộ đoạn code sau vào
src/main.cpp.LƯU Ý: Hãy sửa lại 3 dòng đầu tiên (Wifi và IP Broker) cho đúng với nhà bạn.
C++:
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
// --- CẤU HÌNH (SỬA LẠI CHO ĐÚNG) ---
const char* ssid = "TEN_WIFI_NHA_BAN"; // Tên Wifi
const char* password = "MAT_KHAU_WIFI"; // Mật khẩu Wifi
const char* mqtt_server = "192.168.1.X"; // IP máy tính chạy Docker MQTT (Xem bước 1)
const int mqtt_port = 1883; // Cổng mặc định
// --- KHAI BÁO ĐỐI TƯỢNG ---
WiFiClient espClient;
PubSubClient client(espClient);
#define LED_PIN 2 // Đèn LED có sẵn trên mạch
// --- HÀM KẾT NỐI WIFI ---
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Dang ket noi Wifi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Da ket noi WiFi!");
Serial.print("Dia chi IP cua ESP32: ");
Serial.println(WiFi.localIP());
}
// --- HÀM XỬ LÝ KHI NHẬN ĐƯỢC TIN NHẮN MQTT ---
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Nhan tin nhan tu topic [");
Serial.print(topic);
Serial.print("]: ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
// Xử lý lệnh
if (String(topic) == "home/livingroom/light") {
if (message == "ON") {
digitalWrite(LED_PIN, HIGH); // Bật đèn
Serial.println("=> DA BAT DEN");
}
else if (message == "OFF") {
digitalWrite(LED_PIN, LOW); // Tắt đèn
Serial.println("=> DA TAT DEN");
}
}
}
// --- HÀM KẾT NỐI LẠI MQTT NẾU MẤT MẠNG ---
void reconnect() {
while (!client.connected()) {
Serial.print("Dang ket noi MQTT Broker...");
// Tạo ID ngẫu nhiên để không bị trùng
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// Thử kết nối
if (client.connect(clientId.c_str())) {
Serial.println("Thanh cong!");
// Đăng ký nhận tin từ topic điều khiển đèn
client.subscribe("home/livingroom/light");
} else {
Serial.print("That bai, rc=");
Serial.print(client.state());
Serial.println(" thu lai sau 5 giay");
delay(5000);
}
}
}
// --- SETUP ---
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback); // Đăng ký hàm xử lý tin nhắn
}
// --- LOOP ---
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop(); // Giữ kết nối luôn sống
}
4. Nạp code & Kiểm tra (Serial Monitor)
- Bấm nút Upload (→).
- Sau khi nạp xong, bấm nút Serial Monitor (
). - Nếu thấy dòng chữ:
=> Chúc mừng! ESP32 đã online.Mã:Da ket noi WiFi! Dia chi IP cua ESP32: 192.168.1.xxx Dang ket noi MQTT Broker...Thanh cong!
*Nếu báo "That bai, rc=-2" nghĩa là sai địa chỉ IP máy tính hoặc tường lửa chặn. Hãy tắt tạm tường lửa Windows.*
5. Test điều khiển từ xa
Bây giờ hãy thử làm "Jarvis" điều khiển nó.
Bạn có thể dùng phần mềm **MQTT Explorer** (đã cài ở Season 2) hoặc dùng lệnh Terminal trên máy tính:
Gửi lệnh Bật:
Mở terminal máy tính (nơi chạy Docker), gõ: (Nếu không có `mosquitto_pub` thì dùng MQTT Explorer publish vào topic `home/livingroom/light` với nội dung `ON`)
Ngay lập tức:
- Trên màn hình Serial Monitor của ESP32 hiện: "Nhan tin nhan...: ON => DA BAT DEN".
- Đèn LED xanh trên mạch ESP32 sẽ SÁNG lên.
Gửi lệnh Tắt:
Gửi nội dung `OFF` vào topic `home/livingroom/light`.
=> Đèn LED tắt.
Tổng kết
Bạn vừa thiết lập xong "hệ thần kinh" cho Jarvis.
Từ giờ, Server (hoặc App Mobile) chỉ cần gửi tin nhắn vào MQTT, con chip ESP32 sẽ nhận được ngay lập tức dù ở bất cứ đâu trong nhà.
Nhưng... điều khiển cái đèn LED bé tí trên mạch thì làm được gì? Chẳng lẽ dùng để soi lỗ kiến?
Chúng ta cần điều khiển thiết bị điện 220V thật sự: Đèn tuýp, Quạt máy.
Để làm được điều đó an toàn (không bị điện giật chết), chúng ta cần một linh kiện trung gian: **Relay**.
Bài viết liên quan