- Componentes requeridos
- Uso de la aplicación de Android nRF Connect para ESP32 iBeacon
- Programación de ESP32 para que funcione como BLE iBeacon
ESP32 es realmente un poderoso dispositivo IoT que tiene soporte incorporado para Bluetooth y WiFi. El ESP32 es una versión avanzada de su predecesor ESP8266 con características adicionales como RAM, ROM, pines GPIO, etc. El módulo ESP32 es compatible con Bluetooth clásico y Bluetooth Low Energy (BLE), el Bluetooth clásico se puede usar para transferir canciones o archivos y el BLE La opción se puede usar para aplicaciones optimizadas para batería como balizas Bluetooth, bandas de fitness, dispositivos de proximidad, etc. También es posible usar ESP32 como un Bluetooth en serie como los módulos HC-05 o HC-06 para proyectos simples de microcontroladores.
Como sabemos, el BLE puede funcionar en dos modos diferentes: modo servidor y modo cliente. Ambos modos se han discutido en nuestros Tutoriales ESP32 anteriores:
- Servidor ESP32 BLE - Servicio GATT para indicación de nivel de batería
- Cliente ESP32 BLE: conexión a una banda de fitness para activar una bombilla
En este tutorial, crearemos un BLE iBeacon usando ESP32 donde ESP32 actuará como servidor y el teléfono inteligente actuará como cliente. Supongo que ya está familiarizado con cómo usar la placa ESP32 con Arduino IDE, si no, recurra al tutorial de introducción a ESP32.
También puede saber más sobre qué es la tecnología Beacon / iBeacon revisando nuestros proyectos anteriores de Bluetooth iBeacon utilizando Raspberry Pi y HM-10 BLE iBeacon.
Componentes requeridos
Hardware:
- Placa de desarrollo ESP32
- Cable micro USB
Software:
- IDE de Arduino
- Aplicación de Android: nRF Connect para dispositivos móviles (por Nordic Semiconductor)
Hay muchas aplicaciones de escáner BLE, una de ellas la hemos utilizado en nuestro proyecto anterior de Cómo usar el módulo BLE HM-10 con Arduino. Esta aplicación de escáner BLE proporciona una buena interfaz gráfica (GUI) pero carece de información adicional, por lo que en este proyecto estamos utilizando la aplicación NRF Connect for Mobile.
Uso de la aplicación de Android nRF Connect para ESP32 iBeacon
1. Descargue la aplicación nRF Connect de Google Play Store y ábrala.
2. La pantalla se ve a continuación. Las opciones útiles para este proyecto serán 'Escanear', 'Escáner' e 'Información' cuando se encuentren los dispositivos.
La opción 'Escanear' se utilizará para ver todos los iBeacons disponibles. Para comenzar a buscar el iBeacon, baje la pantalla o vaya a la opción 'Escanear' en la esquina superior derecha de la pantalla. Esto comenzará a buscar los iBeacons disponibles.
3.Después de buscar en iBeacon, podrá ver el RSSI, UUID, Major y Minor de iBeacon. El RSSI cambiará si separa el móvil o el iBeacon. Aquí en esta pantalla, el RSSI es (-37). Aparte de esto, hay algunos detalles como el nombre de la empresa ficticia, el tipo de dispositivo, la longitud de los bytes, el nombre local de ESP32. Aquí está " ESP32 como iBeacon ". Puede cambiar el nombre local en el croquis.
4. Después de quitar el teléfono inteligente de iBeacon, el valor de RSSI cambia de -37 a -58. Estos valores seguirán cambiando si mueve uno de los dispositivos.
Los valores aceptables de la señal RSSI son los siguientes:
Intensidad de señal | TL; DR | Requerido para | |
---|---|---|---|
-30 dBm | Asombroso | Intensidad de señal máxima alcanzable. El cliente solo puede estar a unos metros del AP para lograrlo. No es típico ni deseable en el mundo real. | N / A |
-67 dBm | Muy bien | Intensidad de señal mínima para aplicaciones que requieren una entrega de paquetes de datos muy confiable y puntual. | VoIP / VoWiFi, transmisión de video |
-70 dBm | Bueno | Intensidad de señal mínima para una entrega de paquetes confiable. | Correo electrónico, web |
-80 dBm | No está bien | Intensidad de señal mínima para conectividad básica. La entrega de paquetes puede no ser confiable. | N / A |
-90 dBm | Inutilizable | Acercándose o ahogándose en el piso de ruido. Es muy poco probable que exista alguna funcionalidad. | N / A |
Programación de ESP32 para que funcione como BLE iBeacon
Hay un programa de muestra de ESP32 BLE iBeacon disponible cuando instala la placa ESP32 en Arduino IDE. Pero hemos editado ligeramente este boceto en este tutorial, la versión editada completa del programa de muestra se encuentra al final de este tutorial.
Para abrir el programa de muestra de ESP32 BLE_iBeacon, simplemente siga los pasos a continuación.
- Abra Arduino IDE y seleccione "Módulo de desarrollo ESP32". (Si no encuentra esta placa, compruebe si ha instalado el paquete de placa ESP32)
- Vaya a Archivo > Ejemplos > ESP32 BLE Arduino > BLE_iBeacon
- Abra el boceto "BLE_iBeacon".
Ahora hay una pequeña modificación en el código que se realiza en este tutorial. El nombre de ESP32 también se actualizará en este boceto. Así que comience con la inclusión de las bibliotecas necesarias que se utilizarán en la creación de un servidor BLE e iBeacon.
#include "sys / time.h"
Esta es una biblioteca de tiempo para obtener la hora actual del sistema. Contiene funciones como tv_sec, gettimeofday (), etc. Para obtener más información, puede visitar la versión oficial de UNIX de ' sys / time.h'.
Luego, se incluyen las bibliotecas ESP32 BLE que contienen muchas funciones que se utilizan para hacer ESP32 en diferentes configuraciones, como BLE Client o BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Se incluye la biblioteca iBeacon que establece el ESP32 como iBeacon. Junto con esto, se incluye la biblioteca de sueño profundo para ESP32. La biblioteca se utilizará para enviar ESP32 en modo de suspensión profunda durante un período de tiempo definido.
#include "BLEBeacon.h" #include "esp_sleep.h"
Defina la duración del sueño para ESP32. Aquí, el ESP32 estará en sueño profundo durante 10 segundos y se anunciará y luego volverá a dormir profundo durante 10 segundos.
#define GPIO_DEEP_SLEEP_DURATION 10
Aquí se define el RTC_DATA_ATTR. Tenga en cuenta que si define una variable global con el atributo RTC_DATA_ATTR, la variable se colocará en la memoria RTC_SLOW_MEM. Entonces, la estructura declarada como RTC_DATA_ATTR y copiar la memoria dinámica a esta estructura antes de un sueño profundo ayuda a recuperarla en la memoria dinámica después de despertar. En palabras sencillas estamos ahorrando el tiempo en la memoria estática de la memoria dinámica para recuperarlo nuevamente después de un sueño profundo. Aquí se definen las dos variables. El ' último ' se usa para obtener la última vez que el ESP32 entró en suspensión profunda y se usó bootcount para contar el número de reinicios.
RTC_DATA_ATTR static time_t last; RTC_DATA_ATTR static uint32_t bootcount;
Luego defina el tipo de publicidad BLE. La definición se realiza de la siguiente manera.
BLEAdvertising * pAdvertising;
El timeval se define como estructura para acceder a la hora actual.
estructura timeval ahora;
También se define el UUID. Los UUID se pueden generar desde este enlace .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Ahora cree una función que contendrá atributos de iBeacon como UUID, Major, Minor, Etc. En esta función, cree una instancia para BLE como iBeacon y establezca una ID de fabricante falsa, UUID, mayor y menor para ESP32 como iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Configure el indicador como 0x04 para que genere BrEdrNotSupported en el escáner.
oData.setFlags (0x04);
Establecer datos publicitarios para su publicación.
std:: string strServiceData = "";
Agregue la cadena una tras otra para anunciar.
strServiceData + = (carácter) 26; // Len strServiceData + = (char) 0xFF; // Escriba strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Inicie la publicidad publicando datos.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Inicie el monitor en serie a una velocidad de 115200 baudios y obtenga la hora. También incremente el bootcount para almacenar el número de reinicios.
Serial.begin (115200); gettimeofday (y ahora, NULL); Serial.printf ("iniciar ESP32% d \ n", bootcount ++);
Almacena la hora actual en la memoria estática.
último = ahora.tv_sec;
Cree un dispositivo BLE y asígnele el nombre que desee. Aquí el ESP32 se denomina " ESP2 como iBeacon ". Tenga en cuenta que los nombres pueden ser largos, pero esta versión del código ha iniciado el soporte para nombres largos.
BLEDevice:: init ("ESP32 como iBeacon");
Cree un servidor BLE para anunciar y comenzar.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Luego configure el ESP32 en modo iBeacon.
setBeacon ();
Empiece a anunciar, deje de hacer publicidad y duerma profundamente durante 10 segundos.
pPublicidad-> inicio (); pPublicidad-> detener (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Finalmente, conecte la placa de desarrollo ESP32 con su computadora portátil usando un cable Micro USB y cargue el código en ESP32 usando Arduino IDE. Luego, abra la aplicación de Android nRF Connect en su teléfono inteligente y comience a escanear. Encontrará ESP32 como transmisión de iBeacon como se muestra en la siguiente imagen:
Así es como ESP32 se puede utilizar como BLE Beacon para anunciar UUID, Major y Minor. Si desea saber más sobre iBeacon, siga nuestro tutorial anterior sobre HM10 como iBeacon. Además, si tiene alguna duda, comente a continuación o haga preguntas en los foros.
El código completo con un video funcional se muestra a continuación.
/>