🛠 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.

Objectifs

Exploiter le Bluetooth 5 LE de l'ESP32-S3 (absent de l'ESP32 classique, qui n'a que le BLE 4.2) en exposant le service standard Battery (UUID 0x180F) avec sa caractéristique Level (0x2A19) en lecture et notification. Vous utiliserez la pile BLE embarquée dans le core Arduino (BLEDevice/NimBLE), vous déclarerez le service dans l'advertising et vous simulerez une descente de niveau suivie de notifications vers un smartphone équipé d'une app type « nRF Connect ».

Matériel

Code complet

// 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);
}

Vérification attendue

Dans nRF Connect, le périphérique « S3-batterie » apparaît ; la connexion révèle le service Battery 180F. Après souscription (activer les notifications sur 2A19), le niveau décrémenté de 1 % toutes les 5 secondes arrive en temps réel. Le S3 supporte les PHY 2 Mbps et Coded PHY (longue portée) là où un ESP32 classique reste au 1 Mbps ; sous NimBLE, ces PHY sont configurables via les options de la pile.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels