Hướng dẫn làm việc với ESP32 Bluetooth chi tiết A – Z
ESP32 có hỗ trợ kết nối Bluetooth lẫn WiFi, rất phù hợp để chúng ta xây dựng các dự án như IoT. Trong bài này, cùng tìm hiểu ESP32 Bluetooth với IoTZone nhé! Mình sẽ hướng dẫn bạn cách kết nối điện thoại với ESP32 qua Bluetooth, và làm một dự án nhỏ: Điều khiển bật tắt LED qua Bluetooth.
Trên ESP32 thì hỗ trợ cả Bluetooth Classic lẫn Bluetooth Low Energry (BLE – loại Bluetooth ít tiêu tốn năng lượng). Bluetooth Classic sẽ có hiệu suất cao hơn BLE.
Trong bài này, mình sẽ chủ yếu tập trung vào Bluetooth Classic nhé!
Sơ lược về ESP32 Bluetooth Classic
ESP32 tích hợp sẵn khả năng kết nối Bluetooth, chúng ta không cần phải sử dụng thêm module bên ngoài nào khác. Qua đó, mang lại hiệu suất cao nhưng vẫn tối ưu chi phí cho chúng ta.
Bluetooth trên ESP32 hoạt động ở mức băng tần 2,4GHz, hoạt đọng với cấu trúc liên kế mạng point-to-point để liên lạc không dây giữa Master và Slave. Mặc dù có thể có nhiều thiết bị Slave khác nhau kết nối với 1 Master, nhưng chỉ có duy nhất 1 thiết bị Slave có thể kết nối với Master.
Một ví dụ về Bluetooth Classic là bàn phím và chuột Bluetooth, còn vi dụ về kết nối để truyền tập tin giữa 2 thiết bị là 2 điện thoại gửi dữ liệu cho nhau.
Trong hướng dẫn này, mình sẽ tập trung vào hướng dẫn ESP32 Bluetooth Classic, còn phần BLE tiết kiệm năng lượng thì mình sẽ hướng dẫn ở một bài khác nhé!
Giao tiếp nối tiếp trên ESP32 Bluetooth Classic
Nếu đã từng làm việc trên Arduino và các module Bluetooth khác thì bạn sẽ thấy, Arduino kết nối với các module đó thông qua giao tiếp nối tiếp (Serial). Trên ESP32 đã có sẵn Bluetooth Controller, chúng cũng có khả năng giao tiếp khá giống với bộ xử lý Xtensa.
Điều này đồng nghĩa với việc khi nhận dữ liệu qua Bluetooth, thì bộ Bluetooth Controller sẽ gửi dữ liệu đến chip xử lý trong ESP32 thông qua giao tiếp nối tiếp.
Chúng ta sẽ sử dụng thư viện BluetoothSerial để ESP32 có thể truyền và nhận dữ liệu. Thư viện này có cách hoạt động tương tự như thư viện Serial, nhưng chúng chỉ hỗ trợ trong ESP32 và có một số hàm sau:
- begin()
- available()
- write()
- read()
Dưới đây, mình sẽ viết một đoạn code đơn giản để bạn hiểu hơn nhé! MÌnh sẽ truyền dữ liệu giữa ESP32 và điện thoại.
Tuy nhiên, với điện thoại thì bạn cần tải một ứng dụng đặc biệt để hỗ trợ việc kết nối này. Bạn có thể sử dụng serial terminal app nhé! App này bạn có thể tải trên CH Play:
Dự án ESP32 Bluetooth đơn giản – Kết nối với điện thoại
Nạp code
Bạn nạp chương trình sau vào ESP32 nhé:
#include "BluetoothSerial.h" /* Check if Bluetooth configurations are enabled in the SDK */ /* If not, then you have to recompile the SDK */ #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif BluetoothSerial SerialBT; void setup() { Serial.begin(115200); /* If no name is given, default 'ESP32' is applied */ /* If you want to give your own name to ESP32 Bluetooth device, then */ /* specify the name as an argument SerialBT.begin("myESP32Bluetooth"); */ SerialBT.begin(); Serial.println("Bluetooth Started! Ready to pair..."); } void loop() { if (Serial.available()) { SerialBT.write(Serial.read()); } if (SerialBT.available()) { Serial.write(SerialBT.read()); } delay(20); }
Dưới đây, mình sẽ giải thích chi tiết về chương trình ESP32 Bluetooth trên:
Tạo đối tượng BluetoothSerial:
#include "BluetoothSerial.h"
/* Check if Bluetooth configurations are enabled in the SDK */
/* If not, then you have to recompile the SDK */
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
BluetoothSerial SerialBT;
Sau đó, dùng tên của thiết bị ESP32 Bluetooth làm đối số trong hà begin(). Nếu chúng ta để dòng này trống thì chúng sẽ lấy tên mặc định là ESP32. Khởi tạo giao tiếp kết nối Serial ở tốc độ 115200:
void setup() {
Serial.begin(115200);
/* If no name is given, default 'ESP32' is applied */
/* If you want to give your own name to ESP32 Bluetooth device, then */
/* specify the name as an argument SerialBT.begin("myESP32Bluetooth"); */
SerialBT.begin();
Serial.println("Bluetooth Started! Ready to pair...");
}
Trong vòng lặp, cho hệ thống đọc dữ liệu từ BluetoothSerial và in ra màn hình Serial Monitor, đồng thời đọc dữ liệu từ Serial Monitor để ghi vào trong BluetoothSeria;”
void loop() {
if (Serial.available())
{
SerialBT.write(Serial.read());
}
if (SerialBT.available())
{
Serial.write(SerialBT.read());
}
delay(20);
}
Cụ thể là khi chúng ta nhập data vào trong BluetoothSerial, ứng dụng trên điện thoại sẽ nhận dữ liệu và in dữ liệu đó ra trên ứng dụng.
Ngược lại, khi chúng ta nhập dữ liệu trên ứng dụng điện thoại và gửi qua Bluetooth, thì BluetoothSerial sẽ nhận được giá trị này và in ra trên màn hình Serial Monitor.
Hơi khó hiểu phải không, vậy thì bạn hãy xem demo bên dưới để dễ hình dung hơn nhé:
Upload code và xem demo
Bạn hãy nạp code trên vào mạch ESP32, sau đó mở Serial Monitor ở tốc độ 115200. Trên màn hình Serial Monitor lúc nãy sẽ hiển thị thông tin về bluetooth, kèm theo thông báo sẵn sàng kết nối: “Bluetooth Started! Ready to pair…”
Bây giờ, bạn hãy mở điện thoại (đã tải app serial terminal app trước đó nhé!) và quét tìm các thiết bị Bluetooth xung quanh. Khi thấy ESP32, bạn chọn vào ghép nối nó:
Sau khi ghép nối, bạn hãy mở app Serial Bluetooth Terminal, mở icon 3 dấu gạch ngang và chọn mục Devices >> Chọn ESP32:
Click vào biểu tượng kết nối trên cùng để kết nối Bluetooth với ESP32, khi đang kết nối và kết nối thành công thì app sẽ báo trạng thái như hình:
Ở hàng dưới cùng trên điện thoại là nơi để chúng ta nhập dữ liệu và truyền đến ESP32 qua Bluetooth. Bạn có thể nhập một dữ liệu nào đó bất kỳ và nhấn gửi, lúc đó trên màn hình Serial Monitor sẽ in ra giá trị này (thông qua việc đọc thông tin từ hàm BluetoothSerial read()):
Tương tự, chúng ta có thể gửi dữ liệu từ mạch ESP32 đến điện thoại, bằng cách nhập một data bất kỳ vào Serial Monitor và nhấn vào gửi. Các data sẽ được gửi đi thông qua hàm BluetoothSerial write().
Dự án nâng cao – Điều khiển LED trên ESP32 qua Bluetooth
Từ dự án trên, chúng ta có thể nâng cấp thành một dự án điều khiển đèn LED ESP32 Bluetooth, thông qua điện thoại. Bạn sẽ làm quen với các chân GPIO trên ESP32 và tìm hiểu cách gửi, nhận tín hiệu trên các chân này.
Để đơn giản thì chúng ta sẽ sử dụng dữ liệu là 1 và 0 nhé:
- 1 là cho giá trị M1 – Đèn bật
- 0 cho M2 – Đèn tắt
Thực tế, đèn LED bật hay tắt đồng nghĩa với việc chân GPIO đang bật hay tắt mà thôi. Bạn có thể cải tiến dự án này thành dự án điều khiển Relay, điều khiển quạt mini,.. tùy thích phụ thuộc vào nhu cầu của bạn.
Nạp code
#include <BluetoothSerial.h> #define ledPIN 2 BluetoothSerial SerialBT; byte BTData; /* Check if Bluetooth configurations are enabled in the SDK */ #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif void setup() { pinMode(ledPIN, OUTPUT); Serial.begin(115200); SerialBT.begin(); Serial.println("Bluetooth Started! Ready to pair..."); } void loop() { if(SerialBT.available()) { BTData = SerialBT.read(); Serial.write(BTData); } /* If received Character is 1, then turn ON the LED */ /* 48 for 0 and 49 for 1 */ /* if(BTData == 48) or if(BTData == 49) */ if(BTData == '1') { digitalWrite(ledPIN, HIGH); } /* If received Character is 0, then turn OFF the LED */ if(BTData == '0') { digitalWrite(ledPIN, LOW); } }
Bạn hãy thử nạp code trên và gửi dữ liệu từ điện thoại để xem kết quả nhé!
Lời kết
Trên đây là các bài hướng dẫn chi tiết về cách làm việc với ESP32 Bluetooth Classic, thông qua giao tiếp Serial. Chúc các bạn thành công!