- Prerrequisitos
- Materiales necesarios
- Hardware
- Obtenga su dirección Bluetooth del servidor (dirección de la banda de fitness)
- Obtención del UUID de servicio y característica del servidor
- Programación del ESP32 para que actúe como cliente de la aplicación de interruptor de proximidad
- Trabajo y prueba
¡Qué genial es encender las luces automáticamente en cuanto entras en tu casa y volver a apagarlas cuando salgas! Sí, una simple aplicación puede hacer esto por ti. Aquí, en este proyecto, usaremos ESP32 como cliente BLE y banda de fitness como servidor BLE, por lo que cada vez que una persona que lleva la banda de fitness entra en el rango de ESP32 Bluetooth, el ESP32 lo detecta y enciende la luz. Cualquier dispositivo Bluetooth que tenga capacidades de servidor BLE se puede utilizar como un dispositivo de activación para controlar cualquier electrodoméstico mediante ESP32.
Ya hemos explorado las funcionalidades BLE (Bluetooth Low Energy) del módulo ESP32 y estoy bastante emocionado por ello. Para resumir, este módulo tiene Bluetooth clásico y Bluetooth Low Energy (BLE), el Bluetooth clásico se puede usar para transferir canciones o archivos y la opción BLE se puede usar para aplicaciones optimizadas para batería como balizas Bluetooth, bandas de fitness, dispositivos de proximidad., etc. También es posible utilizarlo como un Bluetooth serie como los módulos HC-05 o HC-06 para proyectos simples de microcontroladores.
Como sabe, el ESP32 BLE puede funcionar en dos modos diferentes. Uno es el modo de servidor que ya hemos discutido utilizando el servicio GATT para imitar un servicio de indicador de nivel de batería. En ese ejercicio, el ESP32 actuó como servidor y nuestro teléfono móvil actuó como cliente. Ahora, operemos el ESP32 como cliente e intentemos conectarlo a otros servidores BLE como mi banda de fitness.
Todos los servidores BLE, incluida mi banda de fitness, están en modo de publicidad constante, es decir, siempre se pueden descubrir cuando un cliente los escanea. Al aprovechar esta función, podemos usar estas bandas de fitness como un interruptor de proximidad, lo que significa que estas bandas de fitness siempre están atadas a la mano del usuario y al escanear la banda podemos detectar si la persona está dentro del alcance. Esto es exactamente lo que vamos a hacer en este artículo. Vamos a programar el ESP32 a actuar como un cliente BLE y constantemente mantener el escaneo de los dispositivos BLE; si encontramos la banda de fitness dentro del rango, intentaremos conectarnos a ella y si la conexión es exitosa, podemos activar una bombilla alternando uno de los pines GPIO en el ESP32. El método es confiable porque cada servidor BLE(banda de fitness) tendrá una ID de hardware única, por lo que no habrá dos dispositivos de servidor BLE idénticos. Interesante verdad? !!! Ahora, vamos a construir
Prerrequisitos
En este artículo, supongo que ya está familiarizado con cómo usar la placa ESP32 con Arduino IDE, si no, recurra a comenzar con el tutorial ESP32.
Hemos dividido el ESP32 Bluetooth completo en tres segmentos para facilitar su comprensión. Por lo tanto, se recomienda seguir los dos primeros tutoriales antes de comenzar con este.
- Bluetooth serial en ESP32 alternando LED desde el teléfono móvil
- Servidor BLE para enviar datos de nivel de batería al teléfono móvil mediante el servicio GATT
- Cliente BLE para buscar dispositivos BLE y actuar como baliza.
Ya hemos cubierto los dos primeros tutoriales, aquí vamos con el último para explicar ESP32 como cliente BLE.
Materiales necesarios
- Placa de desarrollo ESP32
- Carga CA (lámpara)
- Módulo de relé
Hardware
El hardware para este proyecto de cliente ESP32 BLE es bastante sencillo, ya que la mayor parte de la magia ocurre dentro del código. El ESP32 tiene que alternar una lámpara de CA (carga) cuando se descubre o se pierde la señal de Bluetooth. Para alternar esta carga usaremos un relé, y dado que los pines GPIO de ESP32 son solo compatibles con 3.3V, necesitamos un módulo de relé que se pueda manejar con 3.3V. Simplemente verifique qué transistor se usa en el módulo de relé, si es BC548, está listo para construir su propio circuito siguiendo el diagrama de circuito a continuación.
Advertencia: El circuito funciona con voltaje de red directo de 220 V CA. Tenga cuidado con los cables con corriente y asegúrese de no crear un cortocircuito. Usted ha sido advertido.
La razón detrás del uso de BC548 sobre BC547 o 2N2222 es que tienen un voltaje de emisor de base bajo que se puede activar con solo 3.3V. El relé que se utiliza aquí es un relé de 5 V, por lo que lo alimentamos con un pin Vin que obtiene 5 V del cable de alimentación. El pin de tierra está conectado a la tierra del circuito. La resistencia R1 1K se utiliza como una resistencia limitadora de corriente de base. El cable de fase está conectado al pin NO del relé y el pin común del relé está conectado a la carga y el otro extremo de la carga está conectado al neutro. Puede cambiar la posición de Fase y Neutral, pero tenga cuidado de no cortocircuitarlos directamente. La corriente siempre debe pasar a través de la carga (bombilla).He usado un módulo de relé para simplificar las cosas y la carga aquí es una lámpara LED Focus. Mi configuración se parece a esto a continuación
Si desea omitir el hardware por ahora, puede usar el pin GPIO 2 en lugar de GPIO 13 pin para alternar el LED integrado en ESP32. Este método se recomienda para principiantes.
Obtenga su dirección Bluetooth del servidor (dirección de la banda de fitness)
Como se dijo anteriormente, vamos a programar el ESP32 para que actúe como un cliente (similar al teléfono) y conectarnos a un servidor que es mi banda de fitness (Lenovo HW-01). Para que un cliente se conecte al servidor, debe conocer la dirección Bluetooth del servidor. Cada servidor Bluetooth, como mi banda de fitness aquí, tiene su propia dirección Bluetooth única que es permanente. Puede relacionar esto con la dirección MAC de su computadora portátil o teléfono móvil.
Para obtener esta dirección desde el servidor usamos la aplicación llamada nRF connect de los semiconductores nórdicos que ya habíamos usado para nuestro tutorial anterior. Está disponible de forma gratuita para usuarios de IOS y Android. Simplemente descargue, inicie la aplicación y busque los dispositivos Bluetooth cercanos. La aplicación listará todos los dispositivos BLE que encuentre. El mío se llama HW-01, simplemente mire debajo de su nombre y encontrará la dirección de hardware del servidor como se muestra a continuación.
Entonces, la dirección de hardware ESP32 BLE de mi banda de fitness es C7: F0: 69: F0: 68: 81, tendrá un conjunto diferente de números en el mismo formato. Solo tome nota de ello ya que lo necesitaremos cuando programemos nuestro ESP32.
Obtención del UUID de servicio y característica del servidor
Bien, ahora hemos identificado nuestro servidor usando la dirección BLE pero para poder comunicarnos con él necesitamos hablar el idioma del Servicio y las características, lo cual entendería si hubiera leído el tutorial anterior. En este tutorial, estoy usando la característica de escritura de mi servidor (banda de fitness) para emparejarlo. Entonces, para emparejar con el dispositivo, necesitamos el UUID de característica del anuncio de servicio que podemos obtener nuevamente con la misma aplicación.
Simplemente haga clic en el botón de conexión en su aplicación y busque algunas características de escritura, donde la aplicación mostrará el UUID del servicio y el UUID característico. El mío se muestra a continuación
Aquí mi UUID de servicio y UUID de característica es el mismo, pero no tiene por qué ser el mismo. Anote el UUID de su servidor. El mío se anotó como
UUID del servicio: 0000fee7-0000-1000-8000-00805f9b34fb UUID característico: 0000fee7-0000-1000-8000-00805f9b34fb
No es obligatorio utilizar las características de escritura; puede utilizar cualquier servicio válido y UUID característico del servidor que se muestra en la aplicación.
Programación del ESP32 para que actúe como cliente de la aplicación de interruptor de proximidad
La idea del programa es hacer que el ESP32 actúe como un cliente que sigue buscando dispositivos Bluetooth cuando encuentra nuestro servidor (banda de fitness), verifica la identificación del hardware y alternará la luz a través del pin 13. GPIO. ¡Bien! !, pero hay un problema con eso. Todos los servidores BLE tendrán un alcance de 10 metros, lo cual es demasiado. Entonces, si estamos tratando de hacer un interruptor de proximidad para encender la luz o abrir una puerta, este rango es muy alto.
Para reducir el alcance del servidor BLE podemos utilizar la opción de emparejamiento. Un servidor y un cliente BLE permanecerán emparejados solo si ambos están a una distancia de 3-4 metros. Eso es perfecto para nuestra aplicación. Por lo tanto, hacemos el ESP32 no solo para descubrir el servidor BLE, sino también para conectarnos a él y asegurarnos de que permanece emparejado. Mientras estén emparejados, la lámpara de CA permanecerá encendida, cuando el rango exceda, el emparejamiento se perderá y la lámpara se apagará. El programa de ejemplo completo de ESP32 BLE para hacer lo mismo se proporciona al final de esta página. A continuación, dividiré el código en pequeños fragmentos e intentaré explicarlos.
Después de incluir el archivo de encabezado, informamos al ESP32 sobre la dirección BLE, el servicio y el UUID característico que obtuvimos a través de la aplicación de conexión nRF como se explica en los encabezados anteriores. El código se ve a continuación
servicio BLEUUID estáticoUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID de servicio de fitnessband obtenido a través de la aplicación nRF connect static BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // UUID característico de fitnessband obtenido a través de la aplicación nRF connect String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hardware Bluetooth MAC de mi fitnessband , variará para cada banda obtenida a través de la aplicación nRF connect
Seguido de eso en el programa tenemos el connectToserver y MyAdvertisedDeviceCallback al que volveremos más adelante. Luego, dentro de la función de configuración , inicializamos el monitor en serie y hacemos el BLE en ESP para buscar el dispositivo. Una vez que se completa el escaneo para cada dispositivo BLE descubierto, se llama a la función MyAdvertisedDeviceCallbacks .
También habilitamos el escaneo activo ya que estamos alimentando el ESP32 con la red eléctrica, para la aplicación de la batería se apaga para reducir el consumo de corriente. El pin de disparo del relé está conectado a GPIO 13 en nuestro hardware, por lo que también declaramos que el pin 13 de GPIO como salida.
configuración vacía () { Serial.begin (115200); // Iniciar el monitor de serie Serial.println ("Programa de servidor ESP32 BLE"); // Mensaje de introducción BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // crear un nuevo escaneo pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Llame a la clase que se define arriba pBLEScan-> setActiveScan (true); // el escaneo activo usa más energía, pero obtiene resultados más rápido pinMode (13, OUTPUT); // Declare el pin LED incorporado como salida }
Dentro de la función MyAdvertisedDeviceCallbacks , imprimimos una línea que mostrará el nombre y otra información de los dispositivos BLE que se descubrieron. Necesitamos el ID de hardware del dispositivo BLE que se descubrió para poder compararlo con el deseado. Entonces usamos la variable Server_BLE_Address para obtener la dirección del dispositivo y luego también para convertirlo del tipo BLEAddress a string.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Resultado de escaneo:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = new BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Dentro de la función de bucle , escaneamos durante 3 segundos y colocamos el resultado dentro de foundDevices, que es un objeto de BLEScanResults. Si encontramos uno o más de un dispositivo al escanear, comenzamos a verificar si la dirección BLE descubierta coincide con la que ingresamos en el programa. Si la coincidencia es positiva y el dispositivo no está emparejado antes, intentamos emparejarlo usando la función connectToserver. También hemos utilizado algunas declaraciones en serie para comprender el propósito.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Dispositivo encontrado: -)… conectando al servidor como cliente"); if (connectToserver (* Server_BLE_Address)) {
Dentro de la función connectToserver hacemos uso del UUID para emparejarnos con el servidor BLE (fitness band). Para conectarse con un servidor, el ESP32 tiene que actuar como un cliente, entonces creamos un cliente usando la función createClient () y luego nos conectamos a la dirección del servidor BLE. Luego buscamos el servicio y la característica usando los valores UUID e intentamos conectarnos a él. Cuando la conexión es exitosa, la función devuelve verdadero y si no, devuelve falso. Tenga en cuenta que no es obligatorio tener servicio y UUID característico para emparejarse con un servidor, se hace solo para su comprensión.
bool connectToserver (pAddress BLEAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Cliente creado"); // Conéctese al servidor BLE. pCliente-> conectar (pAddress); Serial.println ("- Conectado a fitnessband"); // Obtener una referencia al servicio que buscamos en el servidor BLE remoto. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Encontramos nuestro servicio"); devuelve verdadero; } si no devuelve falso; // Obtener una referencia a la característica en el servicio del servidor BLE remoto. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Encontramos nuestra característica"); devuelve verdadero; }
Si la conexión es exitosa, el pin GPIO 13 se hace alto y el control se envía fuera del bucle mediante la instrucción break. La variable booleana emparejada también se establece como verdadera.
if (connectToserver (* Server_BLE_Address)) { emparejado = verdadero; Serial.println ("******************** LED encendido ********************* ** "); digitalWrite (13, ALTO); romper; }
Después de que el emparejamiento sea exitoso y el pin GPIO esté encendido, debemos verificar si el dispositivo todavía está dentro del alcance. Dado que ahora el dispositivo está emparejado, el servicio de escaneo BLE ya no podrá verlo. Lo volveremos a encontrar solo cuando el usuario abandone la zona. Así que simplemente tenemos que buscar el servidor BLE y, si descubrimos, tenemos que configurar el pin GPIO en bajo como se muestra a continuación.
if (Scaned_BLE_Address == My_BLE_Address && emparejado == verdadero) { Serial. println ("Nuestro dispositivo salió de rango"); emparejado = falso; De serie. println ("******************** LED OOOFFFFF ***********************"); digitalWrite (13, BAJO); ESP.restart (); romper; }
Trabajo y prueba
Una vez que esté listo con el programa y la configuración del hardware, simplemente cargue el código en el ESP32 y organice toda la configuración como se muestra a continuación.
Debería notar que la lámpara se enciende tan pronto como la banda de fitness (servidor) se empareja con el ESP32. También puede verificar esto observando el símbolo de conexión Bluetooth en la banda de fitness. Una vez emparejado, intente alejarse del ESP32 y cuando cruce los 3-4 metros notará que el símbolo de Bluetooth en el reloj desaparece y se pierde la conexión. Ahora, si miras la lámpara, se apagará. Cuando regresa, el dispositivo se empareja nuevamente y la luz se enciende. El funcionamiento completo del proyecto se puede encontrar en el video a continuación.
Espero que hayas disfrutado del proyecto y hayas aprendido algo nuevo en el camino. Si ha tenido algún problema para que funcione, no dude en publicar el problema en foros o incluso en la sección de comentarios a continuación.