- Predpogoji
- Potrebni materiali
- Strojna oprema
- Pridobite svoj Bluetooth naslov strežnika (naslov fitnes pasu)
- Pridobivanje storitve in značilnega UUID strežnika
- Programiranje ESP32, da deluje kot odjemalec aplikacije Proximity Switch
- Delo in preizkušanje
Kako kul je, če samodejno vklopite luči takoj, ko vstopite v svoj dom in ga ob odhodu spet ugasnete! Da, preprosta aplikacija lahko to stori namesto vas. V tem projektu bomo uporabili ESP32 kot odjemalca BLE in fitnes pas kot strežnik BLE, tako da kadar koli oseba, ki nosi fitnes pas, pride v domet ESP32 Bluetooth, ga ESP32 zazna in vklopi luč. Vse naprave Bluetooth, ki imajo zmogljivosti strežnika BLE, se lahko uporabljajo kot sprožilna naprava za nadzor katere koli gospodinjske naprave z uporabo ESP32.
Funkcije modula ESP32 smo že raziskali BLE (Bluetooth Low Energy) in nad tem sem zelo navdušen. Za povzetek ima ta modul klasični Bluetooth in Bluetooth Low Energy (BLE), klasični Bluetooth se lahko uporablja za prenos pesmi ali datotek, možnost BLE pa za aplikacije, optimizirane za baterijo, kot so Bluetooth svetilniki, fitnes pasovi, bližina s. itd. Lahko ga uporabite tudi kot serijski Bluetooth, kot so moduli HC-05 ali HC-06, za preproste projekte mikrokrmilnikov.
Kot veste, lahko ESP32 BLE deluje v dveh različnih načinih. Eden je strežniški način, o katerem smo že razpravljali z uporabo storitve GATT za posnemanje storitve indikatorja napolnjenosti baterije. Pri tej vaji je ESP32 deloval kot strežnik, naš mobilni telefon pa kot odjemalec. Zdaj pa uporabimo ESP32 kot odjemalec in ga poskusimo povezati z drugimi strežniki BLE, kot je moj fitnes pas.
Vsi strežniki BLE, vključno z mojim fitnes pasom, so v stalnem načinu oglaševanja, kar pomeni, da jih stranka vedno lahko odkrije, ko jih skenira. Z izkoriščanjem te funkcije lahko te fitnes pasove uporabimo kot bližinsko stikalo, kar pomeni, da so ti fitnes pasovi vedno privezani na roko uporabnika in s skeniranjem pasu lahko zaznamo, ali je oseba v dosegu. Prav to bomo storili v tem članku. ESP32 bomo programirali tako, da bo deloval kot odjemalec BLE in nenehno pregledoval naprave BLE; če najdemo fitnes pas v dosegu, ga bomo poskusili povezati in če je povezava uspešna, lahko sprožimo žarnico tako, da preklopimo enega od zatičev GPIO na ESP32. Metoda je zanesljiva, ker vsak strežnik BLE(fitnes pas) bo imel edinstven ID strojne opreme, zato nobena strežniška naprava BLE ne bo enaka. Zanimivo kajne? !!! Zdaj pa pojdimo na gradnjo
Predpogoji
V tem članku predvidevam, da ste že seznanjeni s tem, kako uporabljati ploščo ESP32 z Arduino IDE, če se ne vrnete na začetek uporabe vadnice ESP32.
Za lažje razumevanje smo celoten ESP32 Bluetooth razdelili na tri segmente. Zato je priporočljivo, da pred začetkom s tem preberete prva dva vodiča.
- Serijski Bluetooth na ESP32, ki preklaplja LED z mobilnega telefona
- BLE strežnik za pošiljanje podatkov o nivoju baterije na mobilni telefon s storitvijo GATT
- BLE odjemalec za iskanje naprav BLE in delovanje kot svetilnik.
Prvi dve vadnici smo že obravnavali, tu nadaljujemo z zadnjo, da pojasnimo ESP32 kot odjemalca BLE.
Potrebni materiali
- Odbor za razvoj ESP32
- AC obremenitev (žarnica)
- Relejni modul
Strojna oprema
Strojna oprema za ta projekt ESP32 BLE Client je precej navadna, saj se večina čarovnije zgodi znotraj kode. ESP32 mora preklopiti AC žarnico (Load), ko je signal Bluetooth odkrit ali izgubljen. Za preklop te obremenitve bomo uporabili rele, in ker so zatiči GPIO ESP32 združljivi le s 3,3 V, potrebujemo relejni modul, ki ga lahko poganjamo s 3,3 v. Samo preverite, kateri tranzistor se uporablja v modulu Rele, če je BC548, priporočamo, da si sami ustvarite svoje vezje, tako da sledite spodnjemu vezju.
Opozorilo: Vezje obravnava neposredno napetost 220 V AC. Bodite previdni pri žicah pod napetostjo in poskrbite, da ne boste ustvarili kratkega stika. Bili ste opozorjeni.
Razlog za uporabo BC548 nad BC547 ali 2N2222 je, da imajo nizko napetost osnovnega oddajnika, ki jo je mogoče sprožiti s samo 3,3 V. Tu uporabljeni rele je 5V rele, zato ga napajamo z Vin pin, ki dobi 5V iz napajalnega kabla. Ozemljitveni zatič je povezan z maso vezja. Upor R1 1K se uporablja kot osnovna tokovnega omejevala upor. Fazna žica je priključena na NO zatič releja, skupni zatič releja pa na obremenitev, drugi konec obremenitve pa na nevtralno. Položaj faze in nevtralnosti lahko zamenjate, vendar pazite, da jih ne boste neposredno skrajšali. Tok mora vedno teči skozi obremenitev (žarnica).Za poenostavitev stvari sem uporabil modul releja, tu pa je obremenitev LED žarnica Focus. Moja postavitev je videti nekako takole spodaj
Če želite za zdaj preskočiti strojno opremo, lahko za vklop vgrajene LED diode na ESP32 namesto na pin GPIO 13 uporabite pin GPIO 2. Ta metoda je priporočljiva za začetnike.
Pridobite svoj Bluetooth naslov strežnika (naslov fitnes pasu)
Kot smo že povedali, bomo ESP32 programirali tako, da deluje kot odjemalec (podobno kot telefon) in se povežem s strežnikom, ki je moj fitnes (Lenovo HW-01). Da se odjemalec lahko poveže s strežnikom, mora poznati naslov strežnika Bluetooth. Vsak strežnik Bluetooth, kot je moj fitnes tukaj, ima svoj edinstven naslov Bluetooth, ki je stalen. To lahko povežete z naslovom MAC vašega prenosnika ali mobilnega telefona.
Za pridobitev tega naslova s strežnika uporabljamo aplikacijo, imenovano nRF connect, iz nordijskih polprevodnikov, ki smo jo že uporabili v prejšnji vadnici. Za uporabnike IOS in Android je na voljo brezplačno. Preprosto prenesite, zaženite aplikacijo in poiščite naprave Bluetooth v bližini. Aplikacija bo navedla vse naprave BLE, ki jih najde. Moj se imenuje HW-01, preprosto poglejte pod njegovo ime in našli boste naslov strojne opreme strežnika, kot je prikazano spodaj.
Torej, naslov strojne opreme ESP32 BLE mojega fitnes pasu je C7: F0: 69: F0: 68: 81, v isti obliki boste imeli drugačen nabor številk. Samo zapišite si to, saj bomo potrebovali, ko bomo programirali naš ESP32.
Pridobivanje storitve in značilnega UUID strežnika
V redu, zdaj smo naš strežnik prepoznali z uporabo naslova BLE, vendar moramo za komunikacijo z njim govoriti jezik storitve in značilnosti, ki bi jih razumeli, če bi prebrali prejšnjo vadnico. V tej vadnici uporabljam značilnost pisanja mojega strežnika (fitnes pasu), da se seznanim z njim. Torej za seznanjanje z napravo potrebujemo servisni oglas Karakteristični UUID, ki ga lahko znova dobimo z isto aplikacijo.
Preprosto kliknite gumb za povezavo na vaši aplikaciji in poiščite nekatere značilnosti pisanja, kjer bo aplikacija prikazala storitev UUID in značilnost UUID. Moja je prikazana spodaj
Tu sta moj UUID storitve in UUID značilnosti enaka, vendar ni nujno, da sta enaka. Zapišite si UUID vašega strežnika. Moj je bil zapisan kot
UUID storitve: 0000fee7-0000-1000-8000-00805f9b34fb Značilni UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Uporaba lastnosti zapisovanja ni obvezna; lahko uporabite katero koli veljavno storitev in značilni UUID strežnika, ki je prikazan v aplikaciji.
Programiranje ESP32, da deluje kot odjemalec aplikacije Proximity Switch
Ideja programa je, da ESP32 deluje kot odjemalec, ki nenehno išče naprave Bluetooth, ko najde naš strežnik (fitnes pas), preveri ID strojne opreme in preklopi luč skozi zatič GPIO 13. No, v redu! !, toda s tem obstaja en problem. Vsi strežniki BLE bodo imeli doseg 10 metrov, kar je nekoliko preveč. Torej, če poskušamo narediti bližino, da prižgemo luč odprtih vrat, je ta razpon zelo velik.
Za zmanjšanje dometa strežnika BLE lahko uporabimo možnost seznanjanja. BLE strežnik in odjemalec ostaneta seznanjena le, če sta oba na razdalji 3-4 metra. To je kot nalašč za našo aplikacijo. Torej, ESP32 naredimo ne samo za odkrivanje strežnika BLE, temveč tudi za povezavo z njim in preverjanje, ali ostaja seznanjen. Dokler sta seznanjena, bo AC lučka ostala prižgana, ko bo doseg presežen, se izgubi in lučka ugasne. Na koncu te strani je podan celoten primer programa ESP32 BLE, ki stori enako. Spodaj bom razdelil kodo na majhne delčke in jih poskusil razložiti.
Po vključitvi datoteke glave ESP32 obvestimo o naslovu BLE, storitvi in značilnem UUID, ki smo ga dobili s pomočjo aplikacije nRF connect, kot je razloženo v zgornjih naslovih. Koda je videti spodaj
statični BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // storitveni UUID fitnes pasu, pridobljen prek statičnega BLEUUID charUUID aplikacije nRF connect ("0000fee7-0000-1000-8000-00805f9b34fb"); // Značilni UUID fitnes pasu, pridobljenega prek aplikacije nRF connect String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Strojna oprema Bluetooth MAC mojega fitnes pasu se bo razlikoval za vsak pas, pridobljen z aplikacijo nRF connect
Sledi temu, da imamo v programu connectToserver in MyAdvertisedDeviceCallback, na katera se bomo vrnili kasneje. Nato v nastavitveni funkciji inicializiramo serijski monitor in naredimo BLE na ESP za iskanje naprave. Po končanem skeniranju za vsako odkrito napravo BLE se pokliče funkcija MyAdvertisedDeviceCallbacks .
Omogočamo tudi aktivno skeniranje, saj napajamo ESP32 z omrežnim napajanjem, pri uporabi baterije pa je izklopljen, da zmanjšamo trenutno porabo. Sprožilni zatič releja je v naši strojni opremi povezan z GPIO 13, zato prav tako izjavljamo, da je zatič GPIO 13 kot izhod.
void setup () { Serial.begin (115200); // Zaženi serijski monitor Serial.println ("Strežniški program ESP32 BLE"); // uvodno sporočilo BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // ustvarimo novo optično branje pBLEScan-> setAdvertisedDeviceCallbacks (novo MyAdvertisedDeviceCallbacks ()); // Pokliči razred, ki je definiran zgoraj pBLEScan-> setActiveScan (true); // aktivno skeniranje porabi več energije, vendar hitreje dosežemo rezultate pinMode (13, IZHOD); // Razglasite vgrajeni LED pin kot izhod }
Znotraj funkcije MyAdvertisedDeviceCallbacks natisnemo vrstico, v kateri bodo navedena imena in druge informacije o odkritih napravah BLE. Potrebujemo ID strojne opreme odkrite naprave BLE, da jo lahko primerjamo z želeno. Torej s spremenljivko Server_BLE_Address dobimo naslov naprave in nato tudi pretvorimo iz vrste BLEAddress v niz.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Rezultat skeniranja:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = nov BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Znotraj funkcije zanke skeniramo 3 sekunde in rezultat vstavimo v datoteko foundDevices, ki je predmet BLEScanResults. Če s skeniranjem najdemo eno ali več naprav, začnemo preverjati, ali se odkriti naslov BLE ujema z naslovom, ki smo ga vnesli v program. Če je ujemanje pozitivno in naprava ni prej seznanjena, se poskusimo z njo ločiti s funkcijo connectToserver. Za razumevanje smo uporabili tudi nekaj serijskih izjav.
medtem ko (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Najdena naprava: -)… povezovanje s strežnikom kot odjemalec"); če (connectToserver (* Server_BLE_Address)) {
Znotraj funkcije connectToserver uporabljamo UUID za povezovanje s strežnikom BLE (fitnes pas). Za povezavo s strežnikom mora ESP32 delovati kot odjemalec, zato odjemalca ustvarimo s funkcijo createClient () in nato povežemo z naslovom strežnika BLE. Nato z vrednostmi UUID iščemo storitev in značilnost ter se poskusimo povezati z njo. Ko je povezava uspešna, funkcija vrne true, v nasprotnem primeru pa false. Upoštevajte, da za seznanjanje s strežnikom ni obvezno imeti storitve in značilnega UUID-a, to je potrebno samo za vaše razumevanje.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Ustvarjen odjemalec"); // Povežite se s strežnikom BLE. pClient-> connect (pAddress); Serial.println ("- povezan s fitnes trakom"); // Pridobite sklic na storitev, ki jo iščemo v oddaljenem strežniku BLE. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- našel našo storitev"); vrni res; } else vrne false; // Pridobite sklic na značilnost v storitvi oddaljenega strežnika BLE. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- našel našo značilnost"); vrni res; }
Če je povezava uspešna, se GPIO pin 13 postavi visoko in nadzor se pošlje zunaj zanke z uporabo stavka break. Ložena spremenljivka seznanjena je prav tako nastavljena na true.
če (connectToserver (* Server_BLE_Address)) { seznanjeno = res; Serial.println ("******************** LED je vklopljena ********************** ** "); digitalWrite (13, VISOKO); odmor; }
Ko je seznanjanje uspešno in je vklopljen zatič GPIO, moramo preveriti, ali je naprava še vedno v dosegu. Ker je naprava zdaj seznanjena, jo storitev za optično branje ne bo mogla več videti. Ponovno ga bomo našli šele, ko uporabnik zapusti območje. Torej moramo preprosto poiskati strežnik BLE in če odkrijemo, moramo GPIO pin nastaviti na nizko, kot je prikazano spodaj
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serial. println ("Naša naprava je izven dosega"); seznanjeno = napačno; Serijski. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP.restart (); odmor; }
Delo in preizkušanje
Ko ste pripravljeni na program in nastavitev strojne opreme, preprosto naložite kodo v ESP32 in uredite celotno nastavitev, kot je prikazano spodaj.
Lučko bi morali opaziti, ko se fitnes pas (strežnik) poveže z ESP32. To lahko preverite tudi tako, da na fitnes pasu opazite simbol povezave Bluetooth. Ko se seznanite, se poskusite oddaljiti od ESP32 in ko prestopite 3-4 metre, boste opazili, da simbol Bluetooth na uri izgine in povezava izgubi. Če pogledate svetilko, bo ugasnila. Ko se vrnete nazaj, se naprava ponovno seznani in lučka se prižge. Celotno delovanje projekta najdete v spodnjem videoposnetku.
Upam, da ste uživali v projektu in se med potjo naučili kaj novega. Če ste naleteli na kakršno koli težavo pri delovanju, jo lahko objavite na forumih ali celo v spodnjem oddelku za komentarje