- Išankstiniai reikalavimai
- Reikalingos medžiagos
- Aparatinė įranga
- Gaukite „Bluetooth“ serverio adresą (fitneso juostos adresą)
- Serverio paslaugos ir būdingo UUID gavimas
- ESP32 programavimas veikia kaip „Proximity Switch“ programos klientas
- Darbas ir testavimas
Kaip šaunu būtų automatiškai įjungti šviesas, kai tik įeini į savo namus, ir vėl ją išjungti, kai išeini! Taip, paprasta programa gali tai padaryti už jus. Šiame projekte mes naudosime ESP32 kaip BLE klientą ir kūno rengybos juostą kaip BLE serverį, todėl kiekvieną kartą, kai fitneso juostą nešiojantis asmuo patenka į ESP32 „Bluetooth“ diapazoną, ESP32 jį aptinka ir įjungia šviesą. Bet kokie „Bluetooth“ įrenginiai, turintys BLE serverio galimybes, gali būti naudojami kaip įjungimo įtaisas, norint valdyti bet kokį buitinį prietaisą naudojant ESP32.
Mes jau išnagrinėjome ESP32 modulio BLE („Bluetooth Low Energy“) funkcijas ir esu labai sujaudintas. Apibendrinant, šiame modulyje yra tiek klasikinis „Bluetooth“, tiek „Bluetooth Low Energy“ (BLE), klasikinis „Bluetooth“ gali būti naudojamas dainoms ar failams perduoti, o „BLE“ parinktis gali būti naudojama akumuliatoriui optimizuotoms programoms, tokioms kaip „Bluetooth“ švyturiai, kūno rengybos juostos, artumo s Taip pat galima naudoti kaip nuoseklią „Bluetooth“, pvz., „HC-05“ arba „HC-06“ modulius paprastiems mikrovaldiklių projektams.
Kaip žinote, ESP32 BLE gali veikti dviem skirtingais režimais. Vienas iš jų yra serverio režimas, kurį mes jau aptarėme naudodami GATT paslaugą, kad imituotumėte akumuliatoriaus lygio indikatoriaus paslaugą. Atliekant šį pratimą, ESP32 veikė kaip serveris, o mūsų mobilusis telefonas - kaip klientas. Dabar leiskite mums valdyti ESP32 kaip klientą ir pabandyti prijungti jį prie kitų BLE serverių, pvz., Mano fitneso juostos.
Visi „BLE“ serveriai, įskaitant mano kūno rengybos juostą, yra nuolatinio reklamavimo režime, ty juos visada galima atrasti patikrinus klientui. Pasinaudodami šia funkcija, mes galime naudoti šias kūno rengybos juostas kaip artumo jungiklį, o tai reiškia, kad šios kūno rengybos juostos visada yra pririštos prie vartotojo rankos, o nuskaitydami juostą galime nustatyti, ar asmuo yra diapazone. Šiame straipsnyje būtent tai ir padarysime. Mes užprogramuosime ESP32 veikti kaip BLE klientą ir nuolat ieškoti BLE įrenginių; jei rasime fitneso juostą diapazone, bandysime prisijungti prie jos ir, jei ryšys bus sėkmingas, galime suveikti lemputę perjungdami vieną iš ESP32 GPIO kaiščių. Metodas yra patikimas, nes kiekvienas BLE serveris(fitneso juosta) turės unikalų aparatinės įrangos ID, todėl du „BLE“ serverio įrenginiai nebus identiški. Įdomu tiesa? !!! Dabar pradėkime statybas
Išankstiniai reikalavimai
Šiame straipsnyje manau, kad jūs jau esate susipažinę, kaip naudoti ESP32 plokštę su „Arduino IDE“, jei nenorite grįžti prie darbo su ESP32 pamoka.
Kad būtų lengviau suprasti, visą ESP32 „Bluetooth“ padalijome į tris segmentus. Taigi prieš pradedant nuo šio, rekomenduojama pereiti pirmąsias dvi pamokas.
- ESP32 serijinis „Bluetooth“ įjungiamas šviesos diodas iš mobiliojo telefono
- BLE serveris siunčia baterijos lygio duomenis į mobilųjį telefoną naudodamasis „GATT“ paslauga
- BLE klientas ieško BLE įrenginių ir veikia kaip švyturys.
Mes jau apėmė pirmąsias dvi pamokas, čia mes tęsiame paskutinę, kad paaiškintume ESP32 kaip BLE klientą.
Reikalingos medžiagos
- ESP32 plėtros valdyba
- Kintamosios srovės apkrova (lempa)
- Relės modulis
Aparatinė įranga
Šio ESP32 BLE kliento projekto aparatinė įranga yra gana paprasta, nes didžioji magija vyksta kodo viduje. ESP32 turi perjungti kintamosios srovės lemputę (įkelti), kai aptinkamas arba prarandamas „Bluetooth“ signalas. Norėdami perjungti šią apkrovą, naudosime relę, o kadangi ESP32 GPIO kaiščiai yra suderinami tik su 3,3 V, mums reikia relės modulio, kurį galima valdyti su 3,3 V. Tiesiog patikrinkite, koks tranzistorius naudojamas relės modulyje, jei tai yra BC548, jūs galite kitur sukurti savo grandinę, vadovaudamiesi toliau pateikta schema.
Įspėjimas: grandinė susijusi su tiesiogine 220 V kintamosios srovės įtampa. Atsargiai elkitės su įtampos laidais ir įsitikinkite, kad nesukuriate trumpojo jungimo. Tu buvai ispetaS.
Priežastis, kodėl BC548 naudojama per BC547 arba 2N2222, yra ta, kad jie turi žemą bazinio spinduolio įtampą, kurią galima įjungti tik esant 3,3 V įtampai. Čia naudojama relė yra 5 V relė, todėl mes ją maitiname „Vin“ kaiščiu, kuris 5 V gauna iš maitinimo kabelio. Įžeminimo kaištis yra prijungtas prie grandinės žemės. Rezistorių R1 1K yra naudojamas kaip bazės srovė ribotuvo rezistorius. Fazinis laidas yra prijungtas prie relės NO kaiščio, o bendras relės kaištis yra prijungtas prie apkrovos, o kitas apkrovos galas - prie neutralios. Galite pakeisti fazių ir neutralių pozicijas, tačiau pasirūpinkite, kad jų netrumpintumėte tiesiogiai. Srovė visada turėtų praeiti per apkrovą (lemputę).Aš naudoju „Relay“ modulį, kad viskas būtų paprasta, o apkrova yra „Focus“ LED lempa. Mano sąranka atrodo maždaug taip žemiau
Jei dabar norite praleisti aparatinę įrangą, vietoj GPIO 13 kaiščio galite naudoti GPIO 2 kaištį, kad įjungtumėte ESP32 vidinį LED. Šis metodas rekomenduojamas pradedantiesiems.
Gaukite „Bluetooth“ serverio adresą (fitneso juostos adresą)
Kaip sakyta anksčiau, mes užprogramuosime ESP32 veikti kaip klientas (panašus į telefoną) ir prisijungti prie serverio, kuris yra mano fitneso juosta („Lenovo HW-01“). Kad klientas prisijungtų prie serverio, jis turi žinoti „Bluetooth“ serverio adresą. Kiekvienas „Bluetooth“ serveris, kaip mano fitneso juosta, turi savo unikalų „Bluetooth“ adresą, kuris yra nuolatinis. Tai galite susieti su savo nešiojamojo kompiuterio ar mobiliojo telefono MAC adresu.
Norėdami gauti šią adreso formą serveryje, mes naudojame programą „nRF connect“ iš šiaurietiškų puslaidininkių, kuriuos jau naudojome ankstesnėje pamokoje. Jį nemokamai gali įsigyti tiek IOS, tiek „Android“ vartotojai. Tiesiog atsisiųskite, paleiskite programą ir ieškokite netoliese esančių „Bluetooth“ įrenginių. Programoje bus išvardyti visi rasti BLE įrenginiai. Mano vardas yra HW-01, tiesiog žiūrėkite žemiau jo pavadinimo ir rasite aparatūros adresą serveryje, kaip parodyta žemiau.
Taigi mano fitneso juostos ESP32 BLE aparatinės įrangos adresas yra C7: F0: 69: F0: 68: 81, turėsite skirtingą skaičių rinkinį tuo pačiu formatu. Tiesiog pažymėkite tai, nes mums to reikės, kai programuosime savo ESP32.
Serverio paslaugos ir būdingo UUID gavimas
Gerai, dabar mes nustatėme savo serverį naudodami BLE adresą, tačiau norėdami su juo bendrauti, turime kalbėti paslaugų kalba ir savybėmis, kurias suprastumėte, jei perskaitytumėte ankstesnę pamoką. Šioje pamokoje aš naudoju savo serverio (fitneso juostos) rašymo ypatybes, kad susietumėte su juo. Taigi, norint susieti su įrenginiu, mums reikia paslaugos skelbimo charakteristikų UUID, kurį vėl galime gauti naudodami tą pačią programą.
Tiesiog spustelėkite programos prisijungimo mygtuką ir ieškokite kai kurių rašymo charakteristikų, kur programa parodys paslaugos UUID ir būdingą UUID. Mano parodyta žemiau
Čia mano „Service UUID“ ir „Characteristic UUID“ yra vienodi, tačiau jie neturi būti vienodi. Užrašykite savo serverio UUID. Mano buvo pažymėta kaip
„Service UUID“: 0000fee7-0000-1000-8000-00805f9b34fb Būdingas UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Rašymo ypatybių naudoti neprivaloma; galite naudoti bet kurią galiojančią paslaugą ir serveriui būdingą UUID, kuris rodomas programoje.
ESP32 programavimas veikia kaip „Proximity Switch“ programos klientas
Programos idėja yra priversti ESP32 veikti kaip klientą, kuris nuolat ieško „Bluetooth“ įrenginių, radęs mūsų serverį (fitneso juostą), patikrina aparatūros ID ir perjungs šviesą per GPIO kaištį 13. Na gerai! !, bet yra viena problema. Visų BLE serverių nuotolis yra 10 metrų, o tai yra šiek tiek per daug. Taigi, jei mes bandome padaryti artumo jungiklį, kad įjungtumėte atvirų durų šviesą, šis diapazonas yra labai didelis.
Norėdami sumažinti BLE serverio diapazoną, galime naudoti poravimo parinktį. BLE serveris ir klientas bus suporuoti tik tuo atveju, jei abu yra 3-4 metrų atstumu. Tai puikiai tinka mūsų programai. Taigi, ESP32 verčiame ne tik atrasti BLE serverį, bet ir prisijungti prie jo ir įsitikinti, ar jis lieka suporuotas. Kol jie bus suporuoti, kintamosios srovės lemputė liks įjungta, kai diapazonas viršys susiejimą, bus prarastas ir lemputė bus išjungta. Visa ESP32 BLE pavyzdinė programa, kaip tai padaryti, pateikiama šio puslapio pabaigoje. Žemiau aš suskaidysiu kodą į mažus fragmentus ir pabandysiu juos paaiškinti.
Įtraukę antraštės failą, mes informuojame ESP32 apie BLE adresą, paslaugą ir būdingą UUID, kurį gavome per „nRF connect“ programą, kaip paaiškinta aukščiau esančiose antraštėse. Kodas atrodo žemiau
statinis BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Paslaugų UUID iš fitnessband gauta per NRF Connect programa statinio BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Būdingas fitneso juostos UUID, gautas naudojant „nRF connect“ programą String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Mano fitneso juostos aparatinės įrangos „Bluetooth“ MAC skirsis kiekvienai juostai, gautai naudojant „nRF connect“ programą
Vėliau programoje turime „ connectToserver“ ir „ MyAdvertisedDeviceCallback“, prie kurių grįšime vėliau. Tada sąrankos funkcijos metu mes inicijuojame serijinį monitorių ir padarome BLE ESP, kad ieškotume įrenginio. Užbaigus kiekvieno aptikto BLE įrenginio nuskaitymą, iškviečiama „MyAdvertisedDeviceCallbacks“ funkcija.
Mes taip pat įgaliname aktyvų nuskaitymą, nes ESP32 maitiname iš tinklo, todėl baterijoms naudoti jis yra išjungtas, kad sumažėtų srovės suvartojimas. Relės paleidimo kaištis yra prijungtas prie GPIO 13 mūsų aparatinėje įrangoje, todėl mes taip pat deklaruojame, kad GPIO kaištis 13 yra išėjimas.
negaliojanti sąranka () { Serial.begin (115200); // Paleisti nuoseklųjį monitorių Serial.println („ESP32 BLE Server“ programa); // Įvadinis pranešimas BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // sukurti naują nuskaitymą pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Skambinkite aukščiau apibrėžta klase pBLEScan-> setActiveScan (true); // aktyvus nuskaitymas sunaudoja daugiau energijos, bet greičiau gaukite rezultatus pinMode (13, OUTPUT); // Paskelbkite įmontuotą LED kaištį kaip išvestį }
Funkcijos „MyAdvertisedDeviceCallbacks“ viduje išspausdiname eilutę, kurioje bus nurodytas atrastų BLE įrenginių pavadinimas ir kita informacija. Mums reikia aptikto BLE įrenginio aparatinės įrangos ID, kad galėtume jį palyginti su norimu. Taigi mes naudojame kintamąjį Server_BLE_Address, norėdami gauti įrenginio adresą ir tada jį konvertuoti iš tipo BLEAddress į eilutę.
klasė „MyAdvertisedDeviceCallbacks“: viešoji „BLEAdvertisedDeviceCallbacks“ { void onResult (BLEAdvertisedDevice AdvertisedDevice) { Serial.printf ("Nuskaitymo rezultatas:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = nauja BLEAddress (reklamuojamaDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_adresas-> toString (). C_str (); } };
Viduje ciklo funkcija mes nuskaitome 3 sekundes ir įdedame rezultatą į „foundDevices“, kuris yra objektas iš „BLEScanResults“. Jei nuskaitymo metu randame vieną ar kelis įrenginius, pradedame tikrinti, ar atrastas BLE adresas sutampa su tuo, kurį įvedėme į programą. Jei atitiktis yra teigiama ir prietaisas nėra suporuotas anksčiau, mes bandome jį suporuoti naudodami „connectToserver“ funkciją. Mes taip pat naudojome keletą nuoseklių teiginių supratimo tikslais.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_adresas && suporuotas == false) { Serial.println ("Rastas įrenginys: -)… jungiantis prie serverio kaip klientas"); jei (connectToserver (* Server_BLE_adresas)) {
Funkcijos „connectToserver“ viduje mes naudojame UUID poruodami su BLE serveriu (fitneso juosta). Norėdami prisijungti prie serverio, ESP32 turi veikti kaip klientas, todėl mes sukuriame klientą naudodami funkciją createClient (), tada prisijungiame prie BLE serverio adreso. Tada ieškome paslaugos ir charakteristikos naudodami UUID reikšmes ir bandome prisijungti prie jos. Kai ryšys yra sėkmingas, funkcija pateikia tiesą, o jei ne, grąžina klaidingą reikšmę. Atkreipkite dėmesį, kad poruoti su serveriu nebūtina turėti paslaugų ir būdingo UUID, tai daroma tik jūsų supratimui.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- sukurtas klientas"); // Prisijunkite prie BLE serverio. pClient-> prisijungti (pAddress); Serial.println ("- Prijungta prie fitneso juostos"); // Gaukite nuorodą į paslaugą, kurios mes ieškome nuotoliniame BLE serveryje. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- rado mūsų paslaugą"); grįžti tiesa; } else return false; // Gaukite nuorodą į charakteristiką nuotolinio BLE serverio tarnyboje. pRemoteCharacteristic = pRemoteService->„getCharacteristic“ (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Rasta mūsų charakteristika"); grįžti tiesa; }
Jei prisijungimas sėkmingas, GPIO kaištis 13 yra aukštas ir valdymas siunčiamas už ciklo ribų, naudojant pertraukos teiginį. Taip pat nustatyta, kad porinis Būlo kintamasis yra teisingas.
jei (connectToserver (* Server_BLE_adresas)) { supired = true; Serial.println ("********************* šviesos diodas įjungtas *********************** ** "); „digitalWrite“ (13, HIGH); pertrauka; }
Sėkmingai susiejus ir įjungus GPIO kaištį, turime patikrinti, ar įrenginys vis dar yra diapazone. Kadangi dabar prietaisas yra suporuotas, BLE nuskaitymo tarnyba nebegalės jo matyti. Jį vėl rasime tik tada, kai vartotojas paliks teritoriją. Taigi mes tiesiog turime ieškoti BLE serverio ir, jei pastebime, turime nustatyti žemą GPIO kaištį, kaip parodyta žemiau
jei (Nuskaityta_BLE_adresas == Mano_BLE_adresas && suporuota == teisinga) { Serija. println („Mūsų įrenginys išėjo už diapazono ribų“); suporuotas = klaidingas; Serijinis. println ("********************* LED OOOFFFFF *************************"); „digitalWrite“ (13, LOW); ESP. Paleiskite iš naujo (); pertrauka; }
Darbas ir testavimas
Kai būsite pasirengę programai ir aparatinei įrangai, paprasčiausiai įkelkite kodą į ESP32 ir sutvarkykite visą sąranką, kaip parodyta žemiau.
Turėtumėte pastebėti, kad lempa įsijungia, kai tik kūno rengybos juosta (serveris) susiporuoja su ESP32. Tai taip pat galite patikrinti pastebėję „Bluetooth“ ryšio simbolį kūno rengybos juostoje. Susijungę tiesiog pabandykite nueiti nuo ESP32, o perėję 3-4 metrus pastebėsite, kad laikrodyje dingo „Bluetooth“ simbolis ir nutrūko ryšys. Dabar, jei pažvelgsite į žibintą, jis bus išjungtas. Kai grįšite atgal, įrenginys vėl bus suporuotas ir lemputė užsidegs. Visą projekto darbą galite rasti žemiau esančiame vaizdo įraše.
Tikiuosi, kad jums patiko projektas ir kelyje sužinojote kažką naujo. Jei susidūrėte su bet kokia problema, kaip tai veikia, nedvejodami paskelbkite problemą forumuose ar net žemiau esančiame komentarų skyriuje