- Componente necesare
- Utilizarea aplicației Android nRF Connect pentru ESP32 iBeacon
- Programarea ESP32 pentru a funcționa ca BLE iBeacon
ESP32 este într-adevăr un dispozitiv IoT puternic, cu suport încorporat pentru Bluetooth și WiFi. ESP32 este versiunea avansată a predecesorului său ESP8266 cu caracteristici suplimentare precum RAM, ROM, pini GPIO etc. Modulul ESP32 acceptă atât Bluetooth clasic, cât și Bluetooth Low Energy (BLE), Bluetooth clasic poate fi utilizat pentru a transfera melodii sau fișiere și BLE opțiunea poate fi utilizată pentru aplicații optimizate pentru baterii, cum ar fi semnalizatoare Bluetooth, benzi de fitness, dispozitive de proximitate etc. Este, de asemenea, posibilă utilizarea ESP32 ca Bluetooth serial, cum ar fi modulele HC-05 sau HC-06 pentru proiecte simple de microcontroler.
După cum știm, BLE poate funcționa în două moduri diferite - modul Server și modul Client. Ambele moduri au fost discutate în tutorialele noastre ESP32 anterioare:
- Server ESP32 BLE - Serviciu GATT pentru indicarea nivelului bateriei
- Client ESP32 BLE - Conectarea la banda de fitness pentru a declanșa un bec
În acest tutorial vom construi un iBeacon BLE folosind ESP32 unde ESP32 va acționa ca un server și smartphone-ul va acționa ca un client. Presupun că sunteți deja familiarizați cu modul de utilizare a plăcii ESP32 cu Arduino IDE, dacă nu, vă întoarceți la începutul tutorialului ESP32.
Puteți afla, de asemenea, mai multe despre ceea ce este tehnologia Beacon / iBeacon parcurgând proiectele noastre anterioare Bluetooth iBeacon folosind Raspberry Pi și HM-10 BLE iBeacon.
Componente necesare
Hardware:
- Consiliul de dezvoltare ESP32
- Cablu micro USB
Software:
- IDE Arduino
- Aplicație Android: nRF Connect pentru mobil (de Nordic Semiconductor)
Există multe aplicații de scanare BLE, una dintre ele pe care am folosit-o în proiectul nostru anterior de Cum se folosește modulul BLE HM-10 cu Arduino. Această aplicație de scanare BLE oferă o interfață grafică bună (GUI), dar nu are informații suplimentare, așa că în acest proiect folosim aplicația NRF Connect for Mobile.
Utilizarea aplicației Android nRF Connect pentru ESP32 iBeacon
1. Descărcați aplicația nRF Connect din Google Play Store și deschideți-o.
2. Ecranul arată ca mai jos. Opțiunile utile pentru acest proiect vor fi „Scanare”, „Scanner” și „Informații” atunci când dispozitivele vor fi găsite.
Opțiunea „Scanare” va fi utilizată pentru a vedea toate iBeacons-urile disponibile. Pentru a începe să căutați iBeacon, fie trageți în jos ecranul, fie mergeți la opțiunea „Scanare” din colțul din dreapta sus al ecranului. Aceasta va începe să caute iBeacons-urile disponibile.
3. După ce căutați pe iBeacon, veți putea vedea RSSI, UUID, Major și Minor din iBeacon. RSSI se va schimba dacă luați mobilul sau iBeacon unul de la altul. Aici, în acest ecran, RSSI este (-37). În afară de aceasta, există câteva detalii, cum ar fi numele companiei fictive, tipul dispozitivului, lungimea octeților, numele local al ESP32. Aici este „ ESP32 ca iBeacon ”. Puteți schimba numele local în schiță.
4. După scoaterea smartphone-ului de la iBeacon, valoarea RSSI se schimbă de la -37 la -58. Aceste valori vor continua să se schimbe dacă mutați unul dintre dispozitive.
Valorile acceptabile ale semnalului RSSI sunt următoarele:
Puterea semnalului | TL; DR | Cerut pentru | |
---|---|---|---|
-30 dBm | Uimitor | Puterea maximă a semnalului realizabilă. Clientul poate fi la doar câțiva metri de AP pentru a realiza acest lucru. Nu este tipic sau de dorit în lumea reală. | N / A |
-67 dBm | Foarte bine | Puterea minimă a semnalului pentru aplicațiile care necesită livrarea foarte rapidă și în timp util a pachetelor de date. | VoIP / VoWiFi, streaming video |
-70 dBm | bine | Puterea minimă a semnalului pentru livrarea fiabilă a pachetelor. | E-mail, web |
-80 dBm | Nu e bine | Puterea minimă a semnalului pentru conectivitatea de bază. Livrarea pachetelor poate fi nesigură. | N / A |
-90 dBm | Inutilizabil | Apropierea sau înecarea în podeaua de zgomot. Orice funcționalitate este foarte puțin probabilă. | N / A |
Programarea ESP32 pentru a funcționa ca BLE iBeacon
Există un exemplu de program de ESP32 BLE iBeacon disponibil când instalați placa ESP32 în Arduino IDE. Dar am modificat ușor această schiță în acest tutorial, versiunea completă editată a programului eșantion este dată la sfârșitul acestui tutorial.
Pentru a deschide programul eșantion al ESP32 BLE_iBeacon, urmați pașii de mai jos.
- Deschideți Arduino IDE și selectați „ESP32 Dev Module”. (Dacă nu găsiți această placă, vă rugăm să verificați dacă ați instalat pachetul de bord ESP32)
- Accesați Fișier > Exemple > ESP32 BLE Arduino > BLE_iBeacon
- Deschideți schița „BLE_iBeacon”.
Acum există o ușoară modificare a codului care se face în acest tutorial. Numele ESP32 va fi, de asemenea, actualizat în această schiță. Deci, începeți cu includerea bibliotecilor necesare, care vor fi utilizate în crearea serverului BLE și iBeacon.
#include „sys / time.h”
Aceasta este o bibliotecă de timp pentru a obține ora curentă a sistemului. Acesta conține funcții precum tv_sec, gettimeofday () etc. Pentru mai multe informații, puteți vizita versiunea oficială UNIX a „ sys / time.h”.
Apoi sunt incluse bibliotecile ESP32 BLE care conțin multe funcții utilizate pentru a face ESP32 în diferite configurații, cum ar fi Clientul BLE sau Serverul BLE.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Este inclusă biblioteca iBeacon care setează ESP32 ca iBeacon. Odată cu aceasta, biblioteca de somn profund este inclusă pentru ESP32. Biblioteca va fi utilizată pentru a trimite ESP32 în modul de repaus profund pentru o perioadă de timp definită.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definiți durata somnului pentru ESP32. Aici ESP32 va fi în somn profund pentru o durată de 10 secunde și va face publicitate și apoi va merge din nou în somn profund timp de 10 secunde.
#define GPIO_DEEP_SLEEP_DURATION 10
Aici este definit RTC_DATA_ATTR. Rețineți că, dacă definiți o variabilă globală cu atributul RTC_DATA_ATTR, variabila va fi plasată în memoria RTC_SLOW_MEM. Deci structura declarată ca RTC_DATA_ATTR și copierea memoriei dinamice în această structură înainte de un somn profund ajută la recuperarea acesteia în memoria dinamică după trezire. Cu cuvinte simple, economisim timpul din memoria statică din memoria dinamică pentru a o recupera din nou după un somn profund. Aici sunt definite cele două variabile. „ Ultimul ” este folosit pentru a obține ultima dată când ESP32 a intrat în adormire profundă și se utilizează numărul de încărcare număr de resetări.
RTC_DATA_ATTR static time_t last; RTC_DATA_ATTR static uint32_t bootcount;
Apoi definiți tipul de publicitate BLE. Definiția se face după cum urmează.
BLEAdvertising * pPublicitate;
Timeval este definit ca structura pentru a avea acces la ora curentă.
struct timeval acum;
De asemenea, este definit UUID. UUID-urile pot fi generate din acest link .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Acum creați o funcție care va conține atribute iBeacon, cum ar fi UUID, Major, Minor, etc. În această funcție creați o instanță pentru BLE ca iBeacon și setați un ID de producător fals, UUID, major și minor pentru ESP32 ca iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Setați semnalizatorul ca 0x04 astfel încât să scoată BrEdrNotSupported în scaner.
oData.setFlags (0x04);
Setați date publicitare pentru publicare.
std:: string strServiceData = "";
Adăugați șirul unul după altul pentru a face publicitate.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Tastați strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Începeți publicitatea publicând date.
pPublicitate-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Începeți monitorul serial la o rată de 115200 baud și obțineți timpul. De asemenea, creșteți numărul de încărcare pentru a stoca numărul de resetări.
Serial.begin (115200); gettimeofday (& acum, NULL); Serial.printf ("începe ESP32% d \ n", bootcount ++);
Stocați ora curentă în memoria statică.
last = now.tv_sec;
Creați un dispozitiv BLE și denumiți-l după cum doriți. Aici ESP32 este denumit „ ESP2 ca iBeacon ”. Rețineți că, numele pot fi lungi, dar această versiune de cod a început suportul pentru numele lungi.
BLEDevice:: init ("ESP32 ca iBeacon");
Creați un server BLE pentru a face publicitate și a începe.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Apoi setați ESP32 în modul iBeacon.
setBeacon ();
Începeți publicitatea, apoi opriți publicitatea și dormiți profund 10 secunde.
pPublicitate-> start (); pPublicitate-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
În cele din urmă, conectați placa de dezvoltare ESP32 cu laptopul dvs. utilizând un cablu Micro USB și încărcați codul în ESP32 folosind Arduino IDE. Apoi deschideți aplicația Android nRF Connect în telefonul smartphone și începeți scanarea. Veți găsi ESP32 ca difuzare iBeacon așa cum se arată în imaginea de mai jos:
Acesta este modul în care ESP32 poate fi folosit ca BLE Beacon pentru a face publicitate UUID, Major și Minor. Dacă doriți să aflați mai multe despre iBeacon, urmați tutorialul nostru anterior de pe HM10 ca iBeacon. De asemenea, dacă aveți vreo îndoială, atunci comentați mai jos sau puneți întrebări pe forumuri.
Codul complet cu un videoclip funcțional este prezentat mai jos.
/>