Convertit les 13 autres supports en .qmd

Modules 00 à 12 et synthèse matériel convertis avec le même outil que le pilote. Aucun mot perdu (comparaison automatique avec chaque .odt). Tableaux : largeurs de colonnes proportionnelles au contenu, texte non justifié.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Artemia
2026-10-18 15:03:13 +02:00
co-authored by Claude Opus 5.5
parent ff1628efeb
commit 85852fcc2f
15 changed files with 1791 additions and 1 deletions
+161
View File
@@ -0,0 +1,161 @@
---
title: "Module 9 — Bluetooth Low Energy (BLE)"
---
## Objectifs du module
- Comprendre les concepts fondamentaux du BLE : serveur, service, caractéristique.
- Créer un serveur BLE sur l'ESP32-S3 exposant une caractéristique lisible et modifiable.
- Piloter la LED NeoPixel depuis une application smartphone générique (ex : nRF Connect).
- Comprendre les notifications BLE pour l'envoi de données en temps réel.
## 1. BLE sur l'ESP32-S3 : ce qu'il faut savoir
::: {.callout-warning title="Pas de Bluetooth Classic sur l'ESP32-S3"}
Contrairement à l'ESP32 « original », l'ESP32-S3 ne supporte pas le Bluetooth Classic (profil SPP notamment). Seul le Bluetooth Low Energy (BLE) est disponible. Cela signifie qu'on ne peut pas l'apparier comme un simple périphérique série Bluetooth classique : toute communication passe par le modèle GATT (services et caractéristiques) décrit dans ce module.
:::
## 2. Vocabulaire du BLE (modèle GATT)
| Terme | Définition |
|---------------|----------------------------------------|
| Serveur BLE | L'appareil qui expose des données (ici, l'ESP32-S3) |
| Client BLE | L'appareil qui se connecte et consulte les données (ex : smartphone) |
| Service | Un regroupement logique de fonctionnalités, identifié par un UUID unique |
| Caractéristique | Une donnée précise à l'intérieur d'un service (ex : une couleur, une température), également identifiée par un UUID |
| Notification | Mécanisme permettant au serveur d'envoyer une mise à jour au client sans que celui-ci ait à demander (poll) |
::: {.callout-note title="Qu'est-ce qu'un UUID ?"}
Un UUID (Universally Unique Identifier) est un identifiant sur 128 bits garantissant qu'aucun autre service ou caractéristique dans le monde n'utilisera accidentellement le même identifiant. Pour vos projets personnels, générez vos propres UUID aléatoires via un générateur en ligne plutôt que de réutiliser des exemples trouvés sur Internet.
:::
## 3. Créer un serveur BLE minimal
La bibliothèque BLE est incluse nativement dans le core Arduino-ESP32 (aucune installation nécessaire).
```cpp
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLECharacteristic *caracteristique;
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32-S3-Formation");
BLEServer *serveur = BLEDevice::createServer();
BLEService *service = serveur->createService(SERVICE_UUID);
caracteristique = service->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
);
caracteristique->setValue("En attente...");
service->start();
BLEDevice::getAdvertising()->start();
Serial.println("Serveur BLE demarre, en attente de connexion...");
}
void loop() {
}
```
## 4. Réagir à l'écriture d'une valeur (callback)
Pour piloter la LED NeoPixel depuis un smartphone, il faut détecter quand le client BLE écrit une nouvelle valeur dans la caractéristique.
```cpp
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <Adafruit_NeoPixel.h>
#define NEOPIXEL_PIN 48
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
Adafruit_NeoPixel pixel(1, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
class MonCallback : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *car) override {
String valeur = car->getValue();
Serial.print("Valeur recue: ");
Serial.println(valeur);
if (valeur == "rouge") pixel.setPixelColor(0, pixel.Color(255,0,0));
else if (valeur == "vert") pixel.setPixelColor(0, pixel.Color(0,255,0));
else if (valeur == "bleu") pixel.setPixelColor(0, pixel.Color(0,0,255));
else if (valeur == "off") pixel.setPixelColor(0, pixel.Color(0,0,0));
pixel.show();
}
};
void setup() {
Serial.begin(115200);
pixel.begin();
BLEDevice::init("ESP32-S3-Formation");
BLEServer *serveur = BLEDevice::createServer();
BLEService *service = serveur->createService(SERVICE_UUID);
BLECharacteristic *car = service->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
);
car->setCallbacks(new MonCallback());
car->setValue("off");
service->start();
BLEDevice::getAdvertising()->start();
Serial.println("Pret. Connectez-vous avec nRF Connect.");
}
void loop() {
}
```
## 5. Tester avec une application smartphone
Sans développer d'application dédiée, on peut tester un serveur BLE avec une application générique :
- nRF Connect for Mobile (Nordic Semiconductor) — disponible sur Android et iOS.
- LightBlue — alternative populaire sur iOS.
### Étapes de test
- Téléverser le programme, ouvrir le moniteur série pour confirmer le démarrage.
- Ouvrir l'application, scanner les appareils BLE à proximité, repérer « ESP32-S3-Formation ».
- Se connecter, ouvrir le service correspondant à l'UUID défini.
- Sélectionner la caractéristique, utiliser la fonction d'écriture pour envoyer le texte « rouge », « vert », « bleu » ou « off ».
## 6. Les notifications : envoyer des données du serveur vers le client
À l'inverse de l'écriture (client → serveur), les notifications permettent au serveur d'envoyer spontanément une donnée au client sans attendre une requête (par exemple, la valeur d'un capteur mise à jour toutes les secondes).
```cpp
// A ajouter a la caracteristique lors de sa creation :
// BLECharacteristic::PROPERTY_NOTIFY en plus de READ/WRITE
// et service->createCharacteristic(..., ...)->addDescriptor(new BLE2902());
// Puis, dans loop(), pour notifier une nouvelle temperature :
String valeur = String(bme.readTemperature());
caracteristique->setValue(valeur.c_str());
caracteristique->notify();
```
## 7. Exercice combiné : télécommande BLE
Réalisez une carte pilotable entièrement en BLE : écriture pour changer la couleur de la LED NeoPixel, et notification envoyant la température lue par le BME280 (Module 5) toutes les 5 secondes vers l'application smartphone.
## Checklist de fin de module
- [ ] Je comprends la différence entre service et caractéristique dans le modèle GATT.
- [ ] Je sais créer un serveur BLE exposant une caractéristique en lecture/écriture.
- [ ] J'ai testé la communication avec une application smartphone générique.
- [ ] Je comprends le rôle des notifications BLE.
- [ ] J'ai réalisé la télécommande BLE combinant écriture et notification.