Hướng dẫn ESP32 37/55 - Sử dụng ứng dụng Bluetooth với ESP32 BLE | Bộ học IoT ESP32 của SunFounder
Trong hướng dẫn này, chúng ta sẽ khám phá cách sử dụng ESP32 như một máy chủ Bluetooth để gửi và nhận tin nhắn từ ứng dụng di động. Điều này cho phép giao tiếp tương tác giữa bo mạch ESP32 của bạn và thiết bị di động, biến nó thành một bổ sung linh hoạt cho các dự án IoT của bạn. Đến cuối bài học này, bạn sẽ có thể gửi văn bản từ thiết bị di động đến ESP32 và thấy nó hiển thị trên màn hình nối tiếp.
Chúng ta sẽ sử dụng ứng dụng LightBlue Explorer, có sẵn trên cả iOS và Android, để giao tiếp với ESP32. Hướng dẫn này là nền tảng để hiểu giao tiếp Bluetooth năng lượng thấp (BLE) và tạo tiền đề cho các dự án nâng cao hơn. Để có hướng dẫn trực quan, vui lòng tham khảo video tại (trong video ở phút 02:00).
Phần cứng được giải thích
Thành phần chính trong dự án này là vi điều khiển ESP32, tích hợp cả khả năng Wi-Fi và Bluetooth. Điều này cho phép ESP32 hoạt động như một máy chủ, nhận và gửi dữ liệu không dây. Chức năng Bluetooth tích hợp của ESP32 hỗ trợ BLE, giúp hiệu quả cho các ứng dụng năng lượng thấp.
Ngoài ESP32, chúng ta sẽ sử dụng một thiết bị di động có cài ứng dụng LightBlue. Ứng dụng này cho phép người dùng kết nối với ESP32 và gửi dữ liệu qua Bluetooth. Sự tích hợp của các thành phần này cho phép giao tiếp liền mạch giữa ESP32 và thiết bị di động, tăng cường tương tác người dùng.
Chi tiết bảng dữ liệu
| Nhà sản xuất | Espressif Systems |
|---|---|
| Số bộ phận | ESP32-WROOM-32 |
| Điện áp logic/IO | 3,3 V |
| Điện áp cung cấp | 3,0 – 3,6 V |
| Dòng điện đầu ra (mỗi kênh) | 40 mA |
| Dòng điện đỉnh (mỗi kênh) | 160 mA |
| Hướng dẫn tần số PWM | 1 kHz |
| Ngưỡng logic đầu vào | 0,2 VCC (thấp), 0,8 VCC (cao) |
| Sụt áp / RDS(on) / bão hòa | 0,1 V |
| Giới hạn nhiệt | 125 °C |
| Đóng gói | QFN48 |
| Ghi chú / biến thể | ESP32-WROOM-32, ESP32-WROVER |
- Đảm bảo nguồn điện ổn định (3,3 V) để tránh sụt áp.
- Sử dụng tụ điện để tách rời gần các chân nguồn.
- Duy trì tản nhiệt thích hợp nếu sử dụng dòng điện cao.
- Thận trọng với mức điện áp chân GPIO; chúng chịu được 3,3 V.
- Sử dụng điện trở kéo lên hoặc kéo xuống khi cần cho cấu hình GPIO.
- Giám sát kết nối BLE; đảm bảo ứng dụng được ghép nối đúng cách.
- Xác minh UUID cho các dịch vụ và đặc tính là duy nhất.
- Thường xuyên kiểm tra màn hình nối tiếp để gỡ lỗi thông báo.
- Cân nhắc sử dụng máy phân tích logic để khắc phục sự cố tín hiệu phức tạp.
Hướng dẫn nối dây
Việc nối dây cho dự án này rất đơn giản vì ESP32 chủ yếu kết nối qua USB để cấp nguồn và lập trình. Kết nối ESP32 với máy tính của bạn bằng cáp micro USB. Đảm bảo cổng USB cung cấp đủ nguồn (thường là 5 V). Màn hình nối tiếp sẽ được sử dụng để gỡ lỗi, vì vậy không cần kết nối phần cứng bổ sung cho ứng dụng này.
Khi sử dụng ESP32 với các thành phần bên ngoài trong các dự án tương lai, hãy nhớ kết nối các chân nối đất với một điểm nối đất chung. Điều này đảm bảo ESP32 và bất kỳ cảm biến hoặc mô-đun được kết nối nào chia sẻ cùng một điểm tham chiếu. Ngoài ra, nếu bạn sử dụng pin, hãy kết nối cực dương với chân 3,3 V và cực âm với chân nối đất trên ESP32.
Ví dụ mã & hướng dẫn từng bước
Mã được cung cấp khởi tạo máy chủ Bluetooth, thiết lập các dịch vụ và đặc tính cần thiết, và xử lý các tin nhắn đến. Các định danh chính bao gồm bleName, xác định tên của thiết bị Bluetooth, và receivedText, lưu trữ tin nhắn đến từ ứng dụng di động.
const char *bleName = "ESP32_Bluetooth";
String receivedText = "";
Hàm setup() khởi tạo giao tiếp nối tiếp và thiết lập BLE. Điều này rất quan trọng để thiết lập kết nối với ứng dụng LightBlue.
void setup() {
Serial.begin(115200); // Khởi tạo cổng nối tiếp
setupBLE(); // Khởi tạo Bluetooth BLE
}
Trong hàm loop(), mã kiểm tra các tin nhắn đến. Nếu có tin nhắn mới được nhận, nó sẽ được in ra màn hình nối tiếp và một thông báo được gửi đến thiết bị BLE được kết nối.
if (receivedText.length() > 0 && millis() - lastMessageTime > 1000) {
Serial.print("Tin nhắn nhận được: ");
Serial.println(receivedText);
pCharacteristic->setValue(receivedText.c_str());
pCharacteristic->notify();
receivedText = "";
}
Để hiểu đầy đủ, hãy tham khảo mã hoàn chỉnh được tải bên dưới bài viết. Điều này sẽ cung cấp cho bạn tất cả các chi tiết cần thiết để triển khai dự án thành công.
Trình diễn / Điều gì sẽ xảy ra
Sau khi triển khai thành công, bạn sẽ có thể gửi tin nhắn từ ứng dụng LightBlue đến ESP32. Khi bạn nhập một tin nhắn, chẳng hạn như "Xin chào," nó sẽ xuất hiện trên màn hình nối tiếp. Ngoài ra, bạn có thể gửi tin nhắn trở lại ứng dụng, xác nhận giao tiếp hai chiều. Nếu bạn gặp sự cố như tin nhắn không xuất hiện, hãy đảm bảo ESP32 được ghép nối đúng cách với ứng dụng và UUID khớp nhau.
Dấu thời gian video
- 00:00 Bắt đầu
- 2:10 Giới thiệu về dự án
- 2:45 Trang tài liệu
- 4:04 Mã Arduino
- 6:31 Cài đặt ứng dụng Bluetooth
- 7:12 Chọn bo mạch ESP32 và cổng COM
- 8:54 Trình diễn dự án
#include "BLEDevice.h"
#include "BLEServer.h"
#include "BLEUtils.h"
#include "BLE2902.h"
// Define the Bluetooth device name
const char *bleName = "ESP32_Bluetooth";
// Define the received text and the time of the last message
String receivedText = "";
unsigned long lastMessageTime = 0;
// Define the UUIDs of the service and characteristics
#define SERVICE_UUID "your_service_uuid_here"
#define CHARACTERISTIC_UUID_RX "your_rx_characteristic_uuid_here"
#define CHARACTERISTIC_UUID_TX "your_tx_characteristic_uuid_here"
// Define the Bluetooth characteristic
BLECharacteristic *pCharacteristic;
void setup() {
Serial.begin(115200); // Initialize the serial port
setupBLE(); // Initialize the Bluetooth BLE
}
void loop() {
// When the received text is not empty and the time since the last message is over 1 second
// Send a notification and print the received text
if (receivedText.length() > 0 && millis() - lastMessageTime > 1000) {
Serial.print("Received message: ");
Serial.println(receivedText);
pCharacteristic->setValue(receivedText.c_str());
pCharacteristic->notify();
receivedText = "";
}
// Read data from the serial port and send it to BLE characteristic
if (Serial.available() > 0) {
String str = Serial.readStringUntil('\n');
const char *newValue = str.c_str();
pCharacteristic->setValue(newValue);
pCharacteristic->notify();
}
}
// Define the BLE server callbacks
class MyServerCallbacks : public BLEServerCallbacks {
// Print the connection message when a client is connected
void onConnect(BLEServer *pServer) {
Serial.println("Connected");
}
// Print the disconnection message when a client is disconnected
void onDisconnect(BLEServer *pServer) {
Serial.println("Disconnected");
}
};
// Define the BLE characteristic callbacks
class MyCharacteristicCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
// When data is received, get the data and save it to receivedText, and record the time
std::string value = std::string(pCharacteristic->getValue().c_str());
receivedText = String(value.c_str());
lastMessageTime = millis();
Serial.print("Received: ");
Serial.println(receivedText);
}
};
// Initialize the Bluetooth BLE
void setupBLE() {
BLEDevice::init(bleName); // Initialize the BLE device
BLEServer *pServer = BLEDevice::createServer(); // Create the BLE server
// Print the error message if the BLE server creation fails
if (pServer == nullptr) {
Serial.println("Error creating BLE server");
return;
}
pServer->setCallbacks(new MyServerCallbacks()); // Set the BLE server callbacks
// Create the BLE service
BLEService *pService = pServer->createService(SERVICE_UUID);
// Print the error message if the BLE service creation fails
if (pService == nullptr) {
Serial.println("Error creating BLE service");
return;
}
// Create the BLE characteristic for sending notifications
pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);
pCharacteristic->addDescriptor(new BLE2902()); // Add the descriptor
// Create the BLE characteristic for receiving data
BLECharacteristic *pCharacteristicRX = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicRX->setCallbacks(new MyCharacteristicCallbacks()); // Set the BLE characteristic callbacks
pService->start(); // Start the BLE service
pServer->getAdvertising()->start(); // Start advertising
Serial.println("Waiting for a client connection..."); // Wait for a client connection
}
Common Course Links
Common Course Files
Tài nguyên & tài liệu tham khảo
-
Tài liệuESP32 Tutorial 37/55 - SunFounder doc page for Bluetooth appdocs.sunfounder.com
Tập tin📁
Không có tệp nào khả dụng.