- Wymagane składniki
- Korzystanie z aplikacji nRF Connect na Androida dla ESP32 iBeacon
- Programowanie ESP32 do pracy jako BLE iBeacon
ESP32 to naprawdę potężne urządzenie IoT, które ma wbudowaną obsługę Bluetooth i WiFi. ESP32 to zaawansowana wersja swojego poprzednika ESP8266 z dodatkowymi funkcjami, takimi jak pamięć RAM, ROM, piny GPIO itp. Moduł ESP32 obsługuje zarówno klasyczny Bluetooth, jak i Bluetooth Low Energy (BLE), klasyczny Bluetooth może być używany do przesyłania utworów lub plików oraz BLE Opcja może być używana do aplikacji zoptymalizowanych pod kątem baterii, takich jak beacony Bluetooth, opaski fitness, zbliżeniowe itp. Możliwe jest również użycie ESP32 jako szeregowego Bluetooth, takiego jak moduły HC-05 lub HC-06 dla prostych projektów mikrokontrolerów.
Jak wiemy BLE może działać w dwóch różnych trybach - trybie serwera i trybie klienta. Oba tryby zostały omówione w naszych poprzednich samouczkach ESP32:
- Serwer ESP32 BLE - Usługa GATT w zakresie wskazywania poziomu baterii
- Klient ESP32 BLE - łączenie się z opaską fitness w celu wyzwolenia żarówki
W tym samouczku zbudujemy BLE iBeacon przy użyciu ESP32, gdzie ESP32 będzie działał jako serwer, a smartfon będzie działał jako klient. Zakładam, że wiesz już, jak używać płytki ESP32 z Arduino IDE, jeśli nie wróć do samouczka wprowadzającego do ESP32.
Możesz również dowiedzieć się więcej o technologii Beacon / iBeacon, przeglądając nasze poprzednie projekty Bluetooth iBeacon z wykorzystaniem Raspberry Pi i HM-10 BLE iBeacon.
Wymagane składniki
Sprzęt komputerowy:
- Płytka rozwojowa ESP32
- Kabel Micro USB
Oprogramowanie:
- Arduino IDE
- Aplikacja na Androida: nRF Connect for Mobile (od Nordic Semiconductor)
Istnieje wiele aplikacji skanera BLE, z których jedną wykorzystaliśmy w naszym poprzednim projekcie Jak używać modułu HM-10 BLE z Arduino. Ta aplikacja skanera BLE zapewnia dobry interfejs graficzny (GUI), ale brakuje dodatkowych informacji, więc w tym projekcie używamy aplikacji NRF Connect for Mobile.
Korzystanie z aplikacji nRF Connect na Androida dla ESP32 iBeacon
1. Pobierz aplikację nRF Connect ze sklepu Google Play i otwórz ją.
2. Ekran wygląda jak poniżej. Przydatne opcje dla tego projektu to „Skanuj”, „Skaner” i „Informacje”, gdy urządzenia zostaną znalezione.
Opcja „Skanuj” zostanie użyta do wyświetlenia wszystkich dostępnych iBeaconów. Aby rozpocząć wyszukiwanie iBeacon, pociągnij w dół ekran lub przejdź do opcji „Skanuj” w prawym górnym rogu ekranu. Rozpocznie się wyszukiwanie dostępnych iBeaconów.
3. Po przeszukaniu iBeacon, będziesz mógł zobaczyć RSSI, UUID, Major i Minor of iBeacon. RSSI ulegnie zmianie, jeśli oddalisz telefon komórkowy lub iBeacon od siebie. Tutaj, na tym ekranie, RSSI to (-37). Poza tym istnieją pewne szczegóły, takie jak fikcyjna nazwa firmy, typ urządzenia, długość bajtów, lokalna nazwa ESP32. Tutaj jest to „ ESP32 as iBeacon ”. Możesz zmienić lokalną nazwę w szkicu.
4. Po zabraniu smartfona z iBeacon wartość RSSI zmienia się z -37 na -58. Te wartości będą się zmieniać, jeśli przesuniesz jedno z urządzeń.
Dopuszczalne wartości sygnału RSSI są następujące:
Siła sygnału | TL; DR | Wymagane do | |
---|---|---|---|
-30 dBm | Niesamowity | Maksymalna osiągalna siła sygnału. Aby to osiągnąć, klient może znajdować się tylko kilka stóp od punktu dostępowego. Nie jest typowe ani pożądane w prawdziwym świecie. | Nie dotyczy |
-67 dBm | Bardzo dobre | Minimalna siła sygnału dla aplikacji, które wymagają bardzo niezawodnego i terminowego dostarczania pakietów danych. | VoIP / VoWiFi, streaming wideo |
-70 dBm | w porządku | Minimalna siła sygnału zapewniająca niezawodne dostarczanie pakietów. | E-mail, internet |
-80 dBm | Niedobrze | Minimalna siła sygnału dla podstawowej łączności. Dostarczanie paczek może być zawodne. | Nie dotyczy |
-90 dBm | Bezużyteczne | Zbliżanie się lub utonięcie w podłodze szumowej. Żadna funkcjonalność jest mało prawdopodobna. | Nie dotyczy |
Programowanie ESP32 do pracy jako BLE iBeacon
Po zainstalowaniu płytki ESP32 w Arduino IDE dostępny jest przykładowy program ESP32 BLE iBeacon. Ale nieco zmodyfikowaliśmy ten szkic w tym samouczku, kompletna edytowana wersja przykładowego programu znajduje się na końcu tego samouczka.
Aby otworzyć przykładowy program ESP32 BLE_iBeacon, wykonaj poniższe kroki.
- Otwórz Arduino IDE i wybierz „ESP32 Dev Module”. (Jeśli nie znajdziesz tej płyty, sprawdź, czy zainstalowałeś pakiet płyty ESP32)
- Przejdź do Plik > Przykłady > ESP32 BLE Arduino > BLE_iBeacon
- Otwórz szkic „BLE_iBeacon”.
Teraz wprowadzono niewielką modyfikację w kodzie, która została wykonana w tym samouczku. Nazwa ESP32 zostanie również zaktualizowana w tym szkicu. Zacznij więc od włączenia niezbędnych bibliotek, które zostaną wykorzystane przy tworzeniu serwera BLE i iBeacon.
#include „sys / time.h”
To jest biblioteka czasu do pobierania aktualnego czasu systemowego. Zawiera funkcje takie jak tv_sec, gettimeofday () itp. Aby uzyskać więcej informacji, możesz odwiedzić oficjalne wydanie „ sys / time.h” dla systemu UNIX.
Następnie dołączane są biblioteki BLE ESP32, które zawierają wiele funkcji używanych do tworzenia ESP32 w różnych konfiguracjach, takich jak klient BLE lub serwer BLE.
#include „BLEDevice.h” #include „BLEUtils.h” #include „BLEServer.h”
Biblioteka iBeacon jest wliczone który ustawia ESP32 jako iBeacon. Wraz z tym dostępna jest biblioteka głębokiego snu dla ESP32. Biblioteka będzie używana do wysyłania ESP32 w tryb głębokiego uśpienia przez określony czas.
#include „BLEBeacon.h” #include „esp_sleep.h”
Zdefiniuj czas uśpienia dla ESP32. Tutaj ESP32 będzie w stanie głębokiego snu przez okres 10 sekund, po czym zacznie się rozgłaszać, a następnie ponownie przejdzie w głęboki sen na 10 sekund.
# zdefiniować GPIO_DEEP_SLEEP_DURATION 10
Tutaj zdefiniowano RTC_DATA_ATTR. Zauważ, że jeśli zdefiniujesz zmienną globalną z atrybutem RTC_DATA_ATTR, zmienna zostanie umieszczona w pamięci RTC_SLOW_MEM. Tak więc struktura zadeklarowana jako RTC_DATA_ATTR i skopiowanie pamięci dynamicznej do tej struktury przed głębokim uśpieniem pomaga odzyskać ją do pamięci dynamicznej po przebudzeniu. W prostych słowach oszczędzamy czas w pamięci statycznej z pamięci dynamicznej, aby odzyskać go ponownie po głębokim śnie. Tutaj zdefiniowane są dwie zmienne. Wartość „ last ” jest używana do określenia ostatniego czasu, gdy ESP32 przeszedł w stan głębokiego uśpienia i używany jest licznik rozruchu, zliczając liczbę resetowań.
RTC_DATA_ATTR statyczny czas_t ostatni; RTC_DATA_ATTR statyczny bootcount uint32_t;
Następnie zdefiniuj typ reklamy BLE. Definicja jest następująca.
BLEAdvertising * pAdvertising;
Timeval jest zdefiniowane jako struktury dostępu do aktualnego czasu.
struct timeval teraz;
Zdefiniowano również UUID. Identyfikatory UUID można wygenerować z tego łącza .
# zdefiniować BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Teraz utwórz funkcję, która będzie zawierać atrybuty iBeacon, takie jak UUID, Major, Minor itp. W tej funkcji utwórz instancję dla BLE jako iBeacon i ustaw fałszywy identyfikator producenta, UUID, główny i pomocniczy dla ESP32 jako iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManywordsId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Ustaw flagę na 0x04, aby wyświetlała BrEdrNotSupported w skanerze.
oData.setFlags (0x04);
Ustaw dane reklamowe do publikacji.
std:: string strServiceData = "";
Dodaj ciąg jeden po drugim, aby reklamować.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Wpisz strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Rozpocznij reklamę od opublikowania danych.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Uruchom monitor szeregowy z prędkością 115200 bodów i uzyskaj czas. Zwiększ także bootcount, aby zapisać liczbę resetów .
Serial.begin (115200); gettimeofday (& teraz, NULL); Serial.printf ("start ESP32% d \ n", bootcount ++);
Zapisz aktualny czas w pamięci statycznej.
last = now.tv_sec;
Utwórz urządzenie BLE i nadaj mu dowolną nazwę. Tutaj ESP32 nazwano „ ESP2 as iBeacon ”. Zwróć uwagę, że nazwy mogą być długie, ale ta wersja kodu uruchomiła obsługę długich nazw.
BLEDevice:: init ("ESP32 jako iBeacon");
Utwórz serwer BLE do reklamowania i uruchamiania.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Następnie ustaw ESP32 w trybie iBeacon.
setBeacon ();
Rozpocznij reklamowanie, a następnie zatrzymaj reklamy i idź w głęboki sen na 10 sekund.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Na koniec podłącz płytkę rozwojową ESP32 do laptopa za pomocą kabla Micro USB i prześlij kod do ESP32 za pomocą Arduino IDE. Następnie otwórz aplikację nRF Connect Android na swoim smartfonie i rozpocznij skanowanie. Znajdziesz ESP32 jako transmisję iBeacon, jak pokazano na poniższym obrazku:
W ten sposób ESP32 można wykorzystać jako BLE Beacon do reklamowania UUID, Major i Minor. Jeśli chcesz dowiedzieć się więcej o iBeacon, skorzystaj z naszego poprzedniego samouczka na temat HM10 jako iBeacon. Jeśli masz jakiekolwiek wątpliwości, skomentuj poniżej lub zadawaj pytania na forach.
Pełny kod z działającym filmem znajduje się poniżej.
/>