Bonjour,
Je voulais réaliser un jeux de réaction entre deux participants.
Pour commencer le jeux les joueurs doivent appuyer sur le bouton poussoir, ensuite l'écran indique la couleur gagnante (couleur à laquelle on doit appuyer). Suit un décompte de trois seconde puis les trois autres leds s'éclairent aléatoirement puis la led gagnante. Le premier joueur à appuyer gagne, à la fin l'écran affiche le joueur gagnant et son temps de réaction.
Sauf que lorsque j'appuie sur les boutons rien ne se passe.
Voici mon code :
#include <LiquidCrystal.h>
#include <Wire.h>
int rs = 8;
int en = 13;
int d4 = 12;
int d5 = 11;
int d6 = 10;
int d7 = 9;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Initialisation des pins pour les LEDs et les boutons
const int ledPins[] = {4,5,6,7}; // Les LEDs (quatres LEDs de différentes couleurs)
const int buttonJ1 = 2; // Bouton pour le joueur 1
const int buttonJ2 = 3; // Bouton pour le joueur 2
// Variables de jeu
int ledTarget;
bool gameStarted = false;
unsigned long startTime, ledOnTime;
unsigned long reactionTimeJ1 = 0, reactionTimeJ2 = 0;
bool j1Pressed = false;
bool j2Pressed = false;
void setup() {
// Configuration des pins des LEDs et des boutons
Serial.begin(9600);
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // Éteindre toutes les LEDs au début
}
pinMode(buttonJ1, INPUT_PULLUP); // Configuration du bouton J1 en mode pull-up
pinMode(buttonJ2, INPUT_PULLUP); // Configuration du bouton J2 en mode pull-up
// Initialisation de l'écran LCD
lcd.begin(16, 2);
lcd.print("Appuyez pour");
lcd.setCursor(0, 1);
lcd.print("commencer...");
// Attendre que les deux joueurs appuient sur leur bouton pour commencer
while (digitalRead(buttonJ1) == HIGH || digitalRead(buttonJ2) == HIGH) {
Serial.print("Etat bouton J1: ");
Serial.println(digitalRead(buttonJ1));
Serial.print("Etat bouton J2: ");
Serial.println(digitalRead(buttonJ2));
delay(100);
// Attendre l'appui des boutons
}
// Commencer le jeu
lcd.clear();
lcd.print("Debut dans:");
// Décompte de 3 secondes avant le début
for (int i = 4; i > 0; i--) {
lcd.setCursor(11, 0);
lcd.print(i);
delay(1000); // Attente d'une seconde
}
// Choisir une LED aléatoire à allumer
ledTarget = random(0, 4);
// Afficher la LED choisie sur l'écran LCD
lcd.clear();
lcd.print("LED cible:");
lcd.setCursor(0, 1);
lcd.print("LED ");
lcd.print(ledTarget + 1); // Affiche la LED cible (LED 1, LED 2, LED 3 ou LED 4)
// Clignoter toutes les LEDs trois fois avant d'allumer la LED cible
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
digitalWrite(ledPins[j], HIGH);
}
delay(200);
for (int j = 0; j < 4; j++) {
digitalWrite(ledPins[j], LOW);
}
delay(200);
}
// Allumer la LED cible
digitalWrite(ledPins[ledTarget], HIGH);
gameStarted = true;
ledOnTime = millis(); // Temps d'allumage de la LED cible
}
void loop() {
// Si le jeu est en cours, on vérifie les boutons
if (gameStarted) {
// Vérifier si le joueur 1 a appuyé
if (!j1Pressed && digitalRead(buttonJ1) == LOW) {
reactionTimeJ1 = millis() - ledOnTime; // Temps de réaction J1
j1Pressed = true;
digitalWrite(ledPins[ledTarget], LOW); // Éteindre la LED cible
declareWinner("J1", reactionTimeJ1);
}
// Vérifier si le joueur 2 a appuyé
if (!j2Pressed && digitalRead(buttonJ2) == LOW) {
reactionTimeJ2 = millis() - ledOnTime; // Temps de réaction J2
j2Pressed = true;
digitalWrite(ledPins[ledTarget], LOW); // Éteindre la LED cible
declareWinner("J2", reactionTimeJ2);
}
// Si les deux joueurs appuient en même temps (très improbable mais pris en charge)
if (j1Pressed && j2Pressed) {
if (reactionTimeJ1 < reactionTimeJ2) {
declareWinner("J1", reactionTimeJ1);
} else {
declareWinner("J2", reactionTimeJ2);
}
}
}
}
void declareWinner(String winner, unsigned long reactionTime) {
gameStarted = false; // Fin du jeu
lcd.clear();
lcd.print(winner + " gagne!");
lcd.setCursor(0, 1);
lcd.print("Temps de reaction: ");
lcd.print(reactionTime);
lcd.print(" ms!");
// Boucle infinie pour arrêter le jeu jusqu'à une réinitialisation
while (true) {
}
}
et un schéma du montage:
Merci d'avance.


