# BleQuiz
Application HTML5 de quiz temps réel pour plusieurs modules ESP32-S3 via Bluetooth Low Energy (BLE)
## đ Description
BleQuiz permet de crĂ©er un systĂšme de quiz interactif en temps rĂ©el oĂč plusieurs ESP32-S3 peuvent ĂȘtre connectĂ©s simultanĂ©ment via Bluetooth. Chaque module ESP32-S3 surveille des GPIOs (boutons) et envoie instantanĂ©ment les Ă©vĂ©nements Ă une interface web HTML5.
**Adresse de test :**
[https://blequiz.apps.christophe-scaya.fr/](https://blequiz.apps.christophe-scaya.fr/) (serveur de démonstration, utiliser le fichier `quiz_exemple.txt`)
## đ§ Configuration
### ESP32 (src/main.cpp)
Par défaut, le code surveille 4 GPIOs : **2, 4, 5, 6** d'un module ESP32-S3 supermini générique.
Pour modifier les GPIOs surveillés, éditez cette ligne :
```cpp
const int GPIO_PINS[] = {2, 4, 5, 6}; // GPIOs Ă surveiller (A, B, C, D)
```
### LED WS2812 (ESP32-S3)
Le projet supporte une LED WS2812 sur le **GPIO 48** (ESP32-S3) pour indiquer l'état du module :
**Ătats de la LED** :
- âȘ **Blanc clignotant** (500ms) â DĂ©connectĂ© de la page web
- âȘ **Blanc fixe** â ConnectĂ©, en attente de rĂ©ponse ou affichage des scores
- đŽ **Rouge** â Bouton GPIO 2 pressĂ© (rĂ©ponse A)
- đą **Vert** â Bouton GPIO 4 pressĂ© (rĂ©ponse B)
- đ” **Bleu** â Bouton GPIO 5 pressĂ© (rĂ©ponse C)
- đĄ **Jaune** â Bouton GPIO 6 pressĂ© (rĂ©ponse D)
**Comportement selon les phases du quiz** :
1. **Connexion initiale** â âȘ Blanc fixe (GPIO actifs)
2. **Question affichĂ©e** â âȘ Blanc fixe (attente de rĂ©ponse)
3. **Bouton pressĂ©** â đŽđąđ”đĄ Couleur correspondante
4. **RĂ©sultats affichĂ©s** â LED garde sa couleur (GPIO dĂ©sactivĂ©s)
5. **Question suivante** â âȘ Blanc fixe (GPIO rĂ©activĂ©s)
6. **Scores finaux** â âȘ Blanc fixe (GPIO dĂ©sactivĂ©s)
7. **DĂ©connexion** â âȘ Blanc clignotant
**Configuration** : La bibliothÚque `Adafruit NeoPixel` est automatiquement installée via PlatformIO.
### Identification automatique des modules (GPIO 8, 9, 10)
Chaque module ESP32-S3 peut ĂȘtre identifiĂ© automatiquement via 3 GPIOs configurĂ©s en **INPUT_PULLUP** :
**Configuration des jumpers** (connecter Ă GND pour LOW, laisser ouvert pour HIGH) :
- **GPIO 8** = bit 0
- **GPIO 9** = bit 1
- **GPIO 10** = bit 2
**Table d'identification** :
| GPIO 10 | GPIO 9 | GPIO 8 | Binaire | Nom du module |
|---------|--------|--------|---------|---------------|
| HIGH | HIGH | HIGH | 000 | **BleQuiz-1** |
| HIGH | HIGH | LOW | 001 | **BleQuiz-2** |
| HIGH | LOW | HIGH | 010 | **BleQuiz-3** |
| HIGH | LOW | LOW | 011 | **BleQuiz-4** |
| LOW | HIGH | HIGH | 100 | **BleQuiz-5** |
| LOW | HIGH | LOW | 101 | **BleQuiz-6** |
| LOW | LOW | HIGH | 110 | **BleQuiz-7** |
| LOW | LOW | LOW | 111 | **BleQuiz-8** |
## đ Installation et utilisation
### 1. Prérequis
- **PlatformIO** installé (via VS Code ou CLI)
- **Python 3** (pour le serveur HTTPS)
- **Navigateur compatible** : Chrome, Edge ou Opera (Firefox et Safari ne supportent pas Web Bluetooth)
### 2. Configuration des ESP32
**Compiler et téléverser pour ESP32-S3** :
```bash
pio run -e esp32-s3-supermini
pio run -e esp32-s3-supermini --target upload
```
**Monitorer le port série** (optionnel) :
```bash
pio device monitor
```
### 3. Démarrer le serveur HTTPS
â ïž **Important** : Web Bluetooth nĂ©cessite HTTPS (ou localhost en HTTP)
**Option A - Script automatique (Linux)** :
```bash
./start.sh
```
Ce script :
- Démarre automatiquement le serveur Python HTTPS
- Lance Chrome avec les flags Web Bluetooth appropriés
- Ouvre directement l'application Ă `https://localhost:8443`
**Option B - Serveur Python manuel** :
```bash
python3 server.py
```
**Option C - Serveur Node.js** :
```bash
node server.js
```
Les serveurs Python et Node.js :
- GénÚrent automatiquement un certificat SSL auto-signé
- Démarrent sur `https://localhost:8443`
- Servent la page HTML avec support Bluetooth
### 4. Ouvrir dans le navigateur
Ouvrez **Chrome**, **Edge** ou **Opera** et accédez à :
```
https://localhost:8443
```
**Note** :
- Vous verrez un avertissement de sĂ©curitĂ© (certificat auto-signĂ©) â Cliquez sur "AvancĂ©" puis "Continuer vers localhost"
- Firefox et Safari ne supportent pas encore Web Bluetooth
- Sur Linux, utilisez le script `start.sh` pour lancer Chrome avec les bons paramĂštres
### 5. Utiliser l'application
1. **Charger un fichier de questions** : Cliquez sur "Choisir un fichier" et sélectionnez votre fichier de quiz (voir `quiz_exemple.txt`)
2. **Connecter les modules** : Cliquez sur "Connecter un module" et sélectionnez votre ESP32-S3 dans la liste Bluetooth
3. **Lancer le quiz** : Naviguez entre les questions, les modules répondent en appuyant sur leurs boutons
4. **Répétez** pour connecter plusieurs modules simultanément
## đ Pourquoi HTTPS est nĂ©cessaire ?
Web Bluetooth API nécessite un **contexte sécurisé** pour des raisons de sécurité :
- â
`https://` (avec certificat SSL)
- â
`http://localhost` ou `http://127.0.0.1`
- â `file://` (ouverture directe du fichier HTML)
Les serveurs fournis (`server.py` et `server.js`) génÚrent automatiquement un certificat SSL auto-signé.
## đ Branchement des GPIOs
Pour tester, connectez vos boutons/switches entre les GPIOs et la masse (GND) :
```
ESP32 Bouton/Switch
GPIO 2 ---- [Bouton A] ---- GND
GPIO 4 ---- [Bouton B] ---- GND
GPIO 5 ---- [Bouton C] ---- GND
GPIO 6 ---- [Bouton D] ---- GND
```
**Configuration** : Les GPIOs utilisent des résistances de pull-up internes, donc :
- Ătat normal (bouton non pressĂ©) : HIGH (3.3V)
- Ătat actif (bouton pressĂ©) : LOW (0V / GND)
## đ Structure du projet
```
BleQuiz/
âââ index.html # Interface web du quiz
âââ platformio.ini # Configuration PlatformIO (esp32dev, esp32-c3)
âââ server.py # Serveur HTTPS Python
âââ server.js # Serveur HTTPS Node.js
âââ start.sh # Script de lancement automatique (Linux)
âââ quiz_exemple.txt # Exemple de fichier de questions
âââ src/
â âââ main.cpp # Code ESP32 (BLE + GPIO)
âââ include/
âââ README
```
## đ Format des donnĂ©es BLE
Les données sont envoyées en JSON via Bluetooth Low Energy :
```json
{
"module": "ESP32-Module-1",
"gpios": [
{"pin": 2, "state": "0"},
{"pin": 4, "state": "1"},
{"pin": 5, "state": "0"},
{"pin": 6, "state": "0"}
]
}
```
- `state: "0"` = GPIO HIGH (bouton non pressé)
- `state: "1"` = GPIO LOW (bouton pressé)
## đš FonctionnalitĂ©s de l'interface
L'application web offre :
- **Chargement de quiz** : Support de fichiers texte avec questions et réponses
- **Connexion multi-modules** : Connectez jusqu'à 10 ESP32 simultanément
- **Affichage en temps rĂ©el** : Ătat des boutons de chaque module avec code couleur
- **SystÚme de scoring** : Points automatiques pour les bonnes réponses
- **Mode de jeu** : Détection du premier à répondre avec verrouillage
- **Animations visuelles** : Feedback instantané lors des appuis
- **Historique** : Suivi des réponses et du temps de réaction
## âïž Personnalisation
### Modifier les GPIOs surveillés
Dans `src/main.cpp`, adaptez selon votre matériel :
```cpp
const int GPIO_PINS[] = {2, 4, 5, 6}; // GPIOs Ă surveiller
```
### Changer les UUID Bluetooth
Dans `src/main.cpp` et `index.html`, modifiez (doit ĂȘtre identique des deux cĂŽtĂ©s) :
```cpp
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define COMMAND_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a9"
```
### Format du fichier de quiz
Créez un fichier texte avec ce format (voir `quiz_exemple.txt`) :
```
* Quelle est la formule de l'ion fer(III) ?
- Fe^(2+)
+ Fe^(3+)
- Fe_(2)^(3-)
- Fe_(3)^(2+)
* Question suivante ?
- Mauvaise réponse
- Autre mauvaise réponse
+ Bonne réponse
- Encore une mauvaise réponse
```
**Format** :
- `*` = Question
- `-` = Mauvaise réponse
- `+` = Bonne réponse
**Syntaxe pour indices et exposants** :
- `^(texte)` = exposant â `Fe^(3+)` s'affiche comme FeÂłâș
- `_(texte)` = indice â `H_(2)O` s'affiche comme HâO
- Combinaison possible : `Fe_(2)O_(3)` â FeâOâ
## đ DĂ©pannage
### L'ESP32-S3 n'apparaĂźt pas dans la liste Bluetooth
- Vérifiez que le module est alimenté correctement (USB ou externe 5V)
- Consultez le moniteur série : `pio device monitor` pour voir les messages de démarrage
- Assurez-vous que le Bluetooth est activé sur votre ordinateur
- Sur Linux, vérifiez que BlueZ est à jour : `bluetoothctl --version`
- Redémarrez l'ESP32-S3 (bouton RESET ou débrancher/rebrancher)
### Pas de données reçues dans l'interface web
- Vérifiez que les UUID correspondent dans `src/main.cpp` et `index.html`
- Consultez la console JavaScript (F12) pour voir les erreurs
- Testez en connectant un GPIO Ă GND avec un simple fil
- Vérifiez que le module est bien connecté (voyant dans l'interface)
### Déconnexions fréquentes
- Réduisez la distance entre l'ESP32-S3 et l'ordinateur (< 5 mÚtres)
- Assurez-vous que l'alimentation de l'ESP32-S3 est stable (cùble USB de qualité)
- Ăvitez les interfĂ©rences (WiFi 2.4GHz, micro-ondes)
- Augmentez le délai dans la boucle principale si trop de données sont envoyées
### Erreur "HTTPS required" ou "Bluetooth API not available"
- Vérifiez que vous accédez bien à `https://localhost:8443` (pas `http://`)
- Utilisez Chrome, Edge ou Opera (pas Firefox ni Safari)
- Sur Linux, utilisez le script `./start.sh` pour les bons paramĂštres Chrome
### Erreur de compilation PlatformIO
- Vérifiez votre environnement dans `platformio.ini`
- Mettez Ă jour PlatformIO : `pio upgrade`
- Nettoyez le projet : `pio run --target clean`
- Réinstallez les dépendances : `pio pkg update`
## đ CaractĂ©ristiques techniques
- **Protocole** : Bluetooth Low Energy (BLE 4.0+)
- **LED WS2812** : Indicateur visuel d'état sur GPIO 48
- **Identification automatique** : Via GPIOs 8, 9, 10 (BleQuiz-1 Ă BleQuiz-8)
- **GPIOs boutons** : 4 par défaut (2, 4, 5, 6)
- **Connexions simultanées** : Jusqu'à 8+ modules ESP32
- **Fréquence de mise à jour** : 100ms par défaut
- **Portée Bluetooth** : ~10 mÚtres en intérieur
- **Navigateurs supportés** : Chrome 56+, Edge 79+, Opera 43+
- **Serveurs fournis** : Python 3 (SSL auto-signé) et Node.js
- **BibliothĂšques** : Adafruit NeoPixel (pour LED WS2812)
## đŻ Notes d'utilisation
- **Identification automatique** : Les modules se nomment automatiquement BleQuiz-1 Ă BleQuiz-8 selon les GPIOs 8, 9, 10
- **Sécurité BLE** : Le code utilise un mode sans bonding (pas de mémorisation d'appairage)
- **Web Bluetooth** : La page HTML doit obligatoirement ĂȘtre servie en HTTPS ou via localhost
- **DĂ©tection de changement** : Les Ă©vĂ©nements GPIO sont envoyĂ©s instantanĂ©ment lors des transitions HIGHâLOW
- **Mode Pull-up** : Les boutons doivent connecter le GPIO Ă GND (pas Ă VCC)
- **LED WS2812** : Feedback visuel automatique sur ESP32-S3, la LED indique l'état de connexion et les réponses
- **Commandes BLE** :
- `START` : Active la détection GPIO (blanc fixe)
- `RESET` : Fige la LED, désactive les GPIO (affichage résultats)
- `SCORES` : Blanc fixe, GPIO désactivés (scores finaux)
## đ DĂ©marrage rapide (Linux)
```bash
# 1. Compiler et téléverser le code ESP32
pio run -e esp32dev --target upload
# 2. Lancer l'application (serveur + navigateur)
./start.sh
# 3. Dans l'interface web :
# - Charger un fichier de quiz
# - Connecter les modules ESP32
# - Commencer le quiz !
```
## đ Ressources
- [Web Bluetooth API Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API)
- [ESP32 BLE Arduino Documentation](https://github.com/espressif/arduino-esp32/tree/master/libraries/BLE)
- [PlatformIO Documentation](https://docs.platformio.org/)
- [ESP32 GPIO Reference](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/)
## đ Licence
Ce projet est open source. Libre d'utilisation, modification et distribution.