- Preduvjeti
- Potrebni materijali
- Hardver
- Nabavite svoju Bluetooth adresu poslužitelja (adresa fitness grupe)
- Dobivanje usluge i karakterističnog UUID-a poslužitelja
- Programiranje ESP32 da djeluje kao klijent za Proximity Switch Application
- Rad i ispitivanje
Kako je cool automatski paliti svjetla čim uđete u svoj dom i ponovno ga gasiti kad odlazite! Da, to može učiniti jednostavna aplikacija. Ovdje ćemo u ovom projektu koristiti ESP32 kao BLE klijenta, a fitnes bend kao BLE poslužitelj, pa kad god osoba koja nosi fitnes traku dođe u domet ESP32 Bluetootha, ESP32 to prepozna i uključi svjetlo. Bilo koji Bluetooth uređaji koji imaju mogućnosti BLE poslužitelja mogu se koristiti kao okidački uređaj za upravljanje bilo kojim kućanskim uređajem pomoću ESP32.
Već smo istražili BLE (Bluetooth Low Energy) funkcionalnosti ESP32 modula i prilično sam oduševljen njime. Da rezimiramo, ovaj modul ima klasični Bluetooth i Bluetooth Low Energy (BLE), klasični Bluetooth se može koristiti za prijenos pjesama ili datoteka, a BLE opcija može se koristiti za aplikacije optimizirane za bateriju poput Bluetooth svjetionika, fitnes bendova, blizine, itd. Također ga je moguće koristiti kao serijski Bluetooth poput HC-05 ili HC-06 modula za jednostavne projekte mikrokontrolera.
Kao što znate, ESP32 BLE može raditi u dva različita načina. Jedan je način poslužitelja o kojem smo već razgovarali korištenjem usluge GATT za oponašanje usluge indikatora razine napunjenosti baterije. U toj je vježbi ESP32 djelovao kao poslužitelj, a naš mobitel kao klijent. Dopustite nam sada da radimo s ESP32 kao klijent i pokušajmo ga povezati s drugim BLE poslužiteljima poput mog fitnes benda.
Svi BLE poslužitelji, uključujući moj fitness bend, u stalnom su načinu oglašavanja, odnosno uvijek ih mogu otkriti kada ih klijent skenira. Iskorištavanjem ove značajke ove fitnes bendove možemo koristiti kao blizinski prekidač, što znači da su ovi fitnes bendovi uvijek vezani za ruku korisnika i skeniranjem trake možemo otkriti je li osoba u dometu. To je upravo ono što ćemo učiniti u ovom članku. Mi ćemo programirati ESP32 djelovati kao ble klijenta i stalno držati skeniranje za ble uređaje; ako pronađemo fitness opseg u dosegu, pokušat ćemo se povezati s njim i ako je veza uspješna, možemo pokrenuti žarulju prebacivanjem jedne od GPIO pinova na ESP32. Metoda je pouzdana jer svaki BLE poslužitelj(fitness band) imat će jedinstveni hardverski ID, tako da niti jedan BLE poslužiteljski uređaj neće biti identičan. Zanimljivo zar ne? !!! Ajmo sad graditi
Preduvjeti
U ovom članku pretpostavljam da ste već upoznati s načinom korištenja ESP32 ploče s Arduino IDE-om, ako se ne vratite na početak rada s ESP32 uputstvom.
Kompletni ESP32 Bluetooth podijelili smo u tri segmenta radi lakšeg razumijevanja. Stoga je preporučljivo proći prva dva vodiča prije nego što započnete s ovim.
- Serijski Bluetooth na ESP32 koji prebacuje LED s mobitela
- BLE poslužitelj za slanje podataka o razini baterije na mobitel pomoću usluge GATT
- BLE klijent za skeniranje BLE uređaja i ponašanje kao svjetionik.
Već smo obradili prva dva tutorijala, ovdje nastavljamo s posljednjim kako bismo objasnili ESP32 kao BLE klijent.
Potrebni materijali
- ESP32 odbor za razvoj
- AC opterećenje (žarulja)
- Modul releja
Hardver
Hardver za ovaj projekt ESP32 BLE klijenta prilično je običan jer se većina čarolije događa unutar koda. ESP32 mora uključiti žarulju izmjenične struje (Load) kada se Bluetooth signal otkrije ili izgubi. Za prebacivanje ovog opterećenja koristit ćemo relej, a budući da su GPIO pinovi ESP32 kompatibilni samo 3,3 V, potreban nam je relejni modul koji se može pokretati s 3,3 v. Samo provjerite koji se tranzistor koristi u relejnom modulu ako je BC548, dobro je krenuti u suprotnom, izraditi vlastiti sklop slijedeći donji dijagram.

Upozorenje: Krug se bavi izravnim mrežnim naponom od 220 V. Budite oprezni sa žicama pod naponom i pazite da ne napravite kratki spoj. Upozoren si.
Razlog iza kojeg se koristi BC548 preko BC547 ili 2N2222 je taj što imaju nizak napon baznog emitora koji se može pokrenuti sa samo 3,3 V. Ovdje korišteni relej je 5V relej, pa ga napajamo Vin-pinom koji dobiva 5V iz kabela za napajanje. Osovinski uzemljivač spojen je na masu kruga. Otpornik R1 1K se koristi kao baza za ograničavanje danu otpornik. Fazna žica je spojena na NO-pin releja, a zajednički pin releja na teret, a drugi kraj opterećenja na Neutral. Možete zamijeniti položaj Faze i Neutralno, ali pripazite da ih ne izravno skratite. Struja uvijek treba prolaziti kroz opterećenje (žarulju).Koristio sam modul releja kako bih olakšao stvari, a ovdje je opterećenje LED žarulja Focus. Moja postavka izgleda otprilike ovako u nastavku

Ako za sada želite preskočiti hardver, možete upotrijebiti GPIO 2 pin umjesto GPIO 13 pin za prebacivanje ugrađene LED na ESP32. Ova se metoda preporučuje za početnike.
Nabavite svoju Bluetooth adresu poslužitelja (adresa fitness grupe)
Kao što je ranije rečeno, programirat ćemo ESP32 da djeluje kao klijent (slično telefonu) i povezati se s poslužiteljem koji je moj fitnes (Lenovo HW-01). Da bi se klijent povezao s poslužiteljem, mora znati Bluetooth adresu poslužitelja. Svaki Bluetooth poslužitelj, kao što je moj fitness bend ovdje, ima svoju jedinstvenu Bluetooth adresu koja je trajna. To možete povezati s MAC adresom svog prijenosnog računala ili mobitela.
Da bismo ovu adresu dobili s poslužitelja, koristimo aplikaciju zvanu nRF connect iz nordijskih poluvodiča koju smo već koristili za naš prethodni vodič. Dostupan je besplatno i za IOS i za Android korisnike. Jednostavno preuzmite, pokrenite aplikaciju i potražite Bluetooth uređaje u blizini. Aplikacija će navesti sve BLE uređaje koje pronađe. Moj se zove HW-01, jednostavno pogledajte ispod njegovog naziva i pronaći ćete hardversku adresu poslužitelja kao što je prikazano dolje.

Dakle, hardverska adresa ESP32 BLE mog fitnes benda je C7: F0: 69: F0: 68: 81, imat ćete drugačiji skup brojeva u istom formatu. Samo ga zabilježite jer će nam trebati kad programiramo naš ESP32.
Dobivanje usluge i karakterističnog UUID-a poslužitelja
Dobro, sada smo identificirali naš poslužitelj pomoću BLE adrese, ali da bismo s njim komunicirali, moramo govoriti jezikom usluge i karakteristikama, koje biste razumjeli da ste pročitali prethodni vodič. U ovom uputstvu koristim karakteristiku pisanja svog poslužitelja (fitness grupe) da bih se upario s njim. Dakle, za uparivanje s uređajem potreban nam je uslužni oglas Karakteristični UUID koji možemo ponovno dobiti s istom aplikacijom.
Samo kliknite gumb za povezivanje na svojoj aplikaciji i potražite neke karakteristike upisa, gdje će aplikacija prikazati uslugu UUID i karakteristiku UUID. Moja je prikazana u nastavku

Ovdje su moj UUID usluge i Karakteristični UUID isti, ali ne moraju biti isti. Zabilježite UUID vašeg poslužitelja. Moja je zabilježena kao
UUID usluge: 0000fee7-0000-1000-8000-00805f9b34fb Karakteristični UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Nije obvezno koristiti karakteristike zapisivanja; možete koristiti bilo koju valjanu uslugu i karakteristični UUID poslužitelja koji je prikazan u aplikaciji.
Programiranje ESP32 da djeluje kao klijent za Proximity Switch Application
Ideja programa je natjerati ESP32 da djeluje kao klijent koji neprestano skenira Bluetooth uređaje kada pronađe naš poslužitelj (fitnes bend), provjeri hardverski ID i prebacit će svjetlo kroz GPIO pin 13. Pa dobro! !, ali s tim postoji jedan problem. Svi BLE poslužitelji imat će domet od 10 metara, što je malo previše. Dakle, ako pokušavamo napraviti blizinski prekidač za uključivanje svjetla otvorenih vrata, ovaj domet je vrlo velik.
Da bismo smanjili domet BLE poslužitelja, možemo koristiti opciju uparivanja. BLE poslužitelj i klijent ostat će upareni samo ako su oba na udaljenosti od 3-4 metra. To je savršeno za našu aplikaciju. Dakle, napravimo ESP32 ne samo da otkrije BLE poslužitelj već i da se povežemo s njim i provjerimo ostaje li uparen. Sve dok su upareni, lampica naizmjenične struje ostat će uključena, kad doseg premaši uparenost, izgubit će se i žarulja će se ugasiti. Kompletni primjer programa ESP32 BLE koji to čini naveden je na kraju ove stranice. Ovdje ću razbiti kôd na male isječke i pokušati ih objasniti.
Nakon uključivanja datoteke zaglavlja, obavještavamo ESP32 o BLE adresi, usluzi i karakterističnom UUID-u koje smo dobili putem aplikacije nRF connect kako je objašnjeno u gornjim naslovima. Kod izgleda kao dolje
statički BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID usluge fitness bandera dobiven putem statičkog BLEUUID charUUID aplikacije nRF connect ("0000fee7-0000-1000-8000-00805f9b34fb"); // Karakteristični UUID fitness trake dobiven putem aplikacije nRF connect String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hardverski Bluetooth MAC mog fitness banda varirat će za svaki opseg dobiven putem aplikacije nRF connect
Slijedi da u programu imamo connectToserver i MyAdvertisedDeviceCallback koje ćemo se vratiti kasnije. Zatim unutar postavljanje funkcije, mi inicijalizirati serijski monitor i čine BLE na ESP za skeniranje uređaja. Nakon završetka skeniranja za svaki otkriveni BLE uređaj poziva se funkcija MyAdvertisedDeviceCallbacks .
Također omogućiti aktivno skeniranje jer smo se napajanje ESP32 s mains power, za primjenu baterije je isključen kako bi se smanjila potrošnja struje. Okidački relejski relej povezan je s GPIO 13 u našem hardveru, pa također izjavljujemo da je GPIO pin 13 izlazni.
void setup () { Serial.begin (115200); // Pokreni serijski monitor Serial.println ("ESP32 BLE Server program"); // Uvodna poruka BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // stvorimo novi skenirani pBLEScan-> setAdvertisedDeviceCallbacks (novi MyAdvertisedDeviceCallbacks ()); // Pozovimo klasu koja je gore definirana pBLEScan-> setActiveScan (true); // aktivno skeniranje troši više energije, ali brže postiže rezultate pinMode (13, IZLAZ); // Deklarisanje ugrađenog LED pina kao izlaza }
Unutar funkcije MyAdvertisedDeviceCallbacks ispisujemo redak u kojem će se nalaziti ime i druge informacije o otkrivenim BLE uređajima. Potreban nam je hardverski ID BLE uređaja koji je otkriven kako bismo ga mogli usporediti sa željenim. Dakle , koristimo varijablu Server_BLE_Address za dobivanje adrese uređaja, a zatim i za pretvaranje iz tipa BLEAddress u string.
klasa MyAdvertisedDeviceCallbacks: javni BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Rezultat skeniranja:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = nova BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Unutar funkcije petlje skeniramo 3 sekunde i nalaz stavljamo u foundDevices koji je objekt iz BLEScanResults. Ako skeniranjem pronađemo jedan ili više uređaja, počinjemo provjeravati podudara li se otkrivena BLE adresa s onom koju smo unijeli u program. Ako je podudaranje pozitivno i uređaj nije ranije uparen, pokušavamo se rastaviti s njim pomoću funkcije connectToserver. Također smo upotrijebili nekoliko serijskih izjava radi razumijevanja.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Pronađen uređaj: -)… povezivanje s poslužiteljem kao klijentom"); if (connectToserver (* Server_BLE_Address)) {
Unutar funkcije connectToserver koristimo UUID za uparivanje s BLE poslužiteljem (fitness bend). Da bi se povezao s poslužiteljem, ESP32 mora djelovati kao klijent, pa kreiramo klijenta pomoću funkcije createClient (), a zatim se povezujemo s adresom BLE poslužitelja. Zatim tražimo uslugu i karakteristike pomoću UUID vrijednosti i pokušavamo se povezati s njom. Kada je veza uspješna, funkcija vraća true, a ako ne vraća false. Imajte na umu da nije obavezno imati uslugu i karakteristični UUID za uparivanje s poslužiteljem, to se radi samo radi vašeg razumijevanja.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Izrađen klijent"); // Povezivanje s BLE poslužiteljem. pClient-> connect (pAddress); Serial.println ("- povezan s fitnessbandom"); // Dobiti referencu na uslugu koju tražimo na udaljenom BLE poslužitelju. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Pronašli smo našu uslugu"); povratak istinit; } else return false; // Dobivanje reference na karakteristiku u usluzi udaljenog BLE poslužitelja. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr ) Serial.println ("- Pronađena je naša karakteristika"); povratak istinit; }
Ako je veza uspješna, GPIO pin 13 je postavljen visoko i kontrola se šalje izvan petlje pomoću izraza prekida. Booleova varijabla uparena također je postavljena na true.
if (connectToserver (* Server_BLE_Address)) { upareno = true; Serial.println ("LED ******************** Uključena ********************** ** "); digitalWrite (13, VISOKO); pauza; }
Nakon uspješnog uparivanja i uključivanja GPIO pina moramo provjeriti je li uređaj još uvijek u dometu. Budući da je uređaj sada uparen, usluga skeniranja BLE više ga neće moći vidjeti. Ponovno ćemo ga pronaći tek kad korisnik napusti područje. Dakle, jednostavno moramo potražiti BLE poslužitelj i ako otkrijemo, moramo GPIO pin postaviti na nizak nivo kao što je prikazano u nastavku
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serijski. println ("Naš je uređaj izašao iz dometa"); upareno = lažno; Serijski. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP.restart (); pauza; }
Rad i ispitivanje
Kad ste spremni s programom i hardverskom postavkom, jednostavno prenesite kôd na ESP32 i složite cijelu postavku kako je prikazano u nastavku.

Trebali biste primijetiti da se lampica uključuje čim se fitnes bend (poslužitelj) upari s ESP32. To možete provjeriti i tako što ćete primijetiti vezu Bluetooth simbola na fitnes traci. Jednom kad se uparite, pokušajte se udaljiti od ESP32 i kad prijeđete 3-4 metra primijetit ćete da Bluetooth simbol na satu nestaje i veza se gubi. Ako pogledate lampu, ugasit će se. Kada se vratite, uređaj se ponovno upari i lampica se uključi. Kompletni rad projekta nalazi se u video zapisu ispod.
Nadam se da ste uživali u projektu i usput naučili nešto novo. Ako ste se suočili s bilo kakvim problemom u pokretanju, slobodno objavite problem na forumima ili čak u odjeljku za komentare u nastavku
