Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Si estás buscando adentrarte en el mundo del Internet de las cosas (IoT) y deseas utilizar tecnología Bluetooth de baja energía (BLE), el ESP32 es la placa de desarrollo perfecta para ti. En este artículo, te guiaremos paso a paso en cómo empezar a programar tu ESP32 utilizando Arduino IDE y aprovechar al máximo su capacidad de conectividad Bluetooth Low Energy. ¡Descubre todo lo que puedes lograr con esta poderosa combinación de hardware y software! ¡Comencemos juntos este emocionante viaje tecnológico!

El ESP32 no sólo tiene WiFi, sino también Bluetooth y Bluetooth Low Energy (BLE). Esta publicación es una breve introducción a BLE con ESP32. Primero exploraremos qué es BLE y para qué se puede usar, y luego veremos algunos ejemplos usando ESP32 usando el IDE de Arduino. Para una introducción sencilla, creemos un servidor ESP32-BLE y un escáner ESP32-BLE para encontrar este servidor.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Actualizado el 11 de junio de 2024

Presentamos Bluetooth de bajo consumo

Para obtener una introducción rápida a BLE, puede ver el vídeo a continuación o desplazarse hacia abajo para obtener una explicación escrita.

Recomendaciones de literatura: Aprenda a usar ESP32 Bluetooth Classic con Arduino IDE para intercambiar datos entre un ESP32 y un teléfono inteligente Android.

¿Qué es Bluetooth de bajo consumo?

Bluetooth Low Energy, BLE para abreviar, es una variante de Bluetooth que ahorra energía. La principal aplicación de BLE es la transmisión de pequeñas cantidades de datos a distancias cortas (bajo ancho de banda). A diferencia de Bluetooth, que siempre está activado, BLE permanece en modo de suspensión todo el tiempo, excepto cuando se conecta.

Esto significa que utiliza muy poca energía. BLE utiliza aproximadamente 100 veces menos energía que Bluetooth (según el caso de uso).

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Además, BLE no solo admite comunicación punto a punto, sino también modo de transmisión y red en malla.

Consulte la siguiente tabla que compara BLE y Bluetooth Classic con más detalle.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Mostrar fuente de imagen

Debido a sus propiedades, BLE es adecuado para aplicaciones que necesitan intercambiar periódicamente pequeñas cantidades de datos a través de una pila de botón. Por ejemplo, BLE es de gran utilidad en las áreas de atención médica, fitness, seguimiento, balizas, seguridad y automatización del hogar.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Servidor y cliente BLE

Con Bluetooth Low Energy, existen dos tipos de dispositivos: el servidor y el cliente. El ESP32 puede actuar como cliente o servidor.

El servidor da a conocer su existencia para que otros dispositivos puedan encontrarlo y contiene los datos que el cliente puede leer. El cliente busca los dispositivos cercanos y cuando encuentra el servidor que busca, se conecta y espera los datos entrantes. A esto se le llama comunicación punto a punto.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Como se mencionó anteriormente, BLE también admite el modo de transmisión y la red en malla:

  • Modo de transmisión: El servidor transmite datos a muchos clientes conectados.
  • Red de malla: Todos los dispositivos están conectados, esta es una conexión de muchos a muchos.

Aunque es posible implementar configuraciones de red de transmisión y malla, solo se han desarrollado recientemente, por lo que no hay muchos ejemplos de implementación de ESP32 actualmente.

GATT

GATT significa Atributos Genéricos y define una estructura de datos jerárquica que está disponible para los dispositivos BLE conectados. Esto significa que GATT define la forma en que dos dispositivos BLE envían y reciben mensajes estándar. Comprender esta jerarquía es importante porque le facilita comprender cómo usar BLE y escribir sus aplicaciones.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

servicio BLE

El nivel superior de la jerarquía es un perfil, que consta de uno o más servicios. Normalmente un dispositivo BLE contiene más de un servicio.

Cada servicio contiene al menos una propiedad o también puede hacer referencia a otros servicios. Un servicio es simplemente una colección de información, como lecturas de sensores.

Existen servicios predefinidos para diferentes tipos de datos definidos por SIG (Grupo de Interés Especial de Bluetooth), tales como: nivel de batería, presión arterial, frecuencia cardíaca, peso, etc. Puede Consulta aquí los demás servicios definidos.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Mostrar fuente de imagen

Propiedades BLE

La característica siempre pertenece a un servicio y es el lugar donde están contenidos los datos reales en la jerarquía (valor). La característica siempre tiene dos atributos: la declaración de característica (que proporciona metadatos sobre los datos) y el valor de la característica.

Además, el valor de la característica puede ir seguido de descriptores que expliquen con más detalle los metadatos contenidos en la declaración de la característica.

Las propiedades describen cómo se puede interactuar con el valor de la característica. Básicamente, contienen las operaciones y procedimientos que se pueden utilizar con la función:

  • transmitido
  • Leer
  • Escribiendo sin respuesta
  • Escribir
  • Notificar
  • Indicar
  • Escrituras firmadas autenticadas
  • Propiedades avanzadas

UUID

Cada servicio, propiedad y descriptor tiene un UUID (Identificador único universal). Un UUID es un número único de 128 bits (16 bytes). Ejemplo:

55072829-bc9e-4c53-938a-74a6d4c78776

Hay UUID abreviados para todos los tipos, servicios y perfiles incluidos en el SIG (Grupo de interés especial de Bluetooth).

Sin embargo, si su aplicación necesita su propio UUID, puede generarlo usando este Sitio web del generador de UUID.

En resumen, UUID se utiliza para identificar información de forma única. Por ejemplo, puede identificar un servicio específico proporcionado por un dispositivo Bluetooth.

BLE con ESP32

El ESP32 puede actuar como servidor BLE o como cliente BLE. Hay varios ejemplos de BLE para el ESP32 en Biblioteca ESP32 BLE para Arduino IDE. Esta biblioteca se instala de forma predeterminada cuando instala ESP32 en el IDE de Arduino.

nota: Debes tener el complemento ESP32 instalado en el IDE de Arduino. Siga el siguiente tutorial para preparar su IDE de Arduino para que funcione con ESP32 si aún no lo ha hecho.

  • Instalación de la placa ESP32 en Arduino IDE 2 (Windows, Mac OS X, Linux)

En tu IDE de Arduino encontrarás archivo > Ejemplos > BLE y explore los ejemplos que vienen con la biblioteca BLE.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Nota: Para ver los ejemplos de ESP32, se debe seleccionar la placa ESP32 en Herramientas > tablón.

Para una introducción rápida a ESP32 con BLE en el IDE de Arduino, crearemos un servidor ESP32 BLE y luego un escáner ESP32 BLE para encontrar ese servidor. Usamos y explicamos los ejemplos que vienen con la biblioteca BLE.

Para seguir este ejemplo necesitarás dos placas de desarrollo ESP32. Usamos eso Placa ESP32 DOIT DEVKIT V1.

Servidores ESP32 BLE

Para crear un servidor ESP32 BLE, abra su IDE de Arduino y vaya a archivo > Ejemplos > BLE y seleccione el servidor Ejemplo. Debería cargarse el siguiente código:

/*
  Complete Getting Started Guide: https://RandomNerdTutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/
  Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cpp
  Ported to Arduino ESP32 by Evandro Copercini
*/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  BLEDevice::init("MyESP32");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Hello World says Neil");
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
}

Ver código sin formato

Para crear un servidor BLE, el código debe seguir los siguientes pasos:

  1. Cree un servidor BLE. En este caso, el ESP32 actúa como servidor BLE.
  2. Cree un servicio BLE.
  3. Cree una propiedad BLE para el servicio.
  4. Cree un descriptor BLE para la característica.
  5. Inicie el servicio.
  6. Lanzar anuncios para que otros dispositivos puedan encontrarlos.

Así es como funciona el código

Echemos un vistazo rápido a cómo funciona el código de muestra del servidor BLE.

Comienza importando las bibliotecas necesarias para las funciones BLE.

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

Luego necesitas definir un UUID para el servicio y la propiedad.

#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

Puedes conservar los UUID predeterminados o también uuidgenerator.net para crear UUID aleatorios para sus servicios y propiedades.

En el configuración()inicia la comunicación en serie con una velocidad de baudios de 115200.

Serial.begin(115200);

Luego cree un dispositivo BLE llamado «MiESP32«. Puedes cambiar este nombre por el que quieras.

// Create the BLE Device
BLEDevice::init("MyESP32");

En la siguiente línea configura el dispositivo BLE como servidor.

BLEServer *pServer = BLEDevice::createServer();

Luego cree un servicio para el servidor BLE con el UUID previamente definido.

 BLEService *pService = pServer->createService(SERVICE_UUID);

Luego establece la propiedad para este servicio. Como puede ver, también está utilizando el UUID definido anteriormente y necesita pasar las propiedades de la propiedad como argumentos. En este caso estos son: LECTURA y ESCRITURA.

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                     CHARACTERISTIC_UUID,
                                     BLECharacteristic::PROPERTY_READ |
                                     BLECharacteristic::PROPERTY_WRITE
                                     );

Después de crear la característica, puede cambiar su valor usando el valor ajustado() Método.

pCharacteristic->setValue("Hello World says Neil");

En este caso asignamos el valor al texto «Hola mundo, dice Neil». Puedes cambiar este texto a lo que quieras. En proyectos futuros, este texto puede ser, por ejemplo, un valor de sensor o el estado de una lámpara.

Finalmente, puede iniciar el servicio y la publicidad para que otros dispositivos BLE puedan escanear y encontrar este dispositivo BLE.

BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();

Este es sólo un ejemplo sencillo de cómo crear un servidor BLE. No se hace nada en este código. Cinta()pero puedes agregar lo que sucede cuando se conecta un nuevo cliente (consulta el Notificar ejemplo para orientación).

Escáner ESP32 BLE

Crear un escáner ESP32 BLE es fácil. Tome otro ESP32 (mientras el otro ejecuta el boceto del servidor BLE). Vaya a su IDE de Arduino Archivo > Ejemplos > BLE y seleccione el escanear Ejemplo. Debería cargarse el siguiente código.

/*
  Complete Getting Started Guide: https://RandomNerdTutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/
  Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
  Ported to Arduino ESP32 by Evandro Copercini
*/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

int scanTime = 5; // in seconds
BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
  void onResult(BLEAdvertisedDevice advertisedDevice) {
    Serial.printf("Advertised Device: %s n", advertisedDevice.toString().c_str());
  }
};

void setup() {
  Serial.begin(115200);
  Serial.println("Scanning...");

  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
}

void loop() {
  // put your main code here, to run repeatedly:
  BLEScanResults *foundDevices = pBLEScan->start(scanTime, false);
  Serial.print("Devices found: ");
  Serial.println(foundDevices->getCount());
  Serial.println("Scan done!");
  pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  delay(2000);
}

Ver código sin formato

Este código inicializa el ESP32 como un dispositivo BLE y busca dispositivos cercanos. Sube este código a tu ESP32. Es posible que desees desconectar temporalmente el otro ESP32 de tu computadora para asegurarte de que estás cargando el código en la placa ESP32 correcta.

Una vez cargado el código, las dos placas ESP32 deben estar encendidas:

  • Un ESP32 con el boceto “BLE_server”;
  • Otros con sketch ESP32 “BLE_scan”.
Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Vaya al monitor serie con el ESP32 ejecutando el ejemplo “BLE_scan”, presione el botón ENABLE del ESP32 (con el boceto “BLE_scan”) para reiniciarlo y espere unos segundos mientras se realiza el escaneo.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

El escáner encontró dos dispositivos: uno es el ESP32 (se llama «MiESP32“), y el otro es un reloj inteligente.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Probando el servidor ESP32 BLE con su teléfono inteligente

La mayoría de los teléfonos inteligentes modernos deberían estar habilitados para BLE. tengo un OnePluspero la mayoría de los teléfonos inteligentes también deberían funcionar.

Puede escanear su servidor ESP32 BLE con su teléfono inteligente y ver sus servicios y características. Para ello utilizamos una aplicación gratuita llamada Conexión nRF para dispositivos móviles de nórdico, funciona en Android (tienda Google Play) Y iOS (tienda de aplicaciones).

Vaya a Google Play Store o App Store y busque «nRF Connect for Mobile». Instala la aplicación y ábrela.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

No olvides ir a la configuración de Bluetooth y habilitar el adaptador Bluetooth en tu teléfono inteligente. Es posible que también quieras hacerlo visible para otros dispositivos para probar otros bocetos más adelante.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Una vez que todo esté listo en su teléfono inteligente y el ESP32 esté ejecutando el boceto del servidor BLE, toque el botón «Escanear» en la aplicación para buscar dispositivos cercanos. Deberías tener un ESP32 llamado «MiESP32“.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

Presione el «Conectar» botón.

Como puedes ver en la imagen a continuación, el ESP32 tiene un servicio con el UUID que definiste anteriormente. Cuando tocas el servicio, el menú se expande y muestra la propiedad con el UUID que también definiste.

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

La propiedad tiene propiedades de LEER y ESCRIBIR y el valor es el que definió previamente en el boceto del servidor BLE. Entonces todo funciona perfectamente.

Envolver

En este tutorial le mostramos los principios básicos de Bluetooth Low Energy y le mostramos algunos ejemplos usando el ESP32. Examinamos el boceto del servidor BLE y el boceto de escaneo BLE. Estos son ejemplos sencillos que le ayudarán a empezar a utilizar BLE.

La idea es utilizar BLE para enviar o recibir valores de sensores de otros dispositivos.

Otros tutoriales relacionados con Bluetooth que te pueden gustar:

  • ESP32 con Bluetooth y Bluetooth Low Energy: la guía definitiva
  • Servidor y cliente ESP32 BLE (Bluetooth Low Energy)
  • Aprovisionamiento de Wi-Fi ESP32 a través de BLE (Bluetooth Low Energy) – Arduino IDE
  • ESP32 Web Bluetooth (BLE): Primeros pasos
  • ESP32 Bluetooth Classic con Arduino IDE – Primeros pasos

Este es un extracto de nuestro curso: Aprendiendo ESP32 con Arduino IDE. Si te gusta ESP32 y quieres aprender más sobre él, te recomendamos apuntarte al curso Aprende ESP32 con Arduino IDE.

Usted también puede estar interesado en:

  • Aprenda ESP32 con Arduino IDE
  • ESP32 Bluetooth Classic con Arduino IDE – Primeros pasos
  • Temperatura de registro de datos ESP32 a la tarjeta MicroSD
  • ESP32 con motor CC y controlador de motor L298N: control de velocidad y dirección

Gracias por leer.

Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE

El ESP32 no solo viene con Wi-Fi, sino también con Bluetooth y Bluetooth Low Energy (BLE). Esta publicación es una rápida introducción a BLE con el ESP32. Primero exploraremos qué es BLE y para qué se puede usar, y luego echaremos un vistazo a algunos ejemplos con el ESP32 utilizando Arduino IDE. Para una introducción simple, crearemos un servidor ESP32 BLE y un escáner ESP32 BLE para encontrar ese servidor.

Introducción a Bluetooth Low Energy

Para una rápida introducción a BLE, puedes ver el video a continuación, o puedes seguir leyendo para una explicación escrita.

Bluetooth Low Energy, BLE en resumen, es una variante de bajo consumo de energía de Bluetooth. La aplicación principal de BLE es la transmisión a corta distancia de pequeñas cantidades de datos (ancho de banda bajo). A diferencia de Bluetooth que siempre está encendido, BLE permanece en modo de espera constantemente, excepto cuando se inicia una conexión.

Esto hace que consuma muy poca energía. BLE consume aproximadamente 100 veces menos energía que Bluetooth (dependiendo del caso de uso).

Además, BLE no solo soporta comunicación punto a punto, sino también modo de difusión y red en malla.

Preguntas frecuentes

  1. ¿Qué es Bluetooth Low Energy?
  2. Bluetooth Low Energy, BLE en resumen, es una variante de bajo consumo de energía de Bluetooth.

  3. ¿Para qué se puede usar BLE?
  4. BLE es adecuado para aplicaciones que necesitan intercambiar pequeñas cantidades de datos periódicamente y que funcionan con una celda de moneda. Es útil en industrias como la salud, fitness, seguimiento, balizas, seguridad y domótica.

  5. ¿Cuáles son los tipos de dispositivos en BLE?
  6. Con Bluetooth Low Energy, hay dos tipos de dispositivos: el servidor y el cliente.

  7. ¿Qué es GATT?
  8. GATT define una estructura jerárquica de datos que es expuesta a dispositivos BLE conectados.

  9. ¿Cómo funciona un BLE Server con el ESP32?
  10. El código para crear un servidor BLE en ESP32 implica crear un dispositivo BLE, un servidor, un servicio, una característica y comenzar a publicitar.

  11. ¿Cómo se crea un BLE Scanner con el ESP32?
  12. El código para crear un escáner BLE en ESP32 implica inicializar el dispositivo como BLE, configurar la exploración y buscar dispositivos cercanos.

Para obtener más información detallada sobre BLE y cómo implementarlo con el ESP32, te recomendamos explorar los ejemplos y tutoriales mencionados en este artículo. ¡Comienza tu viaje con ESP32 y Bluetooth Low Energy hoy!

3 comentarios en «Comenzando con ESP32 Bluetooth Low Energy (BLE) en Arduino IDE»

Deja un comentario