- Forudsætninger
- Nødvendige materialer
- Hardware
- Få din Bluetooth-adresse på serveren (adresse på fitnessbåndet)
- Opnåelse af serverens service og karakteristiske UUID
- Programmering af ESP32 til at fungere som klient til Proximity Switch Application
- Arbejde og test
Hvor sejt det er at tænde lysene automatisk, så snart du kommer ind i dit hjem og slukker det igen, når du forlader! Ja, en simpel applikation kan gøre dette for dig. Her i dette projekt bruger vi ESP32 som BLE-klient og fitnessbånd som BLE-server, så når en person, der bærer fitnessbåndet, kommer inden for rækkevidde af ESP32 Bluetooth, registrerer ESP32 det og tænder lyset. Alle Bluetooth-enheder, der har BLE-serverfunktioner, kan bruges som en triggerenhed til at styre ethvert husholdningsapparat ved hjælp af ESP32.
Vi har allerede undersøgt BLE (Bluetooth Low Energy) -funktionaliteterne i ESP32-modulet, og jeg er meget begejstret for det. For at give en oversigt har dette modul både klassisk Bluetooth og Bluetooth Low Energy (BLE), den klassiske Bluetooth kan bruges til at overføre sange eller filer, og BLE-indstillingen kan bruges til batterioptimerede applikationer som Bluetooth-beacons, fitnessbånd, nærhed s osv. Det er også muligt at bruge det som en seriel Bluetooth som HC-05 eller HC-06 modulerne til enkle mikrocontroller projekter.
Som du ved, kan ESP32 BLE fungere i to forskellige tilstande. Den ene er servertilstand, som vi allerede har diskuteret ved at bruge GATT-tjenesten til at efterligne en batteriniveauindikatorservice. I den øvelse fungerede ESP32 som en server, og vores mobiltelefon fungerede som en klient. Lad os nu betjene ESP32 som en klient og prøve at forbinde den til andre BLE-servere som mit fitnessbånd.
Alle BLE-servere inklusive mit fitnessbånd er i konstant reklametilstand, dvs. de kan altid opdages, når de scannes af en klient. Ved at udnytte denne funktion kan vi bruge disse fitnessbånd som en nærhedsafbryder, hvilket betyder, at disse fitnessbånd altid er bundet til brugerens hånd, og ved at scanne efter båndet kan vi registrere, om personen er inden for rækkevidde. Dette er præcis, hvad vi skal gøre i denne artikel. Vi programmerer ESP32 til at fungere som en BLE-klient og konstant fortsætte med at scanne efter BLE-enheder; hvis vi finder fitnessbåndet inden for rækkevidde, vil vi prøve at oprette forbindelse til det, og hvis forbindelsen er vellykket, kan vi udløse en pære ved at skifte en af GPIO-benene på ESP32. Metoden er pålidelig, fordi hver BLE-server(fitnessbånd) har et unikt hardware-id, så ingen BLE-serverenheder er identiske. Interessant rigtigt? !!! Lad os nu bygge
Forudsætninger
I denne artikel antager jeg, at du allerede er bekendt med, hvordan du bruger ESP32-kortet med Arduino IDE, hvis ikke falder tilbage til at komme i gang med ESP32-tutorial.
Vi har opdelt den komplette ESP32 Bluetooth i tre segmenter for at gøre det lettere at forstå. Så det anbefales at gennemgå de to første tutorials, før du starter med denne.
- Seriel Bluetooth på ESP32 skifter LED fra mobiltelefon
- BLE-server til at sende data på batteriniveau til mobiltelefon ved hjælp af GATT Service
- BLE-klient til at scanne efter BLE-enheder og fungere som et fyrtårn.
Vi har allerede dækket de to første tutorials, her fortsætter vi med den sidste for at forklare ESP32 som BLE-klient.
Nødvendige materialer
- ESP32 Development Board
- AC-belastning (lampe)
- Relæmodul
Hardware
Hardwaren til dette ESP32 BLE Client-projekt er ret almindelig, da det meste af magien sker inde i koden. ESP32 skal skifte en AC-lampe (Load), når Bluetooth-signalet opdages eller mistes. For at skifte denne belastning bruger vi et relæ, og da GPIO-benene på ESP32 kun er 3,3 V kompatible, har vi brug for et relæmodul, der kan drives med 3,3 V. Tjek bare, hvilken transistor der bruges i relæmodulet, hvis det er BC548, du er god til at gå ellers bygge dit eget kredsløb ved at følge kredsløbsdiagrammet nedenfor.
Advarsel: Kredsløbet beskæftiger sig med direkte 220V AC-netspænding. Vær forsigtig med strømførende ledninger og sørg for, at du ikke opretter kortslutning. Du er blevet advaret.
Årsagen bag brugen af BC548 over BC547 eller 2N2222 er, at de har en lav base-emitter spænding, som kun kan udløses med kun 3,3 V. Den Relæet bruges her er en 5V relæ, så vi magten det med Vin pin som får 5V danne strømkablet. Jordstiften er forbundet til kredsløbets jord. Den Modstanden R1 1K anvendes som base strømbegrænser modstand. Fasekablet er forbundet til NO-stiften på relæet, og den fælles stift på relæet er forbundet til belastningen, og den anden ende af belastningen er forbundet til neutral. Du kan bytte positionen for fase og neutral, men pas på, at du ikke kortere dem direkte. Strømmen skal altid passere gennem belastningen (pæren).Jeg har brugt et relæmodul for at holde tingene enkle, og belastningen her er en Focus LED-lampe. Min opsætning ser sådan ud nedenfor
Hvis du vil springe hardwaren over indtil videre, kan du bruge GPIO 2-pin i stedet for GPIO 13-pin til at skifte den indbyggede LED på ESP32. Denne metode anbefales til begyndere.
Få din Bluetooth-adresse på serveren (adresse på fitnessbåndet)
Som tidligere fortalt skal vi programmere ESP32 til at fungere som klient (svarende til telefon) og oprette forbindelse til en server, der er mit fitnessbånd (Lenovo HW-01). For at en klient kan oprette forbindelse til serveren, skal den kende serverens Bluetooth-adresse. Hver Bluetooth-server som mit fitnessbånd her har sin egen unikke Bluetooth-adresse, som er permanent. Du kan relatere dette til MAC-adressen på din bærbare eller mobiltelefon.
For at få denne adresse fra serveren bruger vi applikationen kaldet nRF connect fra nordiske halvledere, som vi allerede havde brugt til vores tidligere tutorial. Den er tilgængelig gratis til både IOS- og Android-brugere. Du skal blot downloade, starte applikationen og scanne efter Bluetooth-enheder i nærheden. Applikationen viser alle de BLE-enheder, den finder. Mine hedder HW-01, se blot under dens navn, og du finder serverens hardware-adresse som vist nedenfor.
Så ESP32 BLE- hardwareadressen til mit fitnessbånd er C7: F0: 69: F0: 68: 81, du vil have et andet sæt numre i samme format. Bare noter det, da vi har brug for, når vi programmerer vores ESP32.
Opnåelse af serverens service og karakteristiske UUID
Okay, nu har vi identificeret vores server ved hjælp af BLE-adressen, men for at kommunikere med den er vi nødt til at tale servicens sprog og egenskaber, som du ville forstå, hvis du havde læst den foregående tutorial. I denne vejledning bruger jeg skrivekarakteristikken for min server (fitnessbånd) til at parre med den. Så for parring med enheden har vi brug for den serviceannonce Karakteristiske UUID, som vi igen kan få med den samme applikation.
Klik på forbindelsesknappen i din applikation, og søg efter nogle skriveegenskaber, hvor applikationen viser tjenesten UUID og den karakteristiske UUID. Min er vist nedenfor
Her er min Service UUID og karakteristiske UUID den samme, men den behøver ikke være den samme. Noter UUID på din server. Min blev noteret som
Service UUID: 0000fee7-0000-1000-8000-00805f9b34fb Karakteristisk UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Det er ikke obligatorisk at bruge skriveegenskaberne; du kan bruge enhver gyldig service og karakteristisk UUID for serveren, der vises i applikationen.
Programmering af ESP32 til at fungere som klient til Proximity Switch Application
Ideen med programmet er at få ESP32 til at fungere som en klient, der fortsætter med at scanne efter Bluetooth-enheder, når den finder vores server (fitnessbånd), det verificerer hardware-id'et, og det skifter lys gennem GPIO-pin 13. Nå okay! !, men der er et problem med det. Alle BLE-servere har en rækkevidde på 10 meter, hvilket er lidt for meget. Så hvis vi prøver at få nærhedsafbryderen til at tænde lyset for at åbne en dør, er dette interval meget højt.
For at reducere rækkevidden af BLE-serveren kan vi bruge parringsindstillingen. En BLE-server og klient forbliver kun parret, hvis begge er inden for en afstand på 3-4 meter. Det er perfekt til vores ansøgning. Så vi laver ESP32 ikke kun for at opdage BLE-serveren, men også for at oprette forbindelse til den og sørge for, om den forbliver parret. Så længe de er parret, forbliver vekselstrømslampen tændt, når rækkevidden overstiger, mister parringen, og lampen slukkes. Det komplette ESP32 BLE-eksempelprogram til at gøre det samme findes i slutningen af denne side. Nedenfor her deler jeg koden i små uddrag og prøver at forklare dem.
Efter at have inkluderet headerfilen informerer vi ESP32 om BLE-adressen, servicen og den karakteristiske UUID, som vi opnåede gennem nRF-forbindelsesapplikationen som forklaret i ovenstående overskrifter. Koden ser ud som nedenfor
statisk BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Service UUID af fitnessband opnået gennem nRF connect applikation statisk BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Karakteristisk UUID for fitnessband opnået gennem nRF connect-applikation String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hardware Bluetooth MAC på mit fitnessband , vil variere for hvert band, der opnås gennem nRF connect-applikationen
Efterfulgt af det i programmet har vi connectToserver og MyAdvertisedDeviceCallback, som vi kommer tilbage til senere. Derefter initialiserer vi den serielle skærm inde i installationsfunktionen og laver BLE på ESP for at scanne efter enheden. Når scanningen er gennemført for hver BLE-enhed opdaget kaldes funktionen MyAdvertisedDeviceCallbacks .
Vi aktiverer også aktiv scanning, da vi tænder for ESP32 med strøm, til batteriprogram er den slået fra for at reducere strømforbruget. Relay trigger pin er tilsluttet GPIO 13 i vores hardware, så vi erklærer også, at GPIO pin 13 som output.
ugyldig opsætning () { Serial.begin (115200); // Start seriel skærm Serial.println ("ESP32 BLE Server-program"); // Introduktionsmeddelelse BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // opret ny scanning pBLEScan-> setAdvertisedDeviceCallbacks (nye MyAdvertisedDeviceCallbacks ()); // Ring til klassen, der er defineret ovenfor, pBLEScan-> setActiveScan (true); // aktiv scanning bruger mere strøm, men får resultater hurtigere pinMode (13, OUTPUT); // Erklær den indbyggede LED-pin som output }
Inde i MyAdvertisedDeviceCallbacks- funktionen udskriver vi en linje, der viser navnet og anden information om de BLE-enheder, der blev opdaget. Vi har brug for hardware-id'et på BLE-enheden, der blev opdaget, så vi kan sammenligne det med den ønskede. Så vi bruger variablen Server_BLE_Address til at få enhedens adresse og derefter også til at 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 (); } };
Inde i loop- funktionen scanner vi i 3 sekunder og placerer resultatet inden for foundDevices, som er et objekt fra BLEScanResults. Hvis vi finder en eller flere enheder ved scanning, begynder vi at kontrollere, om den opdagede BLE-adresse stemmer overens med den, vi indtastede i programmet. Hvis kampen er positiv, og enheden ikke er parret tidligere, prøver vi at parre med den ved hjælp af connectToserver-funktionen. Vi har også brugt få serielle udsagn til forståelse af formålet.
mens (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Fundet enhed: -)… opretter forbindelse til server som klient"); hvis (connectToserver (* Server_BLE_Address)) {
Inde i connectToserver- funktionen bruger vi UUID til at parre med BLE-serveren (fitnessbånd). For at oprette forbindelse til en server skal ESP32 fungere som en klient, så vi opretter en klient ved hjælp af funktionen createClient () og opretter derefter forbindelse til BLE-serverens adresse. Derefter søger vi efter tjenesten og karakteristikken ved hjælp af UUID-værdierne og prøver at oprette forbindelse til den. Når forbindelsen er vellykket, returnerer funktionen en sand, og hvis ikke, returnerer den en falsk. Bemærk, at det ikke er obligatorisk at have service og karakteristisk UUID til at parre med en server, det gøres kun for din forståelse.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Oprettet klient"); // Opret forbindelse til BLE-serveren. pClient-> tilslut (pAddress); Serial.println ("- Forbundet til fitnessband"); // Få en henvisning til den service, vi søger på den eksterne BLE-server. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); hvis (pRemoteService! = nullptr) { Serial.println ("- Fundet vores service"); returner sandt } ellers returnere falsk; // Få en henvisning til karakteristikken i tjenesten til den eksterne BLE-server. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); hvis (pRemoteCharacteristic! = nullptr) Serial.println ("- Fundet vores karakteristiske"); returner sandt; }
Hvis forbindelsen er vellykket, bliver GPIO-pin 13 høj, og kontrollen sendes uden for sløjfen ved hjælp af bruderklæringen. Den boolske variabel, der er parret, er også indstillet til at være sand.
hvis (connectToserver (* Server_BLE_Address)) { parret = sandt; Serial.println ("******************** LED tændt ********************** ** "); digitalWrite (13, HIGH); pause; }
Når parringen er vellykket, og GPIO-stiften er tændt, skal vi kontrollere, om enheden stadig er inden for rækkevidde. Da enheden nu er parret, vil BLE-scanningstjenesten ikke længere kunne se den. Vi finder det kun igen, når brugeren forlader området. Så vi bliver simpelthen nødt til at scanne efter BLE-server, og hvis vi opdager, er vi nødt til at indstille GPIO-stiften til lav som vist nedenfor
hvis (Scaned_BLE_Address == My_BLE_Address && parret == true) { Serial. println ("Vores enhed gik uden for rækkevidde"); parret = falsk; Seriel. println ("******************** LED OOOFFFFF ***********************"); digitalWrite (13, LAV); ESP. Genstart (); pause; }
Arbejde og test
Når du er klar med programmet og hardwareopsætningen, skal du blot uploade koden til ESP32 og arrangere hele opsætningen som vist nedenfor.
Du bør bemærke, at lampen tændes, så snart fitnessbåndet (serveren) parres med ESP32. Du kan også kontrollere dette ved at lægge mærke til Bluetooth-forbindelsessymbolet på fitnessbåndet. Når du er parret, skal du bare prøve at gå væk fra ESP32, og når du krydser 3-4 meter, vil du bemærke, at Bluetooth-symbolet på uret forsvinder, og forbindelsen går tabt. Hvis du ser på lampen, slukkes den nu. Når du går tilbage i enheden, parres enheden igen, og lyset tændes. Den komplette bearbejdning af projektet kan findes i videoen nedenfor.
Håber du nød projektet og lærte noget nyt undervejs. Hvis du havde haft problemer med at få det til at fungere, er du velkommen til at sende problemet på fora eller endda i kommentarfeltet nedenfor