Hướng dẫn điều khiển relay bằng điện thoại qua Bluetooth với ESP32
Hướng dẫn dùng Bluetooth Classic của ESP32 trên Arduino IDE: ghép đôi với điện thoại Android, gửi nhận chữ bằng BluetoothSerial và điều khiển module relay bằng lệnh ON, OFF.
ESP32 có sẵn Bluetooth trong chip, nên chỉ cần thêm một module relay là có thể bật tắt thiết bị bằng điện thoại ở cự ly gần mà không cần mạng Wi-Fi hay Internet. Bài viết hướng dẫn dùng Bluetooth Classic của ESP32 trên Arduino IDE: ghép đôi với điện thoại Android, gửi nhận chữ như một Serial Monitor không dây, rồi điều khiển relay bằng các lệnh ON, OFF.
1. Bluetooth trên ESP32
Chip ESP32 hỗ trợ hai kiểu Bluetooth:
- Bluetooth Classic: kiểu kết nối quen thuộc của loa, tai nghe và các module HC-05, HC-06. Trên ESP32, thư viện
BluetoothSerialdùng kiểu này để tạo một cổng nối tiếp không dây: gửi gì bên này, bên kia nhận được y như vậy. - Bluetooth Low Energy (BLE): tiết kiệm điện, dùng cho cảm biến và thiết bị đeo. Cách lập trình khác hẳn và không thuộc phạm vi bài này.
Hai điều cần biết trước khi bắt đầu:
- Bluetooth Classic chỉ có trên dòng chip ESP32 gốc, như module ESP32-WROOM-32 trên mạch DevKit V1. Các dòng ESP32-C3, ESP32-S3 chỉ có BLE nên không chạy được chương trình trong bài.
- Phía điều khiển nên dùng điện thoại Android hoặc máy tính Windows. iPhone không cho ứng dụng thông thường dùng kiểu kết nối nối tiếp của Bluetooth Classic.
2. Linh kiện cần chuẩn bị
- ESP32 DevKit V1 30 chân (hoặc bản dùng chip CH340) và cáp USB có truyền dữ liệu.
- Module relay bản 5 V (dùng từ mục 5) và dây cắm test board.
- Điện thoại Android có cài một ứng dụng kiểu Bluetooth terminal (tìm cụm từ này trong kho ứng dụng; chọn ứng dụng hỗ trợ Bluetooth Classic).
- Máy tính đã cài Arduino IDE 2.x và gói esp32 by Espressif Systems (bài dùng phiên bản 3.3.10). Thư viện
BluetoothSerialcó sẵn trong gói này.
3. Chương trình 1: gửi nhận chữ giữa máy tính và điện thoại
Chương trình đầu tiên chưa cần relay. ESP32 làm cầu nối: chữ gõ ở Serial Monitor hiện trên điện thoại và ngược lại.
/*
PYWORLD.VN - ESP32 Bluetooth Classic: gửi và nhận chữ giữa Serial Monitor và điện thoại
Chỉ cần mạch ESP32 DevKit V1 (chip ESP32 có Bluetooth Classic)
Thư viện BluetoothSerial có sẵn trong gói esp32, không cần cài thêm
*/
#include <BluetoothSerial.h>
const char *TEN_BLUETOOTH = "ESP32-PYWORLD"; // Tên hiện ra khi điện thoại dò tìm thiết bị
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
delay(500);
if (!SerialBT.begin(TEN_BLUETOOTH)) {
Serial.println("Khong khoi dong duoc Bluetooth!");
while (true) delay(1000);
}
Serial.printf("Bluetooth da san sang. Tim thiet bi ten %s tren dien thoai.\n", TEN_BLUETOOTH);
}
void loop() {
// Chữ gõ ở Serial Monitor được gửi sang điện thoại
if (Serial.available()) {
SerialBT.write(Serial.read());
}
// Chữ điện thoại gửi tới được in ra Serial Monitor
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(5);
}
Chọn board DOIT ESP32 DEVKIT V1, nạp chương trình rồi mở Serial Monitor ở 115200 baud. Khi thấy dòng Bluetooth da san sang, làm tiếp mục 4.
4. Ghép đôi và kết nối từ điện thoại
- Trên điện thoại, mở Cài đặt > Bluetooth, bật Bluetooth và dò tìm thiết bị mới.
- Chọn thiết bị tên ESP32-PYWORLD rồi xác nhận ghép đôi.
- Mở ứng dụng Bluetooth terminal, vào danh sách thiết bị, chọn ESP32-PYWORLD và bấm kết nối.
- Gõ vài chữ trên điện thoại rồi gửi: chữ hiện ra ở Serial Monitor. Gõ ở Serial Monitor rồi nhấn Enter: chữ hiện trên điện thoại.
Muốn thử bằng máy tính Windows thay cho điện thoại: ghép đôi với ESP32-PYWORLD trong phần cài đặt Bluetooth, Windows sẽ tạo thêm cổng COM cho kết nối Bluetooth. Mở cổng COM đó bằng một cửa sổ Serial Monitor khác là gửi nhận được.
Đổi tên thiết bị bằng cách sửa hằng TEN_BLUETOOTH. Nếu trong phòng có nhiều mạch cùng chạy, mỗi mạch nên có một tên riêng.
5. Sơ đồ nối module relay
| Module relay | ESP32 DevKit V1 | Ghi chú |
|---|---|---|
| VCC | VIN | 5 V từ cổng USB. |
| GND | GND | Mass chung. |
| IN1 (hoặc IN ở module 1 kênh) | D18 / GPIO18 | Tín hiệu điều khiển kênh 1. |
Chưa nối tải vào cọc vít ở bước này: tiếng tách của relay và LED của kênh đủ để kiểm tra. Cách đấu tải, ý nghĩa các cọc COM, NO, NC và lưu ý an toàn điện có trong bài ESP32 điều khiển module relay 4 kênh.
6. Chương trình 2: điều khiển relay bằng lệnh ON, OFF
ESP32 đọc từng dòng chữ điện thoại gửi tới. Gặp ON thì đóng relay, OFF thì nhả, dấu ? thì báo trạng thái hiện tại. Module relay trong bài kích ở mức thấp; nếu module của bạn kích mức cao, đổi RELAY_ACTIVE_LOW thành false.
/*
PYWORLD.VN - ESP32 điều khiển relay bằng lệnh gửi qua Bluetooth Classic
Module relay bản 5 V: VCC = VIN, GND = GND, IN1 = GPIO18
Lệnh: ON, OFF hoặc ? (hỏi trạng thái), mỗi lệnh kết thúc bằng ký tự xuống dòng
Thư viện BluetoothSerial có sẵn trong gói esp32, không cần cài thêm
*/
#include <BluetoothSerial.h>
#define RELAY_PIN 18
// true: module kích mức thấp (IN = LOW thì relay đóng)
// false: module kích mức cao (IN = HIGH thì relay đóng)
const bool RELAY_ACTIVE_LOW = true;
const char *TEN_BLUETOOTH = "ESP32-PYWORLD";
BluetoothSerial SerialBT;
bool relayDangBat = false;
String lenh;
void datRelay(bool bat) {
bool muc = RELAY_ACTIVE_LOW ? !bat : bat;
digitalWrite(RELAY_PIN, muc ? HIGH : LOW);
relayDangBat = bat;
}
void xuLyLenh(String s) {
s.trim();
s.toUpperCase(); // Nhận cả on, On, ON
if (s.length() == 0) {
return;
}
if (s == "ON") {
datRelay(true);
SerialBT.println("OK: relay BAT");
} else if (s == "OFF") {
datRelay(false);
SerialBT.println("OK: relay TAT");
} else if (s == "?") {
SerialBT.printf("Relay dang %s\n", relayDangBat ? "BAT" : "TAT");
} else {
SerialBT.println("Lenh khong hop le. Dung ON, OFF hoac ?");
}
Serial.printf("Nhan lenh: %s -> relay dang %s\n", s.c_str(), relayDangBat ? "BAT" : "TAT");
}
void setup() {
// Giữ relay tắt khi khởi động: ghi sẵn mức tắt rồi mới bật ngõ ra
pinMode(RELAY_PIN, INPUT);
datRelay(false);
pinMode(RELAY_PIN, OUTPUT);
Serial.begin(115200);
delay(500);
if (!SerialBT.begin(TEN_BLUETOOTH)) {
Serial.println("Khong khoi dong duoc Bluetooth!");
while (true) delay(1000);
}
Serial.printf("Bluetooth da san sang. Tim thiet bi ten %s tren dien thoai.\n", TEN_BLUETOOTH);
}
void loop() {
// Gom từng ký tự nhận được thành một dòng lệnh
while (SerialBT.available()) {
char kyTu = SerialBT.read();
if (kyTu == '\n') {
xuLyLenh(lenh);
lenh = "";
} else if (kyTu != '\r' && lenh.length() < 32) {
lenh += kyTu;
}
}
delay(10);
}
Trong ứng dụng Bluetooth terminal, bật tùy chọn gửi kèm ký tự xuống dòng ở cuối mỗi lệnh, rồi gửi lần lượt ON, ? và OFF:
Cùng lúc đó Serial Monitor trên máy tính ghi lại từng lệnh nhận được:
Nhiều ứng dụng Bluetooth terminal cho gán sẵn lệnh vào nút bấm. Gán ON và OFF vào hai nút là có ngay một bảng điều khiển đơn giản.
7. Giải thích các lệnh chính
BluetoothSerial SerialBT: khai báo cổng nối tiếp Bluetooth. Các lệnhavailable(),read(),write(),println(),printf()dùng giống hệtSerial.SerialBT.begin(TEN_BLUETOOTH): bật Bluetooth với tên thiết bị đã chọn. Hàm trả vềfalsenếu không khởi động được.- Vòng
while (SerialBT.available())gom từng ký tự vào biếnlenhcho đến khi gặp ký tự xuống dòng'\n', lúc đó mới xử lý cả dòng. Ký tự'\r'được bỏ qua để nhận được cả hai kiểu kết thúc dòng. s.trim()vàs.toUpperCase(): bỏ khoảng trắng thừa và đổi sang chữ hoa, nhờ đóon,On,ONđều được chấp nhận.- Ba dòng đầu của
setup()ghi sẵn mức tắt rồi mới bật ngõ ra, để relay không bị đóng thoáng qua lúc ESP32 khởi động.
8. Lưu ý khi dùng thực tế
- Tầm xa: khoảng 10 m trong nhà, giảm nhanh khi có tường hoặc vật kim loại che ăng-ten.
- Bảo mật: ở cấu hình mặc định, ai ở gần cũng có thể ghép đôi và gửi lệnh. Không dùng nguyên chương trình này cho cửa, khóa hay thiết bị cần an toàn.
- Mất kết nối: relay giữ nguyên trạng thái cuối cùng khi điện thoại ra khỏi tầm. Nếu cần tự tắt khi mất kết nối, kiểm tra
SerialBT.hasClient()trongloop(). - Bộ nhớ chương trình: thư viện Bluetooth chiếm khá nhiều bộ nhớ flash. Khi dùng chung Bluetooth với Wi-Fi mà Arduino IDE báo chương trình quá lớn, chọn board ESP32 Dev Module rồi đổi Tools > Partition Scheme sang Huge APP.
- Điều khiển từ xa qua mạng: Bluetooth chỉ dùng ở cự ly gần. Muốn điều khiển qua Wi-Fi, xem bài ESP32 làm web server điều khiển relay qua Wi-Fi.
9. Xử lý lỗi thường gặp
- Lỗi biên dịch nói chip không hỗ trợ Bluetooth Classic: đang chọn board dùng chip ESP32-C3, ESP32-S3 hoặc tương tự. Chọn lại DOIT ESP32 DEVKIT V1 và dùng mạch có module ESP32-WROOM-32.
- Điện thoại không tìm thấy ESP32-PYWORLD: kiểm tra Serial Monitor đã hiện dòng Bluetooth da san sang chưa; đưa điện thoại lại gần; tắt rồi bật lại Bluetooth của điện thoại. Lưu ý phải dò ở mục Bluetooth của hệ thống, ứng dụng chỉ dành cho BLE sẽ không thấy thiết bị.
- Ghép đôi được nhưng ứng dụng không kết nối được: ứng dụng chỉ hỗ trợ BLE, hoặc đang có thiết bị khác kết nối với ESP32. Mỗi lúc chỉ một thiết bị kết nối được.
- Gửi ON mà không có phản hồi: ứng dụng chưa gửi kèm ký tự xuống dòng nên ESP32 vẫn chờ hết dòng. Bật tùy chọn kết thúc dòng LF hoặc CR+LF.
- Gửi ON thì relay nhả, gửi OFF thì relay đóng: module kích mức cao; đổi
RELAY_ACTIVE_LOWthànhfalse. - ESP32 tự khởi động lại khi bật Bluetooth hoặc khi relay đóng: nguồn yếu. Dùng cáp USB tốt, cổng USB cấp đủ dòng, hoặc cấp nguồn 5 V riêng cho module relay và nối chung GND.
- Không nạp được chương trình: dùng cáp USB có truyền dữ liệu, chọn đúng cổng COM và giữ nút BOOT khi IDE dừng ở dòng Connecting...
Xem thêm: ESP32 điều khiển module relay 4 kênh, ESP32 làm web server điều khiển relay qua Wi-Fi và mạch hạ áp LM2596 và MP1584 để cấp nguồn cho ESP32.
Xem thêm