- Requisits previs
- Materials necessaris
- Maquinari
- Obteniu la vostra adreça Bluetooth del servidor (adreça de la banda de fitness)
- Obtenció del servei i UUID característic del servidor
- La programació de l'ESP32 actua com a client per a l'aplicació de commutació de proximitat
- Treball i proves
Què guai que encengueu els llums automàticament tan aviat com entreu a casa i torneu a apagar-los quan sortiu! Sí, una aplicació senzilla pot fer-ho per vosaltres. Aquí, en aquest projecte, utilitzarem ESP32 com a client BLE i banda de fitness com a servidor BLE, de manera que cada vegada que una persona que porta la banda de fitness entra dins de la gamma d’ESP32 Bluetooth, l’ESP32 el detecta i encén la llum. Qualsevol dispositiu Bluetooth que tingui funcions de servidor BLE es pot utilitzar com a dispositiu activador per controlar qualsevol electrodomèstic que utilitzi ESP32.
Ja hem explorat les funcionalitats BLE (Bluetooth Low Energy) del mòdul ESP32 i estic encantat. Per fer una recapitulació, aquest mòdul té tant el Bluetooth clàssic com el Bluetooth Low Energy (BLE), el Bluetooth clàssic es pot utilitzar per transferir cançons o fitxers i l’opció BLE es pot utilitzar per a aplicacions optimitzades per la bateria com balises Bluetooth, bandes de fitness,, etc. També és possible utilitzar-lo com a Bluetooth en sèrie com els mòduls HC-05 o HC-06 per a projectes senzills de microcontroladors.
Com ja sabeu, l' ESP32 BLE pot funcionar en dos modes diferents. Un és el mode de servidor que ja hem comentat mitjançant l’ús del servei GATT per imitar un servei d’indicadors de nivell de bateria. En aquest exercici, l’ESP32 feia de servidor i el nostre telèfon mòbil feia de client. Ara, fem servir l'ESP32 com a client i provem de connectar-lo a altres servidors BLE com la meva banda de fitness.
Tots els servidors BLE, inclosa la meva banda física, estan en mode de publicitat constant, és a dir, sempre es poden descobrir quan un client els escaneja. Aprofitant aquesta funció, podem utilitzar aquestes bandes de fitness com a interruptor de proximitat, és a dir, que aquestes bandes de fitness sempre estan lligades a la mà de l’usuari i en cercar la banda podem detectar si la persona es troba dins del seu abast. Això és exactament el que farem en aquest article. Anem a programar el ESP32 a actuar com un client BLE i constantment mantenir l'escaneig dels dispositius BLE; si trobem la banda de fitness a l'abast, provarem de connectar-nos-hi i, si la connexió té èxit, podem activar una bombeta alternant un dels pins GPIO de l'ESP32. El mètode és fiable perquè cada servidor BLE(fitness band) tindrà un identificador de maquinari únic, de manera que no hi haurà dos dispositius de servidor BLE idèntics. Interessant oi? !!! Ara, anem a construir
Requisits previs
En aquest article, suposo que ja esteu familiaritzats amb l’ús de la placa ESP32 amb Arduino IDE, si no, tornareu a començar amb el tutorial ESP32.
Hem dividit el Bluetooth ESP32 complet en tres segments per facilitar la comprensió. Per tant, es recomana passar pels dos primers tutorials abans de començar amb aquest.
- Bluetooth de sèrie al LED alternatiu ESP32 des del telèfon mòbil
- Servidor BLE per enviar dades de nivell de bateria al telèfon mòbil mitjançant el servei GATT
- Client BLE per cercar dispositius BLE i actuar com un far.
Ja hem tractat els dos primers tutorials, aquí estem procedint amb l'últim per explicar ESP32 com a client BLE.
Materials necessaris
- Junta de desenvolupament ESP32
- Càrrega CA (llum)
- Mòdul de relés
Maquinari
El maquinari d’aquest projecte ESP32 BLE Client és bastant senzill, ja que la major part de la màgia passa dins del codi. L'ESP32 ha de commutar una llum AC (Load) quan es descobreix o es perd el senyal Bluetooth. Per canviar aquesta càrrega utilitzarem un relé i, ja que els pins GPIO de l’ESP32 només són compatibles amb 3,3 V, necessitem un mòdul de relé que es pugui accionar amb 3,3 V. Només cal que comproveu quin transistor s’utilitza al mòdul de relé si és BC548, és bo anar a construir el vostre propi circuit seguint el diagrama de circuits següent.

Advertència: el circuit tracta de tensió de xarxa de 220V CA directa. Aneu amb compte amb els cables actius i assegureu-vos que no creeu un curtcircuit. Has estat avisat.
La raó per la qual s’utilitza BC548 sobre BC547 o 2N2222 és que tenen un voltatge baix de l’emissor base que es pot activar amb només 3,3 V. El relé utilitzat aquí és un relé de 5V, de manera que l’alimentem amb pin Vin que obté 5V del cable d’alimentació. El pas de terra està connectat a la terra del circuit. La resistència R1 1K s'utilitza com a resistència limitadora de corrent base. El cable de fase està connectat al pin NO del relé i el pin comú del relé està connectat a la càrrega i l'altre extrem de la càrrega està connectat a Neutral. Podeu canviar la posició de Fase i Neutre, però tingueu cura que no els reduïu directament. El corrent sempre ha de passar per la càrrega (bombeta).He utilitzat un mòdul de retransmissió per simplificar les coses i la càrrega aquí és un llum LED Focus. La meva configuració té un aspecte semblant a continuació

Si voleu saltar-vos el maquinari ara mateix, podeu utilitzar el pin GPIO 2 en lloc del pin GPIO 13 per canviar el LED de la placa ESP32. Aquest mètode es recomana als principiants.
Obteniu la vostra adreça Bluetooth del servidor (adreça de la banda de fitness)
Com s’ha dit anteriorment, programarem l’ESP32 perquè actuï com a client (similar al telèfon) i ens connectem a un servidor que és la meva banda de fitness (Lenovo HW-01). Perquè un client es connecti al servidor, ha de conèixer l’adreça Bluetooth del servidor. Tots els servidors Bluetooth com la meva banda de fitness tenen la seva pròpia adreça Bluetooth única, que és permanent. Podeu relacionar-ho amb l'adreça MAC del vostre ordinador portàtil o telèfon mòbil.
Per obtenir aquesta adreça del servidor, fem servir l’aplicació anomenada nRF connect de semiconductors nòrdics que ja havíem utilitzat per al nostre tutorial anterior. Està disponible de forma gratuïta tant per a usuaris d’IOS com d’Android. Simplement descarregueu, inicieu l'aplicació i cerqueu els dispositius Bluetooth que hi ha a prop. L'aplicació mostrarà tots els dispositius BLE que trobi. El meu es diu HW-01, simplement mireu a sota del seu nom i trobareu l'adreça de maquinari del servidor com es mostra a continuació.

Per tant, l’ adreça de maquinari ESP32 BLE de la meva banda de condicionament físic és C7: F0: 69: F0: 68: 81, tindreu un conjunt de números diferent en el mateix format. Només cal anotar-ho, ja que el necessitarem quan programem el nostre ESP32.
Obtenció del servei i UUID característic del servidor
D’acord, ara hem identificat el nostre servidor mitjançant l’adreça BLE, però per comunicar-nos-hi hem de parlar l’idioma del servei i les característiques, que entendríeu si hagués llegit el tutorial anterior. En aquest tutorial estic fent servir la característica d'escriptura del meu servidor (fitness band) per aparellar-la. Per tant, per emparellar-nos amb el dispositiu necessitem l’UUID característic de l’anunci de servei que podem tornar a obtenir amb la mateixa aplicació.
Simplement feu clic al botó de connexió de la vostra aplicació i cerqueu algunes característiques d’escriptura, on l’aplicació mostrarà el UUID del servei i l’UUID característic. La meva es mostra a continuació

Aquí el meu UUID de servei i UUID característic són els mateixos, però no ha de ser el mateix. Anoteu la UUID del vostre servidor. La meva es va assenyalar com a
UUID del servei: 0000fee7-0000-1000-8000-00805f9b34fb UUID característica: 0000fee7-0000-1000-8000-00805f9b34fb
No és obligatori utilitzar les característiques d'escriptura; podeu utilitzar qualsevol servei vàlid i UUID característic del servidor que es mostra a l'aplicació.
La programació de l'ESP32 actua com a client per a l'aplicació de commutació de proximitat
La idea del programa és fer que l’ESP32 actuï com un client que continua buscant dispositius Bluetooth quan troba el nostre servidor (banda de condicionament físic), verifica l’ID de maquinari i canviarà la llum a través del pin GPIO 13. Doncs bé, està bé! !, però hi ha un problema. Tots els servidors BLE tindran un abast de 10 metres, una mica massa. Per tant, si intentem fer que el commutador de proximitat encengui la llum d’obrir una porta, aquest rang és molt alt.
Per reduir l'abast del servidor BLE podem utilitzar l'opció de sincronització. Un servidor BLE i un client es mantindran vinculats només si tots dos es troben a una distància de 3-4 metres. Això és perfecte per a la nostra aplicació. Per tant, fem de l’ESP32 no només per descobrir el servidor BLE, sinó també per connectar-s’hi i assegurar-nos si continua aparellat. Mentre estiguin emparellats, el llum AC continuarà encès, quan es perdi el rang que excedeixi el parell i el llum s’apagarà. El programa d’exemple complet ESP32 BLE per fer el mateix es dóna al final d’aquesta pàgina. A continuació, dividiré el codi en petits fragments i intentaré explicar-los.
Després d’incloure el fitxer de capçalera, informem l’ESP32 sobre l’adreça BLE, el servei i l’UUID característic que hem obtingut mitjançant l’aplicació de connexió nRF tal com s’explica als encapçalaments anteriors. El codi es veu a continuació
servei BLEUUID estàticUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID del servei de fitnessband obtingut mitjançant l'aplicació de connexió nRF estàtica BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID característic de fitnessband obtingut mitjançant l'aplicació de connexió nRF String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Maquinari Bluetooth MAC de la meva banda física , variarà per a cada banda obtinguda mitjançant l’aplicació de connexió nRF
Seguidament, al programa tenim el connectToserver i MyAdvertisedDeviceCallback, que tornarem a trobar més endavant. A continuació, dins de la funció de configuració , inicialitzem el monitor sèrie i fem el BLE a ESP per buscar el dispositiu. Un cop finalitzada l'exploració de cada dispositiu BLE descobert, s'anomena la funció MyAdvertisedDeviceCallbacks .
També activem l’escaneig actiu, ja que estem alimentant l’ESP32 amb alimentació de xarxa, per a l’aplicació de bateries està apagat per reduir el consum actual. El pin d'activador de relé està connectat a GPIO 13 al nostre maquinari, de manera que també declarem que el pin GPIO 13 com a sortida.
configuració nul·la () { Serial.begin (115200); // Inicieu el monitor sèrie Serial.println ("programa del servidor ESP32 BLE"); // Missatge inicial BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // crear un nou escaneig pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Truqueu a la classe que es defineix més amunt pBLEScan-> setActiveScan (true); // l'escaneig actiu utilitza més energia, però obté resultats pinMode més ràpid (13, OUTPUT); // Declareu el pin LED incorporat com a sortida }
Dins de la funció MyAdvertisedDeviceCallbacks , imprimim una línia que mostrarà el nom i altra informació dels dispositius BLE que es van descobrir. Necessitem l’identificador de maquinari del dispositiu BLE que es va descobrir per poder comparar-lo amb el desitjat. Per tant, fem servir la variable Server_BLE_Address per obtenir l’adreça del dispositiu i després també per convertir-la del tipus BLEAddress a cadena.
classe MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Resultat d'escaneig:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = new BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Dins de la funció de bucle , escanejem durant 3 segons i posem el resultat dins de foundDevices que és un objecte de BLEScanResults. Si escanejem un o més dispositius, comencem a comprovar si l'adreça BLE descoberta coincideix amb la que hem introduït al programa. Si la coincidència és positiva i el dispositiu no està emparellat abans, provem d’aparellar-lo mitjançant la funció connectToserver. També hem utilitzat poques declaracions en sèrie per entendre el propòsit.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Dispositiu trobat: -)… connectant-se al servidor com a client"); if (connectToserver (* Server_BLE_Address)) {
Dins de la funció connectToserver fem ús de l’UUID per emparellar-lo amb el servidor BLE (fitness band). Per connectar-se amb un servidor, l’ESP32 ha d’actuar com a client, de manera que creem un client mitjançant la funció createClient () i després ens connectem a l’adreça del servidor BLE. A continuació, cerquem el servei i la característica mitjançant els valors UUID i provem de connectar-nos-hi. Quan la connexió té èxit, la funció retorna un valor vertader i, si no, torna un valor fals. Tingueu en compte que no és obligatori tenir servei i UUID característics per emparellar-los amb un servidor, només es fa per a la vostra comprensió.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Client creat"); // Connecteu-vos al servidor BLE. pClient-> connect (pAddress); Serial.println ("- Connectat a fitnessband"); // Obteniu una referència al servei que estem buscant al servidor BLE remot. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Hem trobat el nostre servei"); tornar cert; } else return false; // Obteniu una referència a la característica al servei del servidor BLE remot. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Hem trobat la nostra característica"); tornar cert; }
Si la connexió té èxit, el pin 13 GPIO es posa alt i el control s’envia fora del bucle mitjançant l’instrucció break. La variable booleana emparellada també es defineix com a veritable.
if (connectToserver (* Server_BLE_Address)) { parellat = cert; Serial.println ("******************** LED encès ********************** ** "); digitalWrite (13, ALTA); trencar; }
Quan l’emparellament tingui èxit i el pin GPIO estigui activat, hem de comprovar si el dispositiu encara està al seu abast. Com que ara el dispositiu està emparellat, el servei d’escaneig BLE ja no el podrà veure. El tornarem a trobar només quan l’usuari abandoni la zona. Per tant, simplement hem d’ escanejar el servidor BLE i, si ho descobrim, hem d’establir el pin GPIO a baix, tal com es mostra a continuació
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Sèrie. println ("El nostre dispositiu ha quedat fora de l'abast"); aparellat = fals; En sèrie. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, BAIX); ESP.restart (); trencar; }
Treball i proves
Un cop estigueu llest amb el programa i la configuració del maquinari, simplement pengeu el codi a l'ESP32 i organitzeu tota la configuració tal com es mostra a continuació.

Heu de notar que el llum s’encén tan bon punt la banda de fitness (servidor) s’aparella amb l’ESP32. També podeu comprovar-ho observant el símbol Bluetooth de connexió a la banda de fitness. Un cop emparellat, intenteu allunyar-vos de l’ESP32 i, quan creueu 3-4 metres, notareu que el símbol Bluetooth del rellotge desapareix i es perd la connexió. Ara, si mireu el llum, s’apagarà. Quan torneu a entrar, el dispositiu torna a aparellar-se i s’encén la llum. El funcionament complet del projecte es troba al vídeo següent.
Espero que us hagi agradat el projecte i hàgiu après alguna cosa nova. Si us heu enfrontat a algun problema per aconseguir que funcioni, no dubteu a publicar el problema als fòrums o fins i tot a la secció de comentaris de sota
