🛠 Service batterie BLE 5 avec notification
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
- 1 carte ESP32-S3 (Wi-Fi + BLE 5 embarqués, aucune antenne externe nécessaire sur WROOM)
- 1 smartphone Android/iOS avec nRF Connect (ou equivalent)
- 1 câble USB pour le téléversement et la console
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
- Oublier de relancer l'advertising à la déconnexion : le périphérique devient invisible après une connexion ; c'est le rôle du callback onDisconnect.
- Oublier le descripteur BLE2902 (CCCD) : sans lui, l'app ne peut pas s'abonner aux notifications.
- Attendre du Bluetooth Classic : le S3, comme tout ESP32 récent hors série classique, n'a que le BLE ; pas de SPP/HFP.
- Confondre UUID 16 bits et 128 bits : « 180F » est l'UUID sigifié Bluetooth SIG ; une app l'affiche en 0000180F-0000-1000-8000-00805F9B34FB.
- Memory pressure : la pile BLE + Wi-Fi simultanés consomment beaucoup de RAM ; désactiver le Wi-Fi si inutile.
- Mauvaise carte au build : le service ne dépend pas de la carte, mais le flash USB, si ; garder « ESP32S3 Dev Module » et USB CDC activé.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino