- Paunang mga kinakailangan
- Mga Materyal na Kinakailangan
- Hardware
- Kunin ang iyong Bluetooth Address of Server (Address ng fitness band)
- Pagkuha ng Serbisyo at Katangian UUID ng server
- Ang pagprograma ng ESP32 upang kumilos bilang isang kliyente para sa Application ng Proximity Switch
- Paggawa at Pagsubok
Napakagaling upang buksan ang mga ilaw nang awtomatiko sa pagpasok mo sa iyong bahay at patayin muli ito kapag umalis ka! Oo, maaaring gawin ito ng isang simpleng application para sa iyo. Dito sa proyektong ito, gagamitin namin ang ESP32 bilang BLE client at fitness band bilang BLE server, kaya't tuwing ang isang taong may suot na fitness band ay dumating sa saklaw ng ESP32 Bluetooth, makikita ito ng ESP32 at i-on ang ilaw. Ang anumang mga aparatong Bluetooth na mayroong mga kakayahan sa server ng BLE ay maaaring magamit bilang isang aparato ng pag-trigger upang makontrol ang anumang kagamitan sa bahay gamit ang ESP32.
Natuklasan na namin ang mga pagpapaandar ng BLE (Bluetooth Mababang Enerhiya) ng module na ESP32 at lubos akong kinikilig dito. Upang magbigay ng isang recap, ang modyul na ito ay may parehong klasikong Bluetooth at Bluetooth Mababang Enerhiya (BLE), ang klasikong Bluetooth ay maaaring magamit upang ilipat ang mga kanta o mga file at ang pagpipiliang BLE ay maaaring magamit para sa mga na-optimize na baterya na mga application tulad ng mga Bluetooth beacon, fitness band, proximity s, atbp Posible ring gamitin ito bilang isang serial Bluetooth tulad ng mga modyul na HC-05 o HC-06 para sa mga simpleng proyekto ng microcontroller.
Tulad ng alam mo na ang ESP32 BLE ay maaaring gumana sa dalawang magkakaibang mga mode. Ang isa ay ang server mode na tinalakay na namin sa pamamagitan ng paggamit ng serbisyo ng GATT upang gayahin ang isang serbisyo ng tagapagpahiwatig ng antas ng baterya. Sa ehersisyo na iyon, ang ESP32 ay kumilos bilang isang server at ang aming mobile phone ay kumilos bilang isang kliyente. Ngayon, ipaandar natin sa atin ang ESP32 bilang isang kliyente at subukang ikonekta ito sa iba pang mga server ng BLE tulad ng aking fitness band.
Ang lahat ng mga server ng BLE kasama ang aking fitness band ay nasa pare-pareho ang mode ng advertising na maaari silang laging matuklasan kapag na-scan ng isang kliyente. Sa pamamagitan ng paggamit ng tampok na ito maaari naming magamit ang mga fitness band na ito bilang isang proximity switch, ibig sabihin ang mga fitness band na ito ay laging nakatali sa kamay ng gumagamit at sa pamamagitan ng pag-scan para sa banda maaari naming matukoy kung nasa loob ng saklaw ang tao. Ito mismo ang gagawin natin sa artikulong ito. Paprogram namin ang ESP32 upang kumilos bilang isang kliyente ng BLE at patuloy na mapanatili ang pag-scan para sa mga BLE device; kung nakita namin ang fitness band sa saklaw susubukan naming kumonekta dito at kung matagumpay ang koneksyon maaari kaming mag- trigger ng isang bombilya sa pamamagitan ng pag-toggle ng isa sa mga pin ng GPIO sa ESP32. Ang pamamaraan ay maaasahan dahil ang bawat BLE serverAng (fitness band) ay magkakaroon ng isang natatanging hardware ID kaya walang dalawang mga aparato ng BLE server ang magkapareho. Nakakainteres diba? !!! Ngayon, magtayo na tayo
Paunang mga kinakailangan
Sa artikulong ito, ipinapalagay ko na pamilyar ka na sa kung paano gamitin ang board ng ESP32 sa Arduino IDE, kung hindi bumalik upang makapagsimula sa tutorial ng ESP32.
Hinati namin ang kumpletong ESP32 Bluetooth sa tatlong mga segment para sa madaling pag-unawa. Kaya inirerekumenda na dumaan sa unang dalawang mga tutorial bago magsimula sa isang ito.
- Serial Bluetooth sa toggling LED ng ESP32 mula sa Mobile Phone
- BLE server upang magpadala ng data ng antas ng baterya sa Mobile Phone gamit ang Serbisyo ng GATT
- BLE client upang mag-scan para sa mga aparato ng BLE at kumilos bilang isang beacon.
Sinakop na namin ang unang dalawang mga tutorial, narito na kami nagpapatuloy sa huling upang ipaliwanag ang ESP32 bilang BLE client.
Mga Materyal na Kinakailangan
- Lupon sa Pagpapaunlad ng ESP32
- AC Load (Lampara)
- Relay Module
Hardware
Ang hardware para sa proyektong ito ng Kliyente ng ESP32 ay medyo payak dahil ang karamihan sa mahika ay nangyayari sa loob ng code. Ang ESP32 ay kailangang magpalipat-lipat ng isang lampara ng AC (Load) kapag natuklasan o nawala ang signal ng Bluetooth. Upang i-toggle ang load na ito gagamitin namin ang isang Relay, at dahil ang mga GPIO pin ng ESP32 ay katugma lamang ng 3.3V kailangan namin ng isang Relay module na maaaring maitulak sa 3.3V. Suriin lamang kung anong transistor ang ginagamit sa module ng Relay kung ito ay BC548 mahusay kang pumunta sa ibang lugar na bumuo ng iyong sariling circuit sa pamamagitan ng pagsunod sa diagram ng circuit sa ibaba.
Babala: Ang circuit ay nakikipag-usap sa direktang 220V AC mains boltahe. Mag-ingat sa mga live na wires at tiyaking hindi ka lumilikha ng isang maikling circuit. Binalaan ka
Ang dahilan sa likod ng paggamit ng BC548 sa BC547 o 2N2222 ay mayroon silang isang mababang boltahe na base-emitter na maaaring ma-trigger sa pamamagitan lamang ng 3.3V. Ang relay na ginamit dito ay isang 5V relay, kaya pinapagana namin ito sa Vin pin na nakakakuha ng 5V form na power cable. Ang ground pin ay konektado sa lupa ng circuit. Ang Resistor R1 1K ay ginagamit bilang isang base kasalukuyang limiter risistor. Ang Phase wire ay konektado sa WALANG pin ng Relay at ang Karaniwang pin ng Relay ay konektado sa pagkarga at ang iba pang dulo ng pagkarga ay konektado sa Neutral. Maaari mong ipagpalit ang posisyon ng Phase at Neutral ngunit mag-ingat na hindi mo paikliin ang mga ito nang direkta. Ang kasalukuyang ay dapat palaging dumaan sa Load (Bulb).Gumamit ako ng isang module na Relay upang mapanatili ang mga bagay na simple at ang pag-load dito ay isang lampara na LED na Focus. Ang set-up ko ay mukhang ganito sa ibaba
Kung nais mong laktawan ang hardware sa ngayon maaari mong gamitin ang GPIO 2 pin sa halip na GPIO 13 pin upang i-toggle ang on-board LED sa ESP32. Inirerekomenda ang pamamaraang ito para sa mga nagsisimula.
Kunin ang iyong Bluetooth Address of Server (Address ng fitness band)
Tulad ng sinabi nang mas maaga sa programa namin ang ESP32 upang kumilos bilang isang kliyente (katulad ng telepono) at kumonekta sa isang server na kung saan ay ang aking fitness band (Lenovo HW-01). Para sa isang kliyente na kumonekta sa server kailangan nitong malaman ang address ng Bluetooth ng server. Ang bawat Bluetooth server tulad ng aking fitness band dito, ay may sariling natatanging Bluetooth address na kung saan ay permanente. Maaari mong maiugnay ito sa MAC address ng iyong Laptop o mobile phone.
Upang makuha ang form na Address na ito ang server ay gumagamit kami ng application na tinatawag na nRF kumonekta mula sa mga Nordic semi-conductor na ginamit na namin para sa aming nakaraang tutorial. Ito ay magagamit nang libre para sa parehong mga gumagamit ng IOS at Android. Mag-download lang, ilunsad ang application at i-scan ang mga aparatong Bluetooth sa malapit. Ililista ng application ang lahat ng mga aparatong BLE na nahahanap nito. Ang minahan ay pinangalanang HW-01 tingnan lamang sa ibaba ang pangalan nito at mahahanap mo ang address ng hardware ng server tulad ng ipinakita sa ibaba.
Kaya't ang address ng hardware ng ESP32 BLE ng aking fitness band ay C7: F0: 69: F0: 68: 81, magkakaroon ka ng ibang hanay ng mga numero sa parehong format. Gumawa lamang ng isang tala nito dahil kakailanganin namin kapag pinrograma namin ang aming ESP32.
Pagkuha ng Serbisyo at Katangian UUID ng server
Okay, ngayon ay nakilala namin ang aming server gamit ang BLE address ngunit upang makipag-usap dito kailangan naming magsalita ng wika ng Serbisyo at mga katangian, na mauunawaan mo kung nabasa mo ang nakaraang tutorial. Sa tutorial na ito ginagamit ko ang katangian ng pagsusulat ng aking server (fitness band) upang ipares ito. Kaya para sa pagpapares sa aparato kailangan namin ang Service ad Characteristic UUID na maaari naming makuha muli gamit ang parehong application.
Mag-click lamang sa pindutan ng kumonekta sa iyong application at maghanap para sa ilang mga katangian ng pagsulat, kung saan ipapakita ng application ang serbisyo na UUID at katangian na UUID. Ang minahan ay ipinapakita sa ibaba
Narito ang aking Serbisyo UUID at Characteristic UUID ay pareho, ngunit hindi ito dapat maging pareho. Tandaan ang UUID ng iyong server. Ang minahan ay nabanggit bilang
Serbisyo UUID: 0000fee7-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Hindi sapilitan na gamitin ang mga katangian ng pagsulat; maaari mong gamitin ang anumang wastong serbisyo at katangian na UUID ng server na ipinapakita sa application.
Ang pagprograma ng ESP32 upang kumilos bilang isang kliyente para sa Application ng Proximity Switch
Ang ideya ng programa ay upang gawin ang ESP32 upang kumilos bilang isang kliyente na patuloy na pag-scan para sa mga aparatong Bluetooth kapag nahanap nito ang aming server (fitness band) napatunayan nito ang hardware ID at ito ay i-toggle ang ilaw sa pamamagitan ng GPIO pin 13. Well okay! !, ngunit may isang problema dito. Ang lahat ng mga server ng BLE ay magkakaroon ng saklaw na 10 metro na medyo masyadong marami. Kaya't kung sinusubukan naming gumawa ng proximity switch upang i-on ang ilaw ng pagbukas ng pinto ang saklaw na ito ay napakataas.
Upang mabawasan ang saklaw ng BLE server maaari naming gamitin ang pagpipiliang pagpapares. Ang isang BLE server at kliyente ay mananatiling ipinares lamang kung pareho ang nasa loob ng distansya na 3-4 Meters. Perpekto iyon para sa aming aplikasyon. Kaya, ginagawa namin ang ESP32 hindi lamang upang matuklasan ang server ng BLE ngunit upang kumonekta dito at tiyakin kung mananatiling ipinares. Hangga't ipinares ang mga ito ang AC lampara ay mananatili sa, kapag ang saklaw na lumampas sa pagpapares ay mawawala at ang lampara ay papatayin. Ang kumpletong programang halimbawang ESP32 BLE upang gawin ang pareho ay ibinibigay sa pagtatapos ng pahinang ito. Sa ibaba dito, sisirain ko ang code sa maliit na mga snippet at subukang ipaliwanag ang mga ito.
Matapos isama ang file ng header, ipinapaalam namin sa ESP32 tungkol sa BLE address, Serbisyo at katangian na UUID na nakuha namin kahit na ang nRF ay kumonekta ng application tulad ng ipinaliwanag sa mga heading sa itaas. Ang code ay mukhang sa ibaba
static na BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Service UUID ng fitnessband na nakuha sa pamamagitan ng nRF ikonekta ang application static na BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Characteristic UUID ng fitnessband na nakuha sa pamamagitan ng nRF ikonekta ang application na String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hardware Bluetooth MAC ng aking fitnessband , mag-iiba para sa bawat banda na nakuha sa pamamagitan ng nRF connect application
Sinusundan iyon sa programa mayroon kaming connectToserver at MyAdvertisedDeviceCallback na babalik kami sa paglaon. Pagkatapos sa loob ng pag- andar ng pag- setup , pinasimulan namin ang serial monitor at gagawin ang BLE sa ESP upang i-scan ang aparato. Matapos makumpleto ang pag-scan para sa bawat aparatong BLE natuklasan ang pagpapaandar na MyAdvertisedDeviceCallbacks ay tinawag.
Pinapagana din namin ang aktibong pag-scan dahil pinapagana namin ang ESP32 na may lakas na pangunahing, para sa aplikasyon ng baterya naka-off ito upang mabawasan ang kasalukuyang pagkonsumo. Ang Relay trigger pin ay konektado sa GPIO 13 sa aming hardware, kaya idineklara rin namin na ang GPIO pin 13 bilang output.
void setup () { Serial.begin (115200); // Start serial monitor Serial.println ("ESP32 BLE Server program"); // Intro message BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // create new scan pBLEScan-> setAdvertisedDeviceCallbacks (bagong MyAdvertisedDeviceCallbacks ()); // Tumawag sa klase na tinukoy sa itaas pBLEScan-> setActiveScan (true); // aktibong pag-scan ay gumagamit ng higit na lakas, ngunit makakuha ng mga resulta nang mas mabilis pinMode (13, OUTPUT); // Ideklara ang in-built LED pin bilang output }
Sa loob ng pagpapaandar ng MyAdvertisedDeviceCallbacks , nag-print kami ng linya na maglilista ng pangalan at iba pang impormasyon ng mga BLE device na natuklasan. Kailangan namin ng hardware ID ng BLE device na natuklasan upang maihambing namin ito sa nais. Kaya gagamitin namin ang mga variable Server_BLE_Address upang makuha ang address ng aparato at pagkatapos ay din i-convert ang mga ito mula sa i-type ang BLEAddress na string.
klase MyAdvertisedDeviceCallbacks: publiko BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Scan Result:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = bagong BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Sa loob ng pag- andar ng loop , nag-scan kami ng 3 segundo at inilalagay ang resulta sa loob ng mga nahanap naDevice na isang bagay mula sa BLEScanResults. Kung nakakita kami ng isa o higit pa sa isang aparato sa pamamagitan ng pag-scan, nagsisimula kaming suriin kung ang natuklasan na BLE address ay tumutugma sa isa na ipinasok namin sa programa. Kung positibo ang tugma at ang aparato ay hindi ipinares nang mas maaga sinubukan namin ang paggamit nito gamit ang pag-andar ng ConnectToserver. Gumamit din kami ng ilang mga pahayag na Serial para sa pag-unawa sa layunin.
habang (foundDevices.getCount ()> = 1) { kung (Scaned_BLE_Address == My_BLE_Address && ipares == false) { Serial.println ("Found Device: -)… pagkonekta sa Server bilang client"); kung (connectToserver (* Server_BLE_Address)) {
Sa loob ng pag- andar ng ConnectToserver ay ginagamit namin ang UUID upang ipares sa BLE server (fitness band). Upang kumonekta sa isang server, ang ESP32 ay dapat kumilos bilang isang kliyente, kaya lumilikha kami ng isang kliyente sa pamamagitan ng paggamit ng function na createClient () at pagkatapos ay kumonekta sa address ng BLE server. Pagkatapos ay naghahanap kami para sa serbisyo at katangian gamit ang mga halaga ng UUID at subukang kumonekta dito. Kapag matagumpay ang koneksyon ang function ay nagbabalik ng isang totoo at kung hindi ay nagbabalik ito ng isang hindi totoo. Tandaan na hindi sapilitan ang pagkakaroon ng serbisyo at katangiang UUID upang ipares sa isang server, ginagawa lamang ito para sa iyong pag-unawa.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Nilikha ang client"); // Kumonekta sa BLE Server. pClient-> kumonekta (pAddress); Serial.println ("- Nakakonekta sa fitnessband"); // Kumuha ng isang sanggunian sa serbisyo na hinahabol namin sa remote na server ng BLE. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); kung (pRemoteService! = nullptr) { Serial.println ("- Nahanap ang aming serbisyo"); bumalik totoo; } iba pa ay bumalik nang hindi totoo; // Kumuha ng isang sanggunian sa katangian sa serbisyo ng remote BLE server. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); kung (pRemoteCharacteristic! = nullptr) Serial.println ("- Natagpuan ang aming katangian"); bumalik totoo; }
Kung matagumpay ang koneksyon ang GPIO pin 13 ay ginawang mataas at ang kontrol ay ipinapadala sa labas ng loop sa pamamagitan ng paggamit ng break statement. Ang Boolean variable na ipinares ay itinakda ring totoo.
kung (connectToserver (* Server_BLE_Address)) { ipinares = totoo; Serial.println ("***** ** "); digitalWrite (13, TAAS); pahinga; }
Matapos ang tagumpay ay matagumpay at ang GPIO pin ay nakabukas kailangan naming suriin kung ang aparato ay nasa saklaw pa rin. Dahil, ngayon ang aparato ay ipinares, hindi na makikita ng serbisyo sa pag-scan ng BLE. Mahahanap lamang namin ito muli kapag umalis ang gumagamit sa lugar. Kaya kailangan lang naming mag- scan para sa labas ng BLE server at kung matutuklasan namin na itatakda namin ang GPIO pin sa mababang tulad ng ipinakita sa ibaba
kung (Nai-scan_BLE_Address == My_BLE_Address && ipinares == totoo) { Serial. println ("Ang aming aparato ay nawala sa saklaw"); ipinares = maling; Serial. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP. restart (); pahinga; }
Paggawa at Pagsubok
Kapag handa ka na sa programa at pag-set up ng hardware, i-upload lamang ang code sa ESP32 at ayusin ang buong pag-set up tulad ng ipinakita sa ibaba.
Dapat mong mapansin ang pag -on ng Lampara kaagad sa pagpares ng fitness band (server) kasama ang ESP32. Maaari mo ring suriin ito sa pamamagitan ng pagpansin ng simbolo ng koneksyon ng Bluetooth sa fitness band. Sa sandaling ipinares subukan mo lang ang paglalakad palayo sa ESP32 at kapag tumawid ka sa 3-4 metro mapapansin mo na ang simbolo ng Bluetooth sa relo ay nawala at nawala ang koneksyon. Ngayon, kung titingnan mo ang lampara ay papatayin ito. Kapag lumalakad ka pabalik sa aparato ay muling nakapares at nagbukas ang ilaw. Ang kumpletong pagtatrabaho ng proyekto ay matatagpuan sa video sa ibaba.
Inaasahan kong nasiyahan ka sa proyekto at may natutunan kaagad. Kung nahaharap ka sa anumang problema sa pagpapaandar nito, huwag mag-atubiling mai-post ang problema sa mga forum o kahit na sa seksyon ng komento sa ibaba