Problème code bouton poussoir

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.

Bonjour Apollox11

Tes boutons ne sont pas bien câblés il manque un GND sur la pin 1:
image
Tu pourrais même te passer de la résistance de 10K, il y a déjà une résistance de PULLUP interne du fait de l'initialisation:
pinMode(buttonJ1, INPUT_PULLUP); // Configuration du bouton J1 en mode pull-up

A+
Cordialement
jpbbricole

Un court-circuit se produit il me semble ?

Bonjour Apollox11

Je me suis mal exprimé :woozy_face:
Quand je dis:

Ca voulait dire supprimer tout ça:
image
Il ne doit y avoir que le GND sur la pin 1 du BP.

Milles excuses pour cette confusion.

Cordialement
jpbbricole

Bonjour jpbbricole,

Donc si je comprends bien la pin 1 et 2 sont reliées sur le GND.
En faisant ainsi la séquence se lance instantanément.

Non, pas tout à fait:
image
La pin 1 ou la 3 à GND.
La pin 2 ou la 4 vers la pin de l'Arduino

Ainsi, quand le bouton est pressé, digitalRead donne LOW.
digitalRead(buttonJ1) == LOW (par exemple)

Cordialement
jpbbricole

Merci infiniment.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.