- Condiții prealabile
- Materiale necesare
- Hardware
- Obțineți adresa Bluetooth a serverului (adresa benzii de fitness)
- Obținerea serviciului și UUID caracteristic serverului
- Programarea ESP32 să acționeze ca un client pentru aplicația de comutare de proximitate
- Lucrul și testarea
Cât de mișto este să aprinzi automat luminile imediat ce intri în casa ta și să le stingi din nou când pleci! Da, o aplicație simplă poate face acest lucru pentru dvs. Aici, în acest proiect, vom utiliza ESP32 ca client BLE și bandă de fitness ca server BLE, astfel încât ori de câte ori o persoană care poartă banda de fitness vine în gama ESP32 Bluetooth, ESP32 o detectează și aprinde Lumina. Orice dispozitiv Bluetooth care are capabilități de server BLE poate fi utilizat ca dispozitiv de declanșare pentru a controla orice aparat de uz casnic utilizând ESP32.
Am explorat deja funcționalitățile BLE (Bluetooth Low Energy) ale modulului ESP32 și sunt destul de încântat de acesta. Pentru a face o recapitulare, acest modul are atât Bluetooth clasic, cât și Bluetooth Low Energy (BLE), Bluetooth-ul clasic poate fi utilizat pentru a transfera melodii sau fișiere, iar opțiunea BLE poate fi utilizată pentru aplicații optimizate de baterie, cum ar fi balize Bluetooth, benzi de fitness,, etc. Este, de asemenea, posibil să îl utilizați ca Bluetooth serial, cum ar fi modulele HC-05 sau HC-06 pentru proiecte simple de microcontroler.
După cum știți, ESP32 BLE poate funcționa în două moduri diferite. Unul este modul server despre care am discutat deja prin utilizarea serviciului GATT pentru a imita un serviciu de indicare a nivelului bateriei. În acel exercițiu, ESP32 a acționat ca un server, iar telefonul nostru mobil a acționat ca un client. Acum, permiteți-ne să operăm ESP32 ca client și să încercăm să îl conectăm la alte servere BLE, cum ar fi banda mea de fitness.
Toate serverele BLE, inclusiv banda mea de fitness, sunt în mod constant de publicitate, adică pot fi descoperite întotdeauna când sunt scanate de un client. Folosind această caracteristică putem folosi aceste benzi de fitness ca un comutator de proximitate, adică aceste benzi de fitness sunt întotdeauna legate de mâna utilizatorului și scanând banda putem detecta dacă persoana se află în raza de acțiune. Exact asta vom face în acest articol. Vom programa ESP32 pentru a acționa ca un client BLE și vom continua să scanăm dispozitivele BLE; dacă găsim banda de fitness în raza de acțiune, vom încerca să ne conectăm la ea și dacă conexiunea are succes, putem declanșa un bec prin comutarea unuia dintre pinii GPIO de pe ESP32. Metoda este fiabilă, deoarece fiecare server BLE(banda de fitness) va avea un ID hardware unic, astfel încât nu există două dispozitive server BLE care să fie identice. Interesant nu? !!! Acum, să începem să construim
Condiții prealabile
În acest articol, presupun că sunteți deja familiarizați cu modul de utilizare a plăcii ESP32 cu Arduino IDE, dacă nu, nu vă întoarceți la începerea tutorialului ESP32.
Am împărțit complet ESP32 Bluetooth în trei segmente pentru ușurința înțelegerii. Deci, este recomandat să parcurgeți primele două tutoriale înainte de a începe cu acesta.
- Bluetooth serial pe LED-ul ESP32 care comută de pe telefonul mobil
- Server BLE pentru a trimite date la nivelul bateriei către telefonul mobil folosind serviciul GATT
- Clientul BLE să scaneze dispozitivele BLE și să acționeze ca un far.
Am acoperit deja primele două tutoriale, aici continuăm cu ultimul pentru a explica ESP32 ca client BLE.
Materiale necesare
- Consiliul de dezvoltare ESP32
- Sarcină AC (lampă)
- Modul releu
Hardware
Hardware-ul pentru acest proiect ESP32 BLE Client este destul de simplu, deoarece majoritatea magiei se întâmplă în interiorul codului. ESP32 trebuie să comute o lampă de curent alternativ (încărcare) atunci când semnalul Bluetooth este descoperit sau pierdut. Pentru a comuta această încărcare vom folosi un releu și, deoarece pinii GPIO ai ESP32 sunt compatibili doar cu 3,3 V, avem nevoie de un modul de releu care poate fi comandat cu 3,3 V. Verificați ce tranzistor este utilizat în modulul de releu, dacă este BC548, sunteți bine să mergeți altfel, construiți-vă propriul circuit urmând schema de circuit de mai jos.
Avertisment: Circuitul se ocupă de tensiunea de rețea directă de 220V AC. Aveți grijă cu firele sub tensiune și asigurați-vă că nu creați un scurtcircuit. Ai fost avertizat.
Motivul pentru care se folosește BC548 peste BC547 sau 2N2222 este că au o tensiune scăzută a emițătorului de bază, care poate fi declanșată cu doar 3,3V. Releul folosit aici este un releu de 5V, asa ca l - am putere cu Vin pini care primește 5V formează cablul de alimentare. Știftul de masă este conectat la pământul circuitului. Rezistorul R1 1K este utilizat ca un rezistor limitator de curent de bază. Firul de fază este conectat la pinul NO al releului și pinul comun al releului este conectat la sarcină, iar celălalt capăt al sarcinii este conectat la neutru. Puteți schimba poziția Fază și Neutru, dar aveți grijă să nu le scurtați direct. Curentul trebuie să treacă întotdeauna prin încărcare (bec).Am folosit un modul de releu pentru a menține lucrurile simple, iar sarcina aici este o lampă cu LED Focus. Configurarea mea arată cam așa mai jos
Dacă doriți să ignorați hardware-ul pentru moment, puteți utiliza pinul GPIO 2 în loc de pinul GPIO 13 pentru a comuta LED-ul integrat pe ESP32. Această metodă este recomandată pentru începători.
Obțineți adresa Bluetooth a serverului (adresa benzii de fitness)
După cum am spus mai devreme, vom programa ESP32 să acționeze ca un client (similar cu telefonul) și să ne conectăm la un server care este banda mea de fitness (Lenovo HW-01). Pentru ca un client să se conecteze la server, acesta trebuie să cunoască adresa Bluetooth a serverului. Fiecare server Bluetooth, precum trupa mea de fitness de aici, are propria adresă Bluetooth unică, care este permanentă. Puteți lega acest lucru de adresa MAC a laptopului sau a telefonului mobil.
Pentru a obține această adresă de pe server, utilizăm aplicația numită nRF connect din semiconductori nordici pe care o folosisem deja pentru tutorialul nostru anterior. Este disponibil gratuit atât pentru utilizatorii IOS, cât și pentru cei de Android. Pur și simplu descărcați, lansați aplicația și căutați dispozitivele Bluetooth din apropiere. Aplicația va lista toate dispozitivele BLE pe care le găsește. Al meu se numește HW-01 pur și simplu uitați-vă sub numele acestuia și veți găsi adresa hardware a serverului așa cum se arată mai jos.
Deci adresa hardware ESP32 BLE a benzii mele de fitness este C7: F0: 69: F0: 68: 81, veți avea un set diferit de numere în același format. Doar notați-o, deoarece vom avea nevoie atunci când programăm ESP32.
Obținerea serviciului și UUID caracteristic serverului
Bine, acum ne-am identificat serverul folosind adresa BLE, dar pentru a comunica cu aceasta trebuie să vorbim limba serviciului și caracteristicile, pe care le-ați înțelege dacă ați fi citit tutorialul anterior. În acest tutorial folosesc caracteristica de scriere a serverului meu (banda de fitness) pentru a se asocia cu acesta. Deci, pentru asocierea cu dispozitivul, avem nevoie de UUID caracteristic anunț de serviciu, pe care îl putem obține din nou cu aceeași aplicație.
Doar faceți clic pe butonul de conectare al aplicației dvs. și căutați câteva caracteristici de scriere, unde aplicația va afișa UUID-ul serviciului și UUID-ul caracteristic. Al meu este prezentat mai jos
Aici UUID-ul meu de serviciu și UUID-ul caracteristic sunt aceleași, dar nu trebuie să fie la fel. Notați UUID-ul serverului dvs. Al meu a fost notat ca.
UUID serviciu: 0000fee7-0000-1000-8000-00805f9b34fb UUID caracteristic: 0000fee7-0000-1000-8000-00805f9b34fb
Nu este obligatoriu să utilizați caracteristicile de scriere; puteți utiliza orice serviciu valid și UUID caracteristic serverului care este afișat în aplicație.
Programarea ESP32 să acționeze ca un client pentru aplicația de comutare de proximitate
Ideea programului este de a face ESP32 să acționeze ca un client care continuă să caute dispozitive Bluetooth atunci când găsește serverul nostru (banda de fitness), verifică ID-ul hardware și va comuta lumina prin pinul GPIO 13. Ei bine, bine! !, dar există o problemă cu asta. Toate serverele BLE vor avea o rază de acțiune de 10 metri, ceea ce este puțin prea mult. Deci, dacă încercăm să facem comutatorul de proximitate pentru a aprinde lumina unei uși deschise, această gamă este foarte mare.
Pentru a reduce raza de acțiune a serverului BLE putem folosi opțiunea de asociere. Un server și client BLE vor rămâne împerecheați numai dacă ambii se află la o distanță de 3-4 metri. Este perfect pentru aplicația noastră. Deci, facem ESP32 nu numai pentru a descoperi serverul BLE, ci și pentru a ne conecta la acesta și pentru a ne asigura că rămâne asociat. Atâta timp cât sunt împerecheați, lampa AC va rămâne aprinsă, când intervalul depășește împerecherea se va pierde și lampa va fi stinsă. Exemplul de program ESP32 BLE complet pentru a face același lucru este dat la sfârșitul acestei pagini. Mai jos, voi împărți codul în fragmente mici și voi încerca să le explic.
După includerea fișierului antet, informăm ESP32 despre adresa BLE, Serviciu și UUID caracteristic pe care le-am obținut prin aplicația de conectare nRF așa cum s-a explicat în titlurile de mai sus. Codul arată ca mai jos
statică BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID de serviciu pentru fitnessband obținut prin aplicația nRF connect static BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID caracteristic pentru fitnessband obținut prin aplicația de conectare nRF String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hardware Bluetooth MAC al fitnessband-ului meu , va varia pentru fiecare bandă obținută prin aplicația de conectare nRF
Urmată de aceasta în program, avem connectToserver și MyAdvertisedDeviceCallback la care vom reveni mai târziu. Apoi, în interiorul funcției de configurare , inițializăm monitorul serial și realizăm BLE pe ESP pentru a scana dispozitivul. După finalizarea scanării pentru fiecare dispozitiv BLE descoperit, se numește funcția MyAdvertisedDeviceCallbacks .
De asemenea, activăm scanarea activă, deoarece alimentăm ESP32 cu rețea, pentru utilizarea bateriei este oprit pentru a reduce consumul curent. Pinul de declanșare a releuului este conectat la GPIO 13 din hardware-ul nostru, deci declarăm și pinul GPIO 13 ca ieșire.
void setup () { Serial.begin (115200); // Porniți monitorul serial Serial.println („programul ESP32 BLE Server”); // Mesaj introductiv BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // creați o nouă scanare pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Apelați clasa definită mai sus pBLEScan-> setActiveScan (adevărat); // scanarea activă folosește mai multă putere, dar obține rezultate mai rapide pinMode (13, OUTPUT); // Declarați pinul LED încorporat ca ieșire }
În cadrul funcției MyAdvertisedDeviceCallbacks , imprimăm o linie care va lista numele și alte informații ale dispozitivelor BLE care au fost descoperite. Avem nevoie de ID-ul hardware al dispozitivului BLE care a fost descoperit, astfel încât să-l putem compara cu cel dorit. Deci , folosim variabila Server_BLE_Address pentru a obține adresa dispozitivului și apoi pentru a o converti de la tipul BLEAddress în șir.
clasa MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Rezultat scanare:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = new BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
În interiorul funcției buclă , scanăm timp de 3 secunde și punem rezultatul în foundDevices, care este un obiect din BLEScanResults. Dacă găsim unul sau mai multe dispozitive prin scanare, începem să verificăm dacă adresa BLE descoperită se potrivește cu cea pe care am introdus-o în program. Dacă potrivirea este pozitivă și dispozitivul nu este împerecheat mai devreme, încercăm să le împerechem folosind funcția connectToserver. De asemenea, am folosit câteva declarații seriale pentru a înțelege scopul.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && pair == false) { Serial.println ("Dispozitiv găsit: -)… conectarea la server ca client"); if (connectToserver (* Server_BLE_Address)) {
În funcția connectToserver facem uz de UUID pentru a se asocia cu serverul BLE (fitness band). Pentru a vă conecta cu un server, ESP32 trebuie să acționeze ca un client, astfel încât să creăm un client utilizând funcția createClient () și apoi să ne conectăm la adresa serverului BLE. Apoi căutăm serviciul și caracteristica folosind valorile UUID și încercăm să ne conectăm la acesta. Când conexiunea are succes, funcția returnează un adevărat și, dacă nu, returnează un fals. Rețineți că nu este obligatoriu să aveți service și UUID caracteristic pentru a se asocia cu un server, se face numai pentru înțelegerea dvs.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Client creat"); // Conectați-vă la serverul BLE. pClient-> connect (pAddress); Serial.println ("- Conectat la fitnessband"); // Obțineți o referință la serviciul pe care îl urmărim în serverul BLE la distanță. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Am găsit serviciul nostru"); întoarcere adevărată; } altfel returnează fals; // Obțineți o referință la caracteristica din serviciul serverului BLE la distanță. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Am găsit caracteristica noastră"); întoarcere adevărată; }
Dacă conexiunea are succes pinul GPIO 13 este ridicat și controlul este trimis în afara buclei utilizând instrucțiunea break. Variabila booleană asociată este, de asemenea, setată ca fiind adevărată.
if (connectToserver (* Server_BLE_Address)) { asociat = adevărat; Serial.println („******************** LED-ul a fost aprins ********************** ** "); digitalWrite (13, HIGH); pauză; }
După ce împerecherea are succes și pinul GPIO este pornit, trebuie să verificăm dacă dispozitivul este încă în raza de acțiune. Deoarece, acum dispozitivul este asociat, serviciul de scanare BLE nu îl va mai putea vedea. O vom regăsi doar atunci când utilizatorul părăsește zona. Deci, trebuie pur și simplu să căutăm serverul BLE și dacă descoperim că trebuie să setăm pinul GPIO la nivel minim, așa cum se arată mai jos
if (Scaned_BLE_Address == My_BLE_Address && pair == true) { Serial. println („Dispozitivul nostru a ieșit din raza de acțiune”); asociat = fals; Serial. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP.restart (); pauză; }
Lucrul și testarea
Odată ce sunteți gata cu programul și configurarea hardware, pur și simplu încărcați codul pe ESP32 și aranjați întreaga configurare așa cum se arată mai jos.
Ar trebui să observați că lampa se aprinde de îndată ce banda de fitness (server) se împerechează cu ESP32. De asemenea, puteți verifica acest lucru observând simbolul conexiunii Bluetooth de pe banda de fitness. Odată asociat, încercați să vă îndepărtați de ESP32 și când traversați 3-4 metri, veți observa că simbolul Bluetooth de pe ceas dispare și conexiunea se pierde. Acum, dacă te uiți la lampă, aceasta se va stinge. Când vă întoarceți înapoi, dispozitivul se împerechează din nou și lumina se aprinde. Funcționarea completă a proiectului poate fi găsită în videoclipul de mai jos.
Sper că ți-a plăcut proiectul și ai învățat ceva nou pe drum. Dacă v-ați confruntat cu vreo problemă în ceea ce privește funcționarea, nu ezitați să postați problema pe forumuri sau chiar în secțiunea de comentarii de mai jos