@ -1,13 +1,10 @@
# BleQuiz
# BleQuiz
Application HTML5 de quiz temps réel pour plusieurs modules ESP32 via Bluetooth Low Energy (BLE)
Application HTML5 de quiz temps réel pour plusieurs modules ESP32-S3 via Bluetooth Low Energy (BLE)
## 📋 Description
## 📋 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.
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.
**Cas d'usage :**
Quiz en classe, jeux de rapidité, systèmes de vote, buzzers interactifs.
**Adresse de test :**
**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` )
[https://blequiz.apps.christophe-scaya.fr/ ](https://blequiz.apps.christophe-scaya.fr/ ) (serveur de démonstration, utiliser le fichier `quiz_exemple.txt` )
@ -16,24 +13,57 @@ Quiz en classe, jeux de rapidité, systèmes de vote, buzzers interactifs.
### ESP32 (src/main.cpp)
### ESP32 (src/main.cpp)
Par défaut, le code surveille 4 GPIOs : **2, 4, 5, 6** (compatibles ESP32 Wrover et ESP32-C3)
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 :
Pour modifier les GPIOs surveillés, éditez cette ligne :
```cpp
```cpp
const int GPIO_PINS[] = {2, 4, 5, 6}; // GPIOs à surveiller (A, B, C, D)
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) :
### LED WS2812 (ESP32-S3)
```cpp
String moduleName = "ESP32-Module-1"; // Changer pour chaque ESP32
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** :
### GPIOs avec Pull-up
**Configuration des jumpers** (connecter à GND pour LOW, laisser ouvert pour HIGH) :
Les GPIOs sont configurés en **INPUT_PULLUP** , ce qui signifie :
- **GPIO 8** = bit 0
- **État normal (non connecté)** : HIGH (3.3V)
- **GPIO 9** = bit 1
- **État actif (connecté à GND)** : LOW (0V)
- **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** |
Le système envoie une notification à la page HTML **quand un GPIO passe à l'état BAS** .
## 🚀 Installation et utilisation
## 🚀 Installation et utilisation
@ -45,32 +75,16 @@ Le système envoie une notification à la page HTML **quand un GPIO passe à l'
### 2. Configuration des ESP32
### 2. Configuration des ESP32
Le projet supporte deux environnements (voir `platformio.ini` ) :
**Compiler et téléverser pour ESP32-S3** :
- **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
```bash
pio run -e esp32dev
pio run -e esp32-s3-supermini
pio run -e esp32dev --target upload
pio run -e esp32-s3-supermini --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) :
**Monitorer le port série** (optionnel) :
```bash
```bash
pio device monitor
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
### 3. Démarrer le serveur HTTPS
⚠️ **Important** : Web Bluetooth nécessite HTTPS (ou localhost en HTTP)
⚠️ **Important** : Web Bluetooth nécessite HTTPS (ou localhost en HTTP)
@ -114,7 +128,7 @@ https://localhost:8443
### 5. Utiliser l'application
### 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` )
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
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
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
4. **Répétez** pour connecter plusieurs modules simultanément
@ -190,13 +204,6 @@ L'application web offre :
## ⚙️ Personnalisation
## ⚙️ 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
### Modifier les GPIOs surveillés
Dans `src/main.cpp` , adaptez selon votre matériel :
Dans `src/main.cpp` , adaptez selon votre matériel :
@ -204,23 +211,13 @@ Dans `src/main.cpp`, adaptez selon votre matériel :
const int GPIO_PINS[] = {2, 4, 5, 6}; // GPIOs à surveiller
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
### Changer les UUID Bluetooth
Dans `src/main.cpp` et `index.html` , modifiez (doit être identique des deux côtés) :
Dans `src/main.cpp` et `index.html` , modifiez (doit être identique des deux côtés) :
```cpp
```cpp
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
```
#define COMMAND_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a9"
### 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
### Format du fichier de quiz
@ -252,12 +249,12 @@ Créez un fichier texte avec ce format (voir `quiz_exemple.txt`) :
## 🐛 Dépannage
## 🐛 Dépannage
### L'ESP32 n'apparaît pas dans la liste Bluetooth
### L'ESP32-S3 n'apparaît pas dans la liste Bluetooth
- Vérifiez que le module est alimenté correctement (USB ou externe 5V)
- 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
- 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
- Assurez-vous que le Bluetooth est activé sur votre ordinateur
- Sur Linux, vérifiez que BlueZ est à jour : `bluetoothctl --version`
- Sur Linux, vérifiez que BlueZ est à jour : `bluetoothctl --version`
- Redémarrez l'ESP32 (bouton RESET ou débrancher/rebrancher)
- Redémarrez l'ESP32-S3 (bouton RESET ou débrancher/rebrancher)
### Pas de données reçues dans l'interface web
### Pas de données reçues dans l'interface web
- Vérifiez que les UUID correspondent dans `src/main.cpp` et `index.html`
- Vérifiez que les UUID correspondent dans `src/main.cpp` et `index.html`
@ -266,8 +263,8 @@ Créez un fichier texte avec ce format (voir `quiz_exemple.txt`) :
- Vérifiez que le module est bien connecté (voyant dans l'interface)
- Vérifiez que le module est bien connecté (voyant dans l'interface)
### Déconnexions fréquentes
### Déconnexions fréquentes
- Réduisez la distance entre l'ESP32 et l'ordinateur (< 5 mètres )
- Réduisez la distance entre l'ESP32-S3 et l'ordinateur (< 5 mètres )
- Assurez-vous que l'alimentation de l'ESP32 est stable (câble USB de qualité)
- 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)
- É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
- Augmentez le délai dans la boucle principale si trop de données sont envoyées
@ -285,21 +282,28 @@ Créez un fichier texte avec ce format (voir `quiz_exemple.txt`) :
## 📝 Caractéristiques techniques
## 📝 Caractéristiques techniques
- **Protocole** : Bluetooth Low Energy (BLE 4.0+)
- **Protocole** : Bluetooth Low Energy (BLE 4.0+)
- **Compatibilité ESP32** : ESP32 Wrover, ESP32-C3 (Seeed XIAO)
- **LED WS2812** : Indicateur visuel d'état sur GPIO 48
- **GPIOs configurables** : 4 par défaut (extensible)
- **Identification automatique** : Via GPIOs 8, 9, 10 (BleQuiz-1 à BleQuiz-8)
- **Connexions simultanées** : Jusqu'à 10 modules ESP32
- **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
- **Fréquence de mise à jour** : 100ms par défaut
- **Portée Bluetooth** : ~10 mètres en intérieur
- **Portée Bluetooth** : ~10 mètres en intérieur
- **Navigateurs supportés** : Chrome 56+, Edge 79+, Opera 43+
- **Navigateurs supportés** : Chrome 56+, Edge 79+, Opera 43+
- **Serveurs fournis** : Python 3 (SSL auto-signé) et Node.js
- **Serveurs fournis** : Python 3 (SSL auto-signé) et Node.js
- **Bibliothèques** : Adafruit NeoPixel (pour LED WS2812)
## 🎯 Notes d'utilisation
## 🎯 Notes d'utilisation
- **Modules multiples** : Chaque module doit avoir un nom unique configuré dans `src/main.cpp`
- **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)
- **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
- **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
- **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)
- **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)
## 🚀 Démarrage rapide (Linux)
@ -316,17 +320,6 @@ pio run -e esp32dev --target upload
# - Commencer le quiz !
# - 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
## 📚 Ressources
- [Web Bluetooth API Documentation ](https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API )
- [Web Bluetooth API Documentation ](https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API )
@ -337,15 +330,3 @@ Le projet est conçu pour un usage éducatif et de démonstration. Pour un usage
## 📄 Licence
## 📄 Licence
Ce projet est open source. Libre d'utilisation, modification et distribution.
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**