Prototype d’un jeu de Blind Test Musical sans fils

Si tu es passionné par l’électronique et la programmation, ou si tu souhaites simplement créer un jeu amusant et interactif, ce projet est pour toi ! Nous allons concevoir un jeu de blind test musical en utilisant des microcontrôleurs ESP32-C3 (1 par joueur et 1 pour le master). Ce jeu permet à deux joueurs (pour le moment) de s’affronter en appuyant sur un bouton pour répondre le plus rapidement lorsque qu’ils reconnaissent un titre. Les composants seront connectés via Wi-Fi, ce qui rend le système autonome, sans besoin de réseau Wi-Fi externe.
Chaque joueur possède un bouton, et le plus rapide à répondre est désigné gagnant. Le tout est géré par un « Master » ESP32-C3, qui contrôle les règles du jeu et les résultats. Le Master allume une LED pour indiquer qui a appuyé en premier, et un bouton de réinitialisation permet de démarrer une nouvelle manche.

Fonctionnement du jeu

  1. Les joueurs J1 et J2 se connectent à un réseau Wi-Fi local créé par le Master ESP32-C3.
  2. Chaque joueur appuie sur son bouton pour répondre à une question musicale.
  3. Le Master détermine quel joueur a appuyé en premier et allume une LED correspondante (une LED pour J1 et une pour J2).
  4. Un bouton de réinitialisation permet de remettre à zéro le jeu et de lancer une nouvelle manche.

Ce système est entièrement autonome, grâce à la connexion Wi-Fi entre les ESP32-C3, sans dépendance à une box Internet ou autre réseau, le master servant de serveur DHCP pour distribué des adresses IP aux différents ESP32 « Joueur » présent.

Matériel nécessaire

Voici la liste des composants dont vous aurez besoin pour réaliser ce projet :

  • 3 ESP32-C3 (un pour le Master, un pour J1, et un pour J2)
  • 2 LEDs (pour indiquer quel joueur a appuyé en premier)
  • 3 boutons poussoirs (un pour chaque joueur et un pour la réinitialisation)
  • 2 Résistances (220Ω) pour les LEDs
  • Câbles de connexion

Schéma de branchement

Pour le Master ESP32-C3 :

  • LED 1 (J1) : Connectée à GPIO 2 avec une résistance de 220Ω entre la cathode et le GND.
  • LED 2 (J2) : Connectée à GPIO 3 avec une résistance de 220Ω entre la cathode et le GND.
  • Bouton de réinitialisation : Connecté à GPIO 4 et au GND.

Pour J1 et J2 :

  • Chaque joueur a un bouton poussoir connecté à GPIO 4 de leur ESP32 respectif, et à la masse GND.

Programmation des ESP32-C3

Le Master ESP32-C3

Le Master est responsable de la gestion du jeu. Il crée un réseau Wi-Fi auquel les joueurs se connectent. Ensuite, il reçoit les signaux des joueurs et allume la LED du joueur qui a appuyé en premier. Il gère également la réinitialisation via un bouton.

#include <WiFi.h>
#include <WiFiUDP.h>

const char* ssid = "BlindTestMaster";
const char* password = "password123";
WiFiUDP udp;
unsigned int localUdpPort = 4210;
char incomingPacket[255];
const int ledJ1 = 2;
const int ledJ2 = 3;
const int buttonPin = 4;
bool gameReset = true;

void setup() {
  Serial.begin(115200);
  pinMode(ledJ1, OUTPUT);
  pinMode(ledJ2, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  digitalWrite(ledJ1, LOW);
  digitalWrite(ledJ2, LOW);
  WiFi.softAP(ssid, password);
  udp.begin(localUdpPort);
  Serial.println("Master ESP32 prêt.");
}

void loop() {
  int packetSize = udp.parsePacket();
  if (packetSize) {
    int len = udp.read(incomingPacket, 255);
    incomingPacket[len] = 0;
    if (gameReset) {
      if (strcmp(incomingPacket, "J1") == 0) {
        digitalWrite(ledJ1, HIGH);
        digitalWrite(ledJ2, LOW);
        gameReset = false;
        Serial.println("J1 a appuyé en premier !");
      } else if (strcmp(incomingPacket, "J2") == 0) {
        digitalWrite(ledJ2, HIGH);
        digitalWrite(ledJ1, LOW);
        gameReset = false;
        Serial.println("J2 a appuyé en premier !");
      }
    }
  }

  if (digitalRead(buttonPin) == LOW) {
    resetGame();
  }
}

void resetGame() {
  digitalWrite(ledJ1, LOW);
  digitalWrite(ledJ2, LOW);
  gameReset = true;
  Serial.println("Jeu réinitialisé.");
}

Le Code pour les Joueurs J1 et J2

Les ESP32 des joueurs se connectent au réseau du Master et envoient un message lorsqu’ils appuient sur leur bouton. Voici un extrait du code pour un joueur (J1 ou J2, en changeant simplement le message envoyé) :

#include <WiFi.h>
#include <WiFiUDP.h>

const char* ssid = "BlindTestMaster";
const char* password = "password123";
const char* message = "J1";  // Pour J2, changer par "J2"
WiFiUDP udp;
IPAddress masterIP(192, 168, 4, 1);
unsigned int masterPort = 4210;
const int buttonPin = 4;
bool buttonPressed = false;

void setup() {
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connexion au Master...");
  }
}

void loop() {
  if (digitalRead(buttonPin) == LOW && !buttonPressed) {
    buttonPressed = true;
    udp.beginPacket(masterIP, masterPort);
    udp.print(message);
    udp.endPacket();
    Serial.println("Message envoyé au Master : J1 a appuyé.");
  }

  if (digitalRead(buttonPin) == HIGH && buttonPressed) {
    buttonPressed = false;
  }
}

Explication du Code

  • Master ESP32-C3 : Il crée le réseau Wi-Fi et reçoit les messages des joueurs via UDP. Quand un joueur appuie sur son bouton, le Master allume la LED correspondante et bloque le jeu jusqu’à la réinitialisation.
  • J1 et J2 : Chaque joueur envoie un message au Master lorsqu’il appuie sur son bouton, et le Master détermine quel joueur a appuyé en premier.

Conclusion

Ce projet est une excellente manière de découvrir l’utilisation des ESP32-C3, la création de réseaux Wi-Fi locaux et la communication sans fil. Avec ce système, vous pouvez organiser des parties de blind test musical amusantes et interactives avec vos amis. Ce projet est aussi facilement extensible si vous souhaitez ajouter d’autres fonctionnalités, comme un affichage des scores, l’intégration de musique ou même des questions automatiques.
Avec un peu de créativité, les possibilités sont infinies. Alors, à vos ESP32 et que le meilleur joueur gagne !