- Điều kiện tiên quyết
- Vật liệu thiết yếu
- Phần cứng
- Nhận địa chỉ Bluetooth của máy chủ (Địa chỉ của băng tần thể dục)
- Nhận Dịch vụ và UUID đặc trưng của máy chủ
- Lập trình ESP32 để hoạt động như một ứng dụng khách cho Ứng dụng chuyển mạch tiệm cận
- Làm việc và Kiểm tra
Thật tuyệt làm sao khi đèn tự động bật ngay khi bạn bước vào nhà và tắt lại khi bạn rời đi! Vâng, một ứng dụng đơn giản có thể làm điều này cho bạn. Ở đây trong dự án này, chúng tôi sẽ sử dụng ESP32 làm ứng dụng khách BLE và ban nhạc thể dục làm máy chủ BLE, vì vậy bất cứ khi nào một người đeo dây tập thể dục ở trong phạm vi của ESP32 Bluetooth, ESP32 sẽ phát hiện ra nó và bật Đèn. Bất kỳ thiết bị Bluetooth nào có khả năng máy chủ BLE đều có thể được sử dụng làm thiết bị kích hoạt để điều khiển bất kỳ thiết bị gia dụng nào bằng ESP32.
Chúng tôi đã khám phá các chức năng BLE (Bluetooth Low Energy) của mô-đun ESP32 và tôi khá phấn khích với nó. Tóm lại, mô-đun này có cả Bluetooth cổ điển và Bluetooth Low Energy (BLE), Bluetooth cổ điển có thể được sử dụng để truyền các bài hát hoặc tệp và tùy chọn BLE có thể được sử dụng cho các ứng dụng tối ưu hóa pin như đèn hiệu Bluetooth, dải thể dục, sự gần gũi, v.v. Cũng có thể sử dụng nó như một Bluetooth nối tiếp như mô-đun HC-05 hoặc HC-06 cho các dự án vi điều khiển đơn giản.
Như bạn đã biết, ESP32 BLE có thể hoạt động ở hai chế độ khác nhau. Một là chế độ máy chủ mà chúng ta đã thảo luận bằng cách sử dụng dịch vụ GATT để bắt chước dịch vụ chỉ báo mức pin. Trong bài tập đó, ESP32 hoạt động như một máy chủ và điện thoại di động của chúng tôi hoạt động như một máy khách. Bây giờ, chúng ta hãy vận hành ESP32 như một máy khách và thử kết nối nó với các máy chủ BLE khác như ban nhạc thể dục của tôi.
Tất cả các máy chủ BLE bao gồm cả ban nhạc thể dục của tôi đều ở chế độ quảng cáo liên tục, tức là chúng luôn có thể được phát hiện khi được khách hàng quét. Bằng cách tận dụng tính năng này, chúng tôi có thể sử dụng các dây đeo thể dục này như một công tắc gần, có nghĩa là các dây đeo thể dục này luôn được buộc vào tay người dùng và bằng cách quét tìm dây đeo, chúng tôi có thể phát hiện xem người đó có ở trong phạm vi hoạt động hay không. Đây chính xác là những gì chúng ta sẽ làm trong bài viết này. Chúng tôi sẽ lập trình ESP32 để hoạt động như một ứng dụng khách BLE và liên tục quét các thiết bị BLE; nếu chúng tôi tìm thấy dải thể dục trong phạm vi, chúng tôi sẽ thử kết nối với nó và nếu kết nối thành công, chúng tôi có thể kích hoạt bóng đèn bằng cách chuyển đổi một trong các chân GPIO trên ESP32. Phương pháp này đáng tin cậy vì mỗi máy chủ BLE(băng tần thể dục) sẽ có một ID phần cứng duy nhất để không có hai thiết bị máy chủ BLE nào giống hệt nhau. Thật thú vị phải không? !!! Bây giờ, chúng ta hãy bắt đầu xây dựng
Điều kiện tiên quyết
Trong bài viết này, tôi giả sử rằng bạn đã quen thuộc về cách sử dụng bảng ESP32 với Arduino IDE, nếu không muốn quay lại bắt đầu với hướng dẫn ESP32.
Chúng tôi đã chia ESP32 Bluetooth hoàn chỉnh thành ba phân đoạn để dễ hiểu. Vì vậy, bạn nên xem qua hai hướng dẫn đầu tiên trước khi bắt đầu với hướng dẫn này.
- Bluetooth nối tiếp trên đèn LED chuyển đổi ESP32 từ điện thoại di động
- Máy chủ BLE để gửi dữ liệu mức pin tới Điện thoại di động bằng Dịch vụ GATT
- Ứng dụng khách BLE để quét các thiết bị BLE và hoạt động như một đèn hiệu.
Chúng tôi đã trình bày hai hướng dẫn đầu tiên, ở đây chúng tôi đang tiếp tục với hướng dẫn cuối cùng để giải thích ESP32 là ứng dụng khách BLE.
Vật liệu thiết yếu
- Ban phát triển ESP32
- Tải AC (Đèn)
- Mô-đun chuyển tiếp
Phần cứng
Phần cứng cho dự án ESP32 BLE Client này khá đơn giản vì hầu hết điều kỳ diệu xảy ra bên trong mã. ESP32 phải bật đèn AC (Tải) khi tín hiệu Bluetooth được phát hiện hoặc mất. Để chuyển đổi tải này, chúng tôi sẽ sử dụng Rơle, và vì các chân GPIO của ESP32 chỉ tương thích với 3,3V nên chúng tôi cần một mô-đun Rơle có thể được điều khiển bằng 3,3V. Chỉ cần kiểm tra xem bóng bán dẫn nào được sử dụng trong mô-đun Relay nếu đó là BC548, bạn có thể tự xây dựng mạch của riêng mình bằng cách làm theo sơ đồ mạch bên dưới.
Cảnh báo: Mạch xử lý điện áp nguồn AC trực tiếp 220V. Hãy cẩn thận với dây điện sống và đảm bảo rằng bạn không tạo ra hiện tượng đoản mạch. Bạn đã được cảnh báo.
Lý do đằng sau việc sử dụng BC548 hơn BC547 hoặc 2N2222 là chúng có điện áp cực phát thấp có thể được kích hoạt chỉ với 3,3V. Các rơle sử dụng ở đây là một relay 5V, vì vậy chúng tôi cung cấp năng lượng nó với Vin pin mà được 5V hình cáp nguồn. Chân nối đất được nối với đất của mạch. Các điện trở R1 1K được sử dụng như một cơ sở điện trở giới hạn hiện tại. Dây Pha được nối với chân KHÔNG của Rơle và chân Chung của Rơle được nối với tải và đầu kia của tải được nối với Trung tính. Bạn có thể hoán đổi vị trí của Pha và Trung lập nhưng hãy cẩn thận, bạn không trực tiếp bán khống chúng. Dòng điện phải luôn đi qua Tải (Bóng đèn).Tôi đã sử dụng mô-đun Rơle để giữ mọi thứ đơn giản và tải ở đây là đèn LED Tiêu điểm. Thiết lập của tôi trông giống như sau
Nếu bạn muốn bỏ qua phần cứng ngay bây giờ, bạn có thể sử dụng chân GPIO 2 thay vì chân GPIO 13 để bật tắt đèn LED trên bo mạch trên ESP32. Phương pháp này được khuyến khích cho người mới bắt đầu.
Nhận địa chỉ Bluetooth của máy chủ (Địa chỉ của băng tần thể dục)
Như đã nói trước đó, chúng tôi sẽ lập trình ESP32 hoạt động như một máy khách (tương tự như điện thoại) và kết nối với máy chủ là băng tần thể dục của tôi (Lenovo HW-01). Để một máy khách kết nối với máy chủ, nó phải biết địa chỉ Bluetooth của máy chủ. Mỗi máy chủ Bluetooth như ban nhạc thể dục của tôi ở đây, đều có địa chỉ Bluetooth duy nhất của riêng nó là địa chỉ vĩnh viễn. Bạn có thể liên hệ điều này với địa chỉ MAC của máy tính xách tay hoặc điện thoại di động của bạn.
Để lấy mẫu Địa chỉ này, máy chủ chúng tôi sử dụng ứng dụng có tên nRF kết nối từ các chất bán dẫn Bắc Âu mà chúng tôi đã sử dụng cho hướng dẫn trước của chúng tôi. Nó có sẵn miễn phí cho cả người dùng IOS và Android. Chỉ cần tải xuống, khởi chạy ứng dụng và quét các thiết bị Bluetooth gần đó. Ứng dụng sẽ liệt kê tất cả các thiết bị BLE mà nó tìm thấy. Tên của tôi là HW-01, chỉ cần nhìn vào bên dưới tên của nó và bạn sẽ tìm thấy địa chỉ phần cứng của máy chủ như hình bên dưới.
Vì vậy, địa chỉ phần cứng ESP32 BLE của băng tần thể dục của tôi là C7: F0: 69: F0: 68: 81, bạn sẽ có một bộ số khác ở cùng một định dạng. Chỉ cần ghi lại nó vì chúng ta sẽ cần khi lập trình ESP32 của mình.
Nhận Dịch vụ và UUID đặc trưng của máy chủ
Được rồi, bây giờ chúng tôi đã xác định máy chủ của mình bằng địa chỉ BLE nhưng để giao tiếp với nó, chúng tôi cần nói ngôn ngữ Dịch vụ và các đặc điểm, mà bạn sẽ hiểu nếu bạn đã đọc hướng dẫn trước đó. Trong hướng dẫn này, tôi đang sử dụng đặc tính ghi của máy chủ của mình (băng tần thể dục) để ghép nối với nó. Vì vậy, để ghép nối với thiết bị, chúng tôi cần UUID đặc trưng của quảng cáo dịch vụ mà chúng tôi có thể lấy lại với cùng một ứng dụng.
Chỉ cần nhấp vào nút kết nối trên ứng dụng của bạn và tìm kiếm một số đặc điểm ghi, tại đây ứng dụng sẽ hiển thị UUID dịch vụ và UUID đặc trưng. Của tôi được hiển thị bên dưới
Ở đây UUID dịch vụ và UUID đặc trưng của tôi giống nhau, nhưng không nhất thiết phải giống nhau. Ghi lại UUID của máy chủ của bạn. Của tôi đã được ghi chú là
UUID dịch vụ: 0000fee7-0000-1000-8000-00805f9b34fb UUID đặc trưng: 0000fee7-0000-1000-8000-00805f9b34fb
Không bắt buộc phải sử dụng các đặc điểm ghi; bạn có thể sử dụng bất kỳ dịch vụ hợp lệ nào và UUID đặc trưng của máy chủ được hiển thị trong ứng dụng.
Lập trình ESP32 để hoạt động như một ứng dụng khách cho Ứng dụng chuyển mạch tiệm cận
Ý tưởng của chương trình là làm cho ESP32 hoạt động như một máy khách tiếp tục quét các thiết bị Bluetooth khi nó tìm thấy máy chủ của chúng tôi (băng tần thể dục), nó sẽ xác minh ID phần cứng và nó sẽ chuyển đổi ánh sáng thông qua chân GPIO 13. Được rồi! Nhưng có một vấn đề với điều đó. Tất cả các máy chủ BLE sẽ có phạm vi 10 mét, hơi quá. Vì vậy, nếu chúng ta đang cố gắng thực hiện công tắc khoảng cách để bật ánh sáng khi mở cửa thì phạm vi này rất cao.
Để giảm phạm vi của máy chủ BLE, chúng ta có thể sử dụng tùy chọn ghép nối. Máy chủ BLE và máy khách sẽ chỉ được ghép nối nếu cả hai nằm trong khoảng cách 3-4 Mét. Điều đó hoàn hảo cho ứng dụng của chúng tôi. Vì vậy, chúng tôi làm cho ESP32 không chỉ để khám phá máy chủ BLE mà còn để kết nối với nó và đảm bảo rằng nó vẫn được ghép nối. Miễn là chúng được ghép nối, đèn AC sẽ vẫn sáng, khi vượt quá phạm vi ghép nối sẽ bị mất và đèn sẽ bị tắt. Chương trình ví dụ ESP32 BLE hoàn chỉnh để làm điều tương tự được đưa ra ở cuối trang này. Dưới đây, tôi sẽ chia mã thành các đoạn nhỏ và thử giải thích chúng.
Sau khi bao gồm tệp tiêu đề, chúng tôi thông báo cho ESP32 về địa chỉ BLE, Dịch vụ và UUID đặc trưng mà chúng tôi thu được thông qua ứng dụng kết nối nRF như được giải thích trong các tiêu đề trên. Mã trông giống như dưới đây
BLEUUID serviceUUID tĩnh ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID dịch vụ của fitnessband thu được thông qua ứng dụng nRF connect static BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID đặc trưng của fitnessband thu được thông qua ứng dụng nRF connect String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Phần cứng Bluetooth MAC của dây đeo thể dục của tôi , sẽ khác nhau đối với mọi băng tần thu được thông qua ứng dụng kết nối nRF
Tiếp theo là trong chương trình, chúng ta có connectToserver và MyAdvertisedDeviceCallback mà chúng ta sẽ quay lại sau. Sau đó, bên trong chức năng thiết lập , chúng tôi khởi tạo màn hình nối tiếp và tạo BLE trên ESP để quét thiết bị. Sau khi quá trình quét hoàn tất cho mọi thiết bị BLE đã phát hiện ra hàm MyAdvertisedDeviceCallbacks được gọi.
Chúng tôi cũng bật tính năng quét hoạt động vì chúng tôi đang cấp nguồn cho ESP32 bằng nguồn điện chính, đối với ứng dụng pin, nó sẽ được tắt để giảm mức tiêu thụ hiện tại. Chân kích hoạt Relay được kết nối với GPIO 13 trong phần cứng của chúng tôi, vì vậy chúng tôi cũng khai báo rằng chân GPIO 13 là đầu ra.
void setup () { Serial.begin (115200); // Khởi động màn hình nối tiếp Serial.println ("Chương trình máy chủ ESP32 BLE"); // Thông báo giới thiệu BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // tạo bản quét mới pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Gọi lớp được định nghĩa ở trên pBLEScan-> setActiveScan (true); // hoạt động quét sử dụng nhiều năng lượng hơn, nhưng nhận được kết quả nhanh hơn pinMode (13, OUTPUT); // Khai báo chân LED tích hợp làm đầu ra }
Bên trong hàm MyAdvertisedDeviceCallbacks , chúng tôi in dòng sẽ liệt kê tên và thông tin khác của các thiết bị BLE đã được phát hiện. Chúng tôi cần ID phần cứng của thiết bị BLE đã được phát hiện để có thể so sánh với ID mong muốn. Vì vậy, chúng tôi sử dụng biến Server_BLE_Address để lấy địa chỉ của thiết bị và sau đó cũng để chuyển đổi nó từ kiểu BLEAddress thành chuỗi.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice AdvertisingDevice) { Serial.printf ("Kết quả quét:% s \ n", AdvertisingDevice.toString (). c_str ()); Server_BLE_Address = new BLEAddress (AdvertisingDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Bên trong hàm vòng lặp , chúng tôi quét trong 3 giây và đưa kết quả vào bên trong foundDevices là một đối tượng từ BLEScanResults. Nếu chúng tôi tìm thấy một hoặc nhiều thiết bị bằng cách quét, chúng tôi bắt đầu kiểm tra xem địa chỉ BLE được phát hiện có khớp với địa chỉ mà chúng tôi đã nhập trong chương trình hay không. Nếu kết quả phù hợp là tích cực và thiết bị không được ghép nối trước đó, chúng tôi thử phân tích với thiết bị đó bằng cách sử dụng chức năng connectToserver. Chúng tôi cũng đã sử dụng một vài câu lệnh Sê-ri cho mục đích hiểu.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && đã ghép nối == false) { Serial.println ("Đã tìm thấy Thiết bị: -)… đang kết nối với Máy chủ dưới dạng máy khách"); if (connectToserver (* Server_BLE_Address)) {
Bên trong chức năng connectToserver, chúng tôi sử dụng UUID để ghép nối với máy chủ BLE (băng tần thể dục). Để kết nối với máy chủ, ESP32 phải hoạt động như một máy khách, vì vậy chúng tôi tạo một máy khách bằng cách sử dụng hàm createClient () và sau đó kết nối với địa chỉ của máy chủ BLE. Sau đó, chúng tôi tìm kiếm dịch vụ và đặc tính bằng cách sử dụng các giá trị UUID và thử kết nối với nó. Khi kết nối thành công, hàm trả về true và nếu không, nó trả về false. Lưu ý rằng không bắt buộc phải có dịch vụ và UUID đặc trưng để ghép nối với máy chủ, việc này chỉ được thực hiện theo sự hiểu biết của bạn.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Máy khách đã tạo"); // Kết nối với Máy chủ BLE. pClient-> kết nối (pAddress); Serial.println ("- Đã kết nối với fitnessband"); // Lấy tham chiếu đến dịch vụ mà chúng tôi đang theo dõi trong máy chủ BLE từ xa. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Đã tìm thấy dịch vụ của chúng tôi"); trả về true; } else trả về false; // Lấy tham chiếu đến đặc tính trong dịch vụ của máy chủ BLE từ xa. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Đã tìm thấy đặc điểm của chúng ta"); trả về true; }
Nếu kết nối thành công, chân GPIO 13 được đặt ở mức cao và điều khiển được gửi ra bên ngoài vòng lặp bằng cách sử dụng câu lệnh break. Biến Boolean được ghép nối cũng được đặt là true.
if (connectToserver (* Server_BLE_Address)) { pair = true; Serial.println ("******************** Đèn LED BẬT ********************** ** "); digitalWrite (13, CAO); phá vỡ; }
Sau khi ghép nối thành công và chân GPIO được bật, chúng ta phải kiểm tra xem thiết bị có còn trong vùng phủ sóng hay không. Vì bây giờ thiết bị đã được ghép nối, dịch vụ quét BLE sẽ không thể nhìn thấy thiết bị đó nữa. Chúng tôi sẽ tìm lại nó chỉ khi người dùng rời khỏi khu vực. Vì vậy, chúng tôi chỉ cần quét máy chủ BLE và nếu chúng tôi phát hiện ra, chúng tôi phải đặt chân GPIO ở mức thấp như hình dưới đây
if (Scaned_BLE_Address == My_BLE_Address && được ghép nối == true) { Serial. println ("Thiết bị của chúng tôi nằm ngoài phạm vi"); ghép đôi = sai; Nối tiếp. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, THẤP); ESP.restart (); phá vỡ; }
Làm việc và Kiểm tra
Khi bạn đã sẵn sàng với chương trình và thiết lập phần cứng, chỉ cần tải mã lên ESP32 và sắp xếp toàn bộ thiết lập như hình dưới đây.
Bạn sẽ thấy Đèn được bật ngay khi dải thể dục (máy chủ) kết hợp với ESP32. Bạn cũng có thể kiểm tra điều này bằng cách để ý biểu tượng kết nối Bluetooth trên băng tần thể dục. Sau khi được ghép nối, chỉ cần thử đi bộ ra khỏi ESP32 và khi bạn vượt qua 3-4 mét, bạn sẽ nhận thấy rằng biểu tượng Bluetooth trên đồng hồ biến mất và kết nối bị mất. Bây giờ, nếu bạn nhìn vào đèn nó sẽ bị tắt. Khi bạn quay lại, thiết bị sẽ được ghép nối lại và đèn bật sáng. Toàn bộ hoạt động của dự án có thể được tìm thấy trong video dưới đây.
Hy vọng bạn thích dự án và học được điều gì đó mới trên đường đi. Nếu bạn gặp bất kỳ vấn đề nào trong quá trình làm việc, vui lòng đăng vấn đề trên diễn đàn hoặc thậm chí trên phần bình luận bên dưới