# BleQuiz Application HTML5 de quiz temps rĂ©el pour plusieurs modules ESP32 via Bluetooth Low Energy (BLE) ## 📋 Description BleQuiz permet de crĂ©er un systĂšme de quiz interactif en temps rĂ©el oĂč plusieurs ESP32 peuvent ĂȘtre connectĂ©s simultanĂ©ment via Bluetooth. Chaque module ESP32 surveille des GPIOs (boutons) et envoie instantanĂ©ment les Ă©vĂ©nements Ă  une interface web HTML5. **Cas d'usage** : Quiz en classe, jeux de rapiditĂ©, systĂšmes de vote, buzzers interactifs. ## 🔧 Configuration ### ESP32 (src/main.cpp) Par dĂ©faut, le code surveille 4 GPIOs : **2, 4, 5, 6** (compatibles ESP32 Wrover et ESP32-C3) Pour modifier les GPIOs surveillĂ©s, Ă©ditez cette ligne : ```cpp const int GPIO_PINS[] = {2, 4, 5, 6}; // GPIOs Ă  surveiller (A, B, C, D) ``` Pour changer le nom du module (important pour diffĂ©rencier plusieurs ESP32) : ```cpp String moduleName = "ESP32-Module-1"; // Changer pour chaque ESP32 ``` ### GPIOs avec Pull-up Les GPIOs sont configurĂ©s en **INPUT_PULLUP**, ce qui signifie : - **État normal (non connectĂ©)** : HIGH (3.3V) - **État actif (connectĂ© Ă  GND)** : LOW (0V) Le systĂšme envoie une notification Ă  la page HTML **quand un GPIO passe Ă  l'Ă©tat BAS**. ## 🚀 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 Le projet supporte deux environnements (voir `platformio.ini`) : - **esp32dev** : ESP32 Wrover standard - **esp32-c3-supermini** : Seeed XIAO ESP32-C3 (ou module gĂ©nĂ©rique ESP32-C3) **Compiler et tĂ©lĂ©verser pour ESP32 Wrover** : ```bash pio run -e esp32dev pio run -e esp32dev --target upload ``` **Compiler et tĂ©lĂ©verser pour ESP32-C3** : ```bash pio run -e esp32-c3-supermini pio run -e esp32-c3-supermini --target upload ``` **Monitorer le port sĂ©rie** (optionnel) : ```bash pio device monitor ``` ⚠ **Important** : Si vous utilisez plusieurs modules, modifiez le nom de chaque module dans `src/main.cpp` : ```cpp String moduleName = "ESP32-Module-1"; // Changer pour Module-2, Module-3, etc. ``` ### 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 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 ### Changer le nom du module ESP32 Dans `src/main.cpp`, modifiez : ```cpp String moduleName = "ESP32-Module-1"; // Changer pour chaque ESP32 (Module-2, Module-3, etc.) ``` ### 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 ``` **GPIOs recommandĂ©s** : - **ESP32 Wrover** : 2, 4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23 - **ESP32-C3** : 2, 3, 4, 5, 6, 7, 8, 9, 10 ### 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" ``` ### Modifier le dĂ©lai de lecture Dans `src/main.cpp`, derniĂšre ligne de `loop()` : ```cpp delay(100); // Modifier selon vos besoins (en millisecondes) ``` ### 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 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 (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 et l'ordinateur (< 5 mĂštres) - Assurez-vous que l'alimentation de l'ESP32 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+) - **CompatibilitĂ© ESP32** : ESP32 Wrover, ESP32-C3 (Seeed XIAO) - **GPIOs configurables** : 4 par dĂ©faut (extensible) - **Connexions simultanĂ©es** : Jusqu'Ă  10 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 ## 🎯 Notes d'utilisation - **Modules multiples** : Chaque module doit avoir un nom unique configurĂ© dans `src/main.cpp` - **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) ## 🚀 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 ! ``` ## 🔐 SĂ©curitĂ© Le projet est conçu pour un usage Ă©ducatif et de dĂ©monstration. Pour un usage en production : - **Authentification BLE** : ImplĂ©menter un systĂšme de pairing sĂ©curisĂ© - **Chiffrement des donnĂ©es** : Activer le chiffrement des caractĂ©ristiques BLE - **Certificat SSL valide** : Remplacer le certificat auto-signĂ© par un certificat CA - **Validation cĂŽtĂ© serveur** : Ajouter une validation des rĂ©ponses cĂŽtĂ© serveur - **Limitation de connexions** : ImplĂ©menter une limite et un contrĂŽle d'accĂšs - **Logs d'audit** : Enregistrer les actions pour le suivi et la sĂ©curitĂ© ## 📚 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. ## đŸ‘„ Contribution Les contributions sont les bienvenues ! N'hĂ©sitez pas Ă  : - Signaler des bugs - Proposer de nouvelles fonctionnalitĂ©s - AmĂ©liorer la documentation - Soumettre des pull requests --- **Créé avec ❀ pour l'Ă©ducation et l'apprentissage interactif**