🛠 Service batterie BLE 5 avec notification

ESP32-S3 · intermediaire · Schéma : IMG-esp32-s3-intermediaire-2-esp32-s3-ble5-service-batterie.svg — Carte ESP32-S3 émettant des ondes BLE vers un smartphone affichant le niveau de batterie, avec la mention Bluetooth 5 LE, Coded PHY et 2 Mbps.

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales