🛠 Service batterie BLE 5 avec notification
Objetivos
Aprovechar el Bluetooth 5 LE del ESP32-S3 (ausente en el ESP32 clásico, que solo tiene BLE 4.2) exponiendo el servicio estándar Battery (UUID 0x180F) con su característica Level (0x2A19) en lectura y notificación. Utilizarás la pila BLE integrada en el core de Arduino (BLEDevice/NimBLE), declararás el servicio en la publicidad y simularás una disminución de nivel seguida de notificaciones hacia un smartphone equipado con una app tipo « nRF Connect ».
Material
- 1 tarjeta ESP32-S3 (Wi-Fi + BLE 5 integrados, no se necesita antena externa en el modelo WROOM)
- 1 smartphone Android/iOS con nRF Connect (o equivalente)
- 1 cable USB para la carga y la consola
Código completo
// Service batterie BLE 5 : UUID 180F / niveau 2A19 en READ + NOTIFY
#include "BLEDevice.h"
#include "BLEServer.h"
#include "BLEUtils.h"
#include "BLE2902.h"
BLECharacteristic* pLevel = nullptr;
uint8_t percent = 100;
uint32_t derniereNotif = 0;
class ServCb : public BLEServerCallbacks {
void onConnect(BLEServer* s) override { Serial.println("Client connecte"); }
void onDisconnect(BLEServer* s) override {
Serial.println("Client deconnecte, reprise advertising");
BLEDevice::getAdvertising->start; // indispensable
}
};
void setup {
Serial.begin(115200);
BLEDevice::init("S3-batterie");
BLEServer* srv = BLEDevice::createServer;
srv->setCallbacks(new ServCb);
BLEService* bat = srv->createService("180F"); // Battery
pLevel = bat->createCharacteristic("2A19",
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY);
pLevel->addDescriptor(new BLE2902); // CCCD
pLevel->setValue(&percent, 1);
bat->start;
BLEAdvertising* adv = BLEDevice::getAdvertising;
adv->addServiceUUID("180F");
adv->setScanResponse(true);
adv->start;
Serial.println("Advertising S3-batterie lance");
}
void loop {
if (millis - derniereNotif > 5000) {
derniereNotif = millis;
percent = percent > 0 ? percent - 1 : 100; // fausse descente
pLevel->setValue(&percent, 1);
pLevel->notify;
Serial.printf("niveau = %u %%\n", percent);
}
delay(100);
}
Verificación esperada
En nRF Connect, aparece el dispositivo « S3-batterie »; la conexión revela el servicio Battery 180F. Tras la suscripción (activar las notificaciones en 2A19), el nivel decrementado en un 1 % cada 5 segundos llega en tiempo real. El S3 soporta las PHY de 2 Mbps y Coded PHY (largo alcance), mientras que un ESP32 clásico se queda en 1 Mbps; bajo NimBLE, estas PHY son configurables mediante las opciones de la pila.
Errores frecuentes
- Olvidar reiniciar la publicidad al desconectarse: el dispositivo se vuelve invisible tras una conexión; esta es la función del callback onDisconnect.
- Olvidar el descriptor BLE2902 (CCCD): sin él, la app no puede suscribirse a las notificaciones.
- Esperar Bluetooth Classic: el S3, al igual que cualquier ESP32 reciente fuera de la serie clásica, solo tiene BLE; no hay SPP/HFP.
- Confundir UUID de 16 bits y 128 bits: « 180F » es el UUID asignado por Bluetooth SIG; una app lo muestra como 0000180F-0000-1000-8000-00805F9B34FB.
- Presión de memoria: la pila BLE + Wi-Fi simultáneos consumen mucha RAM; desactiva el Wi-Fi si no es necesario.
- Tarjeta incorrecta en la compilación: el servicio no depende de la tarjeta, pero la función de flash USB sí; mantén « ESP32S3 Dev Module » y USB CDC activado.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino