- Förutsättningar
- Material som krävs
- Hårdvara
- Skaffa din Bluetooth-adress till servern (adress till fitnessbandet)
- Få service och karakteristiska UUID för servern
- Programmering av ESP32 för att fungera som klient för Proximity Switch Application
- Arbeta och testa
Hur coolt det är att tända lamporna automatiskt så snart du går in i ditt hem och stänger av den igen när du lämnar! Ja, en enkel applikation kan göra detta åt dig. Här i detta projekt kommer vi att använda ESP32 som BLE-klient och fitnessband som BLE-server, så när en person som bär fitnessbandet kommer inom intervallet ESP32 Bluetooth, upptäcker ESP32 det och tänder ljuset. Alla Bluetooth-enheter som har BLE-serverfunktioner kan användas som en utlösningsenhet för att styra alla hushållsapparater med ESP32.
Vi har redan undersökt BLE (Bluetooth Low Energy) -funktionerna i ESP32-modulen och jag är ganska glad över det. För att ge en sammanfattning har denna modul både klassisk Bluetooth och Bluetooth Low Energy (BLE), den klassiska Bluetooth kan användas för att överföra låtar eller filer och alternativet BLE kan användas för batterioptimerade applikationer som Bluetooth-fyrar, fitnessband, närhet s, etc. Det är också möjligt att använda den som en seriell Bluetooth som HC-05 eller HC-06-modulerna för enkla mikroprojektprojekt.
Som du vet kan ESP32 BLE fungera i två olika lägen. Den ena är serverläget som vi redan har diskuterat genom att använda GATT-tjänsten för att efterlikna en batterinivåtjänst. I den övningen fungerade ESP32 som en server och vår mobiltelefon fungerade som en klient. Låt oss nu använda ESP32 som en klient och försöka ansluta den till andra BLE-servrar som mitt fitnessband.
Alla BLE-servrar inklusive mitt fitnessband är i konstant reklamläge, det vill säga de kan alltid upptäckas när de skannas av en klient. Genom att använda den här funktionen kan vi använda dessa fitnessband som en närhetsbrytare, vilket innebär att dessa fitnessband alltid är knutna till användarens hand och genom att skanna efter bandet kan vi upptäcka om personen är inom räckhåll. Det är precis vad vi ska göra i den här artikeln. Vi kommer att programmera ESP32 så att den fungerar som en BLE-klient och kontinuerligt fortsätter att söka efter BLE-enheter; om vi hittar träningsbandet inom räckhåll kommer vi att försöka ansluta till det och om anslutningen lyckas kan vi utlösa en glödlampa genom att växla en av GPIO-stiften på ESP32. Metoden är pålitlig eftersom varje BLE-server(fitnessband) har ett unikt hårdvaru-ID så att inga två BLE-serverenheter kommer att vara identiska. Intressant eller hur? !!! Nu ska vi bygga
Förutsättningar
I den här artikeln antar jag att du redan är bekant med hur du använder ESP32-kortet med Arduino IDE, om inte falla tillbaka för att komma igång med ESP32-handledning.
Vi har delat upp hela ESP32 Bluetooth i tre segment för att underlätta förståelsen. Så det rekommenderas att gå igenom de två första självstudierna innan du börjar med den här.
- Seriell Bluetooth på ESP32-växlingslampa från mobiltelefon
- BLE-server för att skicka batterinivådata till mobiltelefon med GATT-tjänsten
- BLE-klient för att söka efter BLE-enheter och fungera som en fyr.
Vi har redan täckt de två första självstudierna, här fortsätter vi med den sista för att förklara ESP32 som BLE-klient.
Material som krävs
- ESP32 Development Board
- AC-belastning (lampa)
- Relämodul
Hårdvara
Maskinvaran för detta ESP32 BLE Client-projekt är ganska enkel eftersom det mesta av magin händer i koden. ESP32 måste växla en AC-lampa (Load) när Bluetooth-signalen upptäcks eller går förlorad. För att växla mellan denna belastning kommer vi att använda ett relä, och eftersom GPIO-stiften på ESP32 endast är 3,3 V kompatibla behöver vi en relämodul som kan drivas med 3,3 V. Kontrollera bara vilken transistor som används i relämodulen om det är BC548 du är bra att gå annars bygga din egen krets genom att följa kretsschemat nedan.
Varning: Kretsen hanterar direkt 220V växelspänning. Var försiktig med strömförande ledningar och se till att du inte skapar en kortslutning. Du har blivit varnad.
Anledningen till att använda BC548 över BC547 eller 2N2222 är att de har en låg bas-emitterspänning som bara kan utlösas med 3,3 V. Det relä som används här är en 5V relä, så vi driva det med Vin stift som får 5V bildar strömkabeln. Jordstiftet är anslutet till kretsens jord. Den Motståndet R1 1K används som en bas strömbegränsare motstånd. Fasledningen är ansluten till NO-stiftet på reläet och det gemensamma stiftet på reläet är anslutet till lasten och den andra änden av lasten är ansluten till neutral. Du kan byta position för fas och neutral men se till att du inte kortsluter dem direkt. Strömmen ska alltid passera genom lasten (glödlampan).Jag har använt en relämodul för att hålla saker enkelt och belastningen här är en Focus LED-lampa. Min inställning ser ungefär så här ut
Om du vill hoppa över hårdvaran för tillfället kan du använda GPIO 2-stift istället för GPIO 13-stift för att växla ombord-lysdioden på ESP32. Denna metod rekommenderas för nybörjare.
Skaffa din Bluetooth-adress till servern (adress till fitnessbandet)
Som tidigare sagt kommer vi att programmera ESP32 så att den fungerar som en klient (liknar telefonen) och ansluter till en server som är mitt fitnessband (Lenovo HW-01). För att en klient ska kunna ansluta till servern måste den känna till serverns Bluetooth-adress. Varje Bluetooth-server som mitt fitnessband här har sin egen unika Bluetooth-adress som är permanent. Du kan relatera detta till MAC-adressen på din bärbara dator eller mobiltelefon.
För att få denna adress från servern använder vi applikationen kallad nRF connect från nordiska halvledare som vi redan använt för vår tidigare handledning. Den är tillgänglig gratis för både IOS- och Android-användare. Ladda bara ner, starta programmet och skanna efter Bluetooth-enheter i närheten. Applikationen kommer att lista alla BLE-enheter som den hittar. Gruvan heter HW-01, se bara under namnet och du hittar serverns maskinvaruadress som visas nedan.
Så ESP32 BLE- maskinvaruadressen för mitt fitnessband är C7: F0: 69: F0: 68: 81, du kommer att ha en annan uppsättning siffror i samma format. Anteckna det bara eftersom vi behöver när vi programmerar vår ESP32.
Få service och karakteristiska UUID för servern
Okej, nu har vi identifierat vår server med hjälp av BLE-adressen, men för att kommunicera med den måste vi prata språket för service och egenskaper, som du skulle förstå om du hade läst den tidigare självstudien. I denna handledning använder jag skrivkarakteristiken för min server (fitnessband) för att para ihop den. Så för att para ihop med enheten behöver vi tjänsteannonsen karaktäristiska UUID som vi kan få igen med samma applikation.
Klicka bara på anslutningsknappen i din applikation och sök efter några skrivegenskaper, där applikationen visar tjänsten UUID och den karakteristiska UUID. Gruvan visas nedan
Här är min Service UUID och Characteristic UUID densamma, men den behöver inte vara densamma. Anteckna UUID för din server. Gruvan noterades som
Service UUID: 0000fee7-0000-1000-8000-00805f9b34fb Karakteristisk UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Det är inte obligatoriskt att använda skrivegenskaperna; Du kan använda vilken giltig tjänst och karakteristiska UUID som helst på servern som visas i applikationen.
Programmering av ESP32 för att fungera som klient för Proximity Switch Application
Idén med programmet är att få ESP32 att fungera som en klient som fortsätter att söka efter Bluetooth-enheter när den hittar vår server (fitnessband), det verifierar hårdvaru-ID och det kommer att växla ljuset genom GPIO-stift 13. Tja okej! !, men det finns ett problem med det. Alla BLE-servrar har en räckvidd på 10 meter vilket är lite för mycket. Så om vi försöker göra närhetsbrytare för att tända ljuset för att öppna en dörr är detta intervall mycket högt.
För att minska BLE-servern kan vi använda parningsalternativet. En BLE-server och klient förblir ihopparade endast om båda ligger inom ett avstånd av 3-4 meter. Det är perfekt för vår applikation. Så vi gör ESP32 inte bara för att upptäcka BLE-servern utan också för att ansluta till den och se till om den förblir ihopparad. Så länge de är ihopkopplade kommer AC-lampan att förbli tänd, när räckvidden överskrider förloras parningen och lampan kommer att stängas av. Det kompletta exempelprogrammet för ESP32 BLE för att göra detsamma ges i slutet av denna sida. Nedan här kommer jag att dela upp koden i små utdrag och försöka förklara dem.
Efter att ha inkluderat rubrikfilen informerar vi ESP32 om BLE-adressen, tjänsten och den karakteristiska UUID som vi erhöll genom nRF-anslutningsprogrammet enligt ovanstående rubriker. Koden ser ut som nedan
statisk BLEUUID- tjänstUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Service-UUID för fitnessband erhållet genom statisk BLEUUID-charUUID för nRF connect-applikation ("0000fee7-0000-1000-8000-00805f9b34fb"); // Karakteristisk UUID för fitnessband erhållet genom nRF connect-applikation String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hårdvara Bluetooth MAC för mitt fitnessband , varierar för varje band som erhålls genom nRF connect-applikationen
Följt av det i programmet har vi connectToserver och MyAdvertisedDeviceCallback som vi kommer tillbaka till senare. Sedan i installationsfunktionen initialiserar vi den seriella bildskärmen och gör BLE på ESP för att söka efter enhet. När skanningen är klar för varje BLE-enhet som upptäcks kallas funktionen MyAdvertisedDeviceCallbacks .
Vi aktiverar också aktiv skanning eftersom vi drar ESP32 med nätström, för batteriprogram är det avstängt för att minska strömförbrukningen. Reläutlösarstiftet är anslutet till GPIO 13 i vår hårdvara, så vi förklarar också att GPIO-stift 13 som utgång.
ogiltig installation () { Serial.begin (115200); // Starta seriell bildskärm Serial.println ("ESP32 BLE Server-program"); // Introduktionsmeddelande BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // skapa ny skanning pBLEScan-> setAdvertisedDeviceCallbacks (nya MyAdvertisedDeviceCallbacks ()); // Ring den klass som definieras ovan pBLEScan-> setActiveScan (true); // aktiv skanning använder mer kraft, men får resultat snabbare pinMode (13, OUTPUT); // Förklara det inbyggda LED-stiftet som utgång }
Inuti MyAdvertisedDeviceCallbacks- funktionen skriver vi ut en rad som visar namnet och annan information om de BLE-enheter som upptäcktes. Vi behöver maskinvaru-ID för BLE-enheten som upptäcktes så att vi kan jämföra det med den önskade. Så vi använder variabeln Server_BLE_Address för att få adress till enheten och sedan också för att konvertera den från typ BLEAddress till sträng.
klass 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 (); } };
Inuti loopfunktionen skannar vi i 3 sekunder och lägger resultatet in i foundDevices som är ett objekt från BLEScanResults. Om vi hittar en eller flera enheter genom att skanna börjar vi kontrollera om den upptäckta BLE-adressen matchar den som vi angav i programmet. Om matchningen är positiv och enheten inte är parad tidigare försöker vi para ihop den med hjälp av connectToserver-funktionen. Vi har också använt några seriella uttalanden för att förstå syftet.
medan (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Found Device: -)… ansluter till servern som klient"); om (connectToserver (* Server_BLE_Address)) {
Inuti connectToserver- funktionen använder vi UUID för att para ihop med BLE-servern (fitnessband). För att ansluta till en server måste ESP32 fungera som en klient, så vi skapar en klient med funktionen createClient () och ansluter sedan till adressen till BLE-servern. Sedan söker vi efter tjänsten och karakteristiken med UUID-värdena och försöker ansluta till den. När anslutningen lyckas returnerar funktionen en true och om inte den returnerar en false. Observera att det inte är obligatoriskt att ha service och karakteristisk UUID för att para ihop med en server, det görs endast för din förståelse.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Skapad klient"); // Anslut till BLE-servern. pClient-> anslut (pAddress); Serial.println ("- Ansluten till fitnessband"); // Skaffa en hänvisning till den tjänst vi söker efter på fjärr BLE-servern. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); om (pRemoteService! = nullptr) { Serial.println ("- Hittade vår tjänst"); återvänd sant; } Annars retur false; // Skaffa en hänvisning till egenskapen i tjänsten på fjärr BLE-servern. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Hittade vår egenskap"); återvänd sant; }
Om anslutningen lyckas görs GPIO-stiftet 13 högt och styrningen skickas utanför slingan med hjälp av pausuttalandet. Den booleska variabeln som är parad är också inställd på att vara sant.
if (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** LED tänd PÅ ********************** ** "); digitalWrite (13, HÖG); ha sönder; }
När parkopplingen har lyckats och GPIO-stiftet är påslaget måste vi kontrollera om enheten fortfarande är inom räckhåll. Eftersom enheten nu är ihopparad kommer BLE-skanningstjänsten inte längre att kunna se den. Vi hittar det bara igen när användaren lämnar området. Så vi måste helt enkelt söka efter BLE-servern och om vi upptäcker att vi måste ställa in GPIO-stiftet till lågt som visas nedan
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serial. println ("Vår enhet gick utanför räckvidden"); parat = falskt; Serie. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP.start (); ha sönder; }
Arbeta och testa
När du är klar med programmet och hårdvaruuppsättningen laddar du bara upp koden till ESP32 och ordnar hela inställningen enligt nedan.
Du bör märka att lampan tänds så snart fitnessbandet (servern) kopplas ihop med ESP32. Du kan också kontrollera detta genom att märka anslutningens Bluetooth-symbol på fitnessbandet. När du är parad försöker du bara gå bort från ESP32 och när du korsar 3-4 meter kommer du att märka att Bluetooth-symbolen på klockan försvinner och anslutningen försvinner. Om du tittar på lampan kommer den att stängas av. När du går tillbaka i enheten paras ihop igen och ljuset tänds. Det fullständiga arbetet med projektet finns i videon nedan.
Hoppas att du gillade projektet och lärde dig något nytt på vägen. Om du hade haft problem med att få det att fungera, var god och lägg upp problemet på forum eller till och med i kommentarsektionen nedan