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