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