- Forutsetninger
- Nødvendig materiale
- Maskinvare
- Få din Bluetooth-adresse til serveren (adresse til treningsbåndet)
- Få service og karakteristiske UUID for serveren
- Programmering av ESP32 til å fungere som klient for Proximity Switch Application
- Arbeid og testing
Hvor kult det er å slå på lysene automatisk så snart du kommer inn i hjemmet og slå det av igjen når du drar! Ja, et enkelt program kan gjøre dette for deg. Her i dette prosjektet vil vi bruke ESP32 som BLE-klient og treningsbånd som BLE-server, så når en person som har treningsbåndet kommer i området ESP32 Bluetooth, oppdager ESP32 det og slår på lyset. Alle Bluetooth-enheter som har BLE-serverfunksjoner, kan brukes som en utløserenhet for å kontrollere ethvert hjemmeapparat ved hjelp av ESP32.
Vi har allerede utforsket BLE (Bluetooth Low Energy) -funksjonene til ESP32-modulen, og jeg er veldig begeistret for den. For å gi et sammendrag har denne modulen både klassisk Bluetooth og Bluetooth Low Energy (BLE), den klassiske Bluetooth kan brukes til å overføre sanger eller filer, og BLE-alternativet kan brukes til batterioptimaliserte applikasjoner som Bluetooth-fyrtårn, treningsbånd, nærhet s osv. Det er også mulig å bruke den som en seriell Bluetooth som HC-05 eller HC-06 modulene for enkle mikrokontroller prosjekter.
Som du vet kan ESP32 BLE operere i to forskjellige moduser. Den ene er servermodusen som vi allerede har diskutert ved å bruke GATT-tjenesten til å etterligne en batterinivåindikator. I den øvelsen fungerte ESP32 som en server og mobiltelefonen vår fungerte som en klient. La oss nå bruke ESP32 som en klient og prøve å koble den til andre BLE-servere som treningsbåndet mitt.
Alle BLE-servere inkludert treningsbåndet mitt er i konstant reklamemodus, det vil si at de alltid kan oppdages når de skannes av en klient. Ved å utnytte denne funksjonen kan vi bruke disse treningsbåndene som en nærhetsbryter, noe som betyr at disse treningsbåndene alltid er bundet til brukerens hånd, og ved å skanne etter båndet kan vi oppdage om personen er innenfor rekkevidde. Dette er nøyaktig hva vi skal gjøre i denne artikkelen. Vi vil programmere ESP32 til å fungere som en BLE-klient og hele tiden fortsette å skanne etter BLE-enheter; hvis vi finner treningsbåndet innen rekkevidde, vil vi prøve å koble til det, og hvis forbindelsen er vellykket, kan vi utløse en lyspære ved å slå av en av GPIO-pinnene på ESP32. Metoden er pålitelig fordi hver BLE-server(treningsbånd) vil ha en unik maskinvare-ID, så ingen BLE-serverenheter vil være identiske. Interessant ikke sant? !!! La oss nå bygge
Forutsetninger
I denne artikkelen antar jeg at du allerede er kjent med hvordan du bruker ESP32-kortet med Arduino IDE, hvis ikke fall tilbake til å komme i gang med ESP32-opplæringen.
Vi har delt den komplette ESP32 Bluetooth i tre segmenter for enkel forståelse. Så det anbefales å gå gjennom de to første opplæringene før du begynner med denne.
- Seriell Bluetooth på ESP32 vekslende LED fra mobiltelefon
- BLE-server for å sende data på batterinivå til mobiltelefon ved hjelp av GATT-tjenesten
- BLE-klient for å skanne etter BLE-enheter og fungere som et fyrtårn.
Vi har allerede dekket de to første opplæringene, her fortsetter vi med den siste for å forklare ESP32 som BLE-klient.
Nødvendig materiale
- ESP32 Development Board
- AC-belastning (lampe)
- Relémodul
Maskinvare
Maskinvaren for dette ESP32 BLE Client-prosjektet er ganske vanlig, siden det meste av magien skjer inne i koden. ESP32 må bytte en AC-lampe (Load) når Bluetooth-signalet oppdages eller går tapt. For å veksle mellom denne belastningen vil vi bruke et relé, og siden GPIO-pinnene til ESP32 bare er 3,3V kompatible, trenger vi en relémodul som kan kjøres med 3,3V. Bare sjekk hvilken transistor som brukes i relémodulen hvis det er BC548, det er bra å gå ellers bygge din egen krets ved å følge kretsskjemaet nedenfor.
Advarsel: Kretsen omhandler direkte 220V vekselstrøm. Vær forsiktig med strømførende ledninger og sørg for at du ikke lager kortslutning. Du har blitt advart.
Årsaken bak bruk av BC548 over BC547 eller 2N2222 er at de har en lav base-emitter-spenning som kan utløses med bare 3,3V. Den relé brukt her er en 5V relé, så vi slår den med Vin pin som får 5V danne strømkabelen. Jordpinnen er koblet til bakken i kretsen. Den motstand R1 1K blir anvendt som en base strømbegrenser motstand. Fasekabelen er koblet til NO-stiften på reléet og den vanlige stiften på reléet er koblet til lasten og den andre enden av lasten er koblet til nøytral. Du kan bytte posisjonen til fase og nøytral, men pass på at du ikke forkorter dem direkte. Strømmen skal alltid passere gjennom belastningen (pæren).Jeg har brukt en relémodul for å holde ting enkelt, og belastningen her er en Focus LED-lampe. Oppsettet mitt ser omtrent slik ut nedenfor
Hvis du vil hoppe over maskinvaren for nå, kan du bruke GPIO 2-pinnen i stedet for GPIO 13-pinnen for å veksle den innebygde LED-en på ESP32. Denne metoden anbefales for nybegynnere.
Få din Bluetooth-adresse til serveren (adresse til treningsbåndet)
Som tidligere fortalt skal vi programmere ESP32 til å fungere som klient (ligner på telefon) og koble til en server som er treningsbåndet mitt (Lenovo HW-01). For at en klient skal koble seg til serveren, må den kjenne Bluetooth-adressen til serveren. Hver Bluetooth-server som treningsbåndet mitt her, har sin egen unike Bluetooth-adresse som er permanent. Du kan relatere dette til MAC-adressen til din bærbare eller mobiltelefon.
For å få denne adressen fra serveren bruker vi applikasjonen kalt nRF connect fra nordiske halvledere som vi allerede hadde brukt til vår forrige opplæring. Den er tilgjengelig gratis for både IOS- og Android-brukere. Bare last ned, start applikasjonen og skann etter Bluetooth-enhetene i nærheten. Applikasjonen vil liste opp alle BLE-enhetene den finner. Mine heter HW-01, bare se under navnet og du vil finne maskinvareadressen til serveren som vist nedenfor.
Så ESP32 BLE- maskinvareadressen til treningsbåndet mitt er C7: F0: 69: F0: 68: 81, du vil ha et annet sett med tall i samme format. Bare noter det siden vi trenger når vi programmerer ESP32.
Få service og karakteristiske UUID for serveren
OK, nå har vi identifisert serveren vår ved hjelp av BLE-adressen, men for å kommunisere med den, må vi snakke språket for tjeneste og egenskaper, som du ville forstå hvis du hadde lest forrige veiledning. I denne opplæringen bruker jeg skrivekarakteristikken til serveren min (treningsbånd) for å parre med den. Så for sammenkobling med enheten trenger vi tjenesteannonsen Karakteristisk UUID, som vi igjen kan få med samme applikasjon.
Bare klikk på tilkoblingsknappen på applikasjonen din og søk etter noen skriveegenskaper, der applikasjonen vil vise tjenesten UUID og den karakteristiske UUID. Mine er vist nedenfor
Her er min tjeneste UUID og karakteristiske UUID den samme, men den trenger ikke å være den samme. Noter UUID på serveren din. Mine ble notert som
Service UUID: 0000fee7-0000-1000-8000-00805f9b34fb Karakteristisk UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Det er ikke obligatorisk å bruke skriveegenskapene; du kan bruke hvilken som helst gyldig tjeneste og karakteristisk UUID for serveren som vises i applikasjonen.
Programmering av ESP32 til å fungere som klient for Proximity Switch Application
Ideen med programmet er å få ESP32 til å fungere som en klient som fortsetter å skanne etter Bluetooth-enheter når den finner serveren vår (treningsbånd), den verifiserer maskinvare-ID-en, og den vil slå lyset gjennom GPIO-pinnen 13. Vel ok! !, men det er ett problem med det. Alle BLE-servere vil ha en rekkevidde på 10 meter, noe som er litt for mye. Så hvis vi prøver å få nærhetsbryteren til å slå på lyset for å åpne en dør, er dette området veldig høyt.
For å redusere rekkevidden til BLE-serveren kan vi bruke paringsalternativet. En BLE-server og klient forblir bare sammenkoblet hvis begge er innen en avstand på 3-4 meter. Det er perfekt for vår applikasjon. Så vi lager ESP32 ikke bare for å oppdage BLE-serveren, men også for å koble til den og sørge for om den forblir sammenkoblet. Så lenge de er paret, vil AC-lampen forbli på, når rekkevidden overskrides, vil parringen gå tapt og lampen vil bli slått av. Det komplette eksempelprogrammet for ESP32 BLE for å gjøre det samme er gitt på slutten av denne siden. Nedenfor vil jeg dele koden i små utdrag og prøve å forklare dem.
Etter å ha tatt med overskriftsfilen, informerer vi ESP32 om BLE-adressen, tjenesten og den karakteristiske UUID som vi har fått gjennom nRF connect-applikasjonen som forklart i overskriftene ovenfor. Koden ser ut som nedenfor
statisk BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Service UUID for fitnessband oppnådd gjennom nRF connect applikasjon statisk BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Karakteristisk UUID for fitnessband oppnådd gjennom nRF connect-applikasjon String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Maskinvare Bluetooth MAC på treningsbåndet mitt , vil variere for hvert bånd som oppnås gjennom nRF connect-applikasjonen
Etterfulgt av det i programmet har vi connectToserver og MyAdvertisedDeviceCallback som vi kommer tilbake til senere. Så i installasjonsfunksjonen initialiserer vi den serielle skjermen og lager BLE på ESP for å skanne etter enhet. Etter at skanningen er fullført for hver BLE-enhet oppdaget, kalles funksjonen MyAdvertisedDeviceCallbacks .
Vi aktiverer også aktiv skanning siden vi driver ESP32 med strøm, for batteriprogram er den slått av for å redusere strømforbruket. Reléutløserpinnen er koblet til GPIO 13 i maskinvaren vår, så vi erklærer også at GPIO-pinnen 13 som utgang.
ugyldig oppsett () { Serial.begin (115200); // Start seriell skjerm Serial.println ("ESP32 BLE Server-program"); // Intro melding BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // opprett ny skanning pBLEScan-> setAdvertisedDeviceCallbacks (nye MyAdvertisedDeviceCallbacks ()); // Ring klassen som er definert over pBLEScan-> setActiveScan (true); // aktiv skanning bruker mer kraft, men får resultater raskere pinMode (13, OUTPUT); // Deklarer den innebygde LED-pinnen som utgang }
Inne i MyAdvertisedDeviceCallbacks- funksjonen skriver vi ut en linje som viser navn og annen informasjon om BLE-enhetene som ble oppdaget. Vi trenger maskinvare-IDen til BLE-enheten som ble oppdaget, slik at vi kan sammenligne den med den ønskede. Så vi bruker variabelen Server_BLE_Address for å få adressen til enheten og deretter også for å konvertere den fra type BLEAddress til streng.
klasse MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Scan Result:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = ny BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Inne i loop- funksjonen skanner vi i 3 sekunder og setter resultatet i foundDevices som er et objekt fra BLEScanResults. Hvis vi finner en eller flere enheter ved å skanne, begynner vi å sjekke om den oppdagede BLE-adressen samsvarer med den vi skrev inn i programmet. Hvis kampen er positiv, og enheten ikke er paret tidligere, prøver vi å parre med den ved hjelp av connectToserver-funksjonen. Vi har også brukt få serielle uttalelser for å forstå formålet.
mens (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Fant enhet: -)… kobler til Server som klient"); hvis (connectToserver (* Server_BLE_Address)) {
Inne i connectToserver- funksjonen bruker vi UUID for å parre med BLE-serveren (treningsbånd). For å koble til en server, må ESP32 fungere som en klient, så vi oppretter en klient ved å bruke createClient () -funksjonen og deretter koble til adressen til BLE-serveren. Deretter søker vi etter tjenesten og karakteristikken ved hjelp av UUID-verdiene og prøver å koble til den. Når forbindelsen er vellykket, returnerer funksjonen en sann, og hvis ikke, returnerer den feil. Merk at det ikke er obligatorisk å ha service og karakteristisk UUID for å parre med en server, det gjøres bare for din forståelse.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Opprettet klient"); // Koble til BLE Server. pClient-> connect (pAddress); Serial.println ("- Koblet til fitnessband"); // Få en referanse til tjenesten vi er ute etter på den eksterne BLE-serveren. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); hvis (pRemoteService! = nullptr) { Serial.println ("- Fant vår tjeneste"); returner sant; } ellers returner falsk; // Få en referanse til karakteristikken i tjenesten til den eksterne BLE-serveren. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Fant vår egenskap"); returner sant; }
Hvis forbindelsen er vellykket, blir GPIO-pinnen 13 høy, og kontrollen blir sendt utenfor sløyfen ved å bruke bruddmeldingen. Den boolske variabelen som er paret, er også satt til å være sann.
hvis (connectToserver (* Server_BLE_Address)) { paret = sant; Serial.println ("******************** LED slått på ********************* ** "); digitalWrite (13, HØY); gå i stykker; }
Etter at sammenkoblingen er vellykket og GPIO-pinnen er slått på, må vi sjekke om enheten fremdeles er innen rekkevidde. Siden enheten nå er paret, vil BLE-skanningstjenesten ikke lenger kunne se den. Vi finner det bare igjen når brukeren forlater området. Så vi må bare skanne etter BLE-serveren, og hvis vi oppdager at vi må sette GPIO-pinnen til lav som vist nedenfor
hvis (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serial. println ("Enheten vår gikk utenfor rekkevidde"); paret = falsk; Seriell. println ("******************** LED OOOFFFFF ***********************"); digitalWrite (13, LAV); ESP. Omstart (); gå i stykker; }
Arbeid og testing
Når du er klar med programmet og maskinvareoppsettet, laster du bare opp koden til ESP32 og ordner hele oppsettet som vist nedenfor.
Du bør legge merke til at lampen slås på så snart treningsbåndet (serveren) kobles sammen med ESP32. Du kan også sjekke dette ved å legge merke til tilkoblingens Bluetooth-symbol på treningsbåndet. Når du er paret, er det bare å prøve å gå bort fra ESP32, og når du krysser 3-4 meter, vil du legge merke til at Bluetooth-symbolet på klokken forsvinner og forbindelsen går tapt. Nå, hvis du ser på lampen, blir den slått av. Når du går tilbake i enheten, blir enheten paret igjen og lyset tennes. Fullstendig bearbeiding av prosjektet finner du i videoen nedenfor.
Håper du likte prosjektet og lærte noe nytt på veien. Hvis du hadde problemer med å få det til å fungere, kan du gjerne legge ut problemet på forum eller til og med i kommentarfeltet nedenfor