Bonjour à tous,
étant lycéen en terminale et débutant sur le logiciel de programmation d'Arduino, j'aurai besoin de votre expérience pour résoudre mon/mes problèmes.

Le principe est simple: deux leds pour chacun des deux joueurs, avec deux boutons positionnés en face de chacune des leds. Chaque fois qu'une des deux leds du joueur s'éclaire, il doit appuyé sur le bouton lui correspondant le plus rapidement possible. Quand il a appuyé sur le bouton lorsque la led est allumée, il gagne un point qui s'affiche sur un écran lcd "joueur 1: 1". Si la led est éteinte mais qu'il appuie sur le bouton quand même, alors il perd un point "joueur 1: -".

Alors j'ai essayé plusieurs chose: j'ai crée un premier programme où j'arrivai à faire fonctionné l'aléatoire correctement et où j'ai aussi réussi à gérer le rebond du bouton poussoir, seulement dans ce programme là, il était impossible d'afficher un "+1" lorsque la led était éclairée, ni même un -1 lorsqu'elle était éteinte.
Voici le premier programme:
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int Led1=13; // déclarations des variables Led sur les broches
int Led2=12;
int valeurvariable1=0; //déclaration des variables pour assigner une valeur random ensuite
int valeurvariable2=0;
int buttonPin1=1; //déclaration des variable bouttons (broche + permettre lecture de l'etat du boutton
int buttonPin2=3;
int buttonState=0;
int scoreJ1=0;
int scoreJ2=0;
int ButtonBase=buttonState;
int valLed1=0;


void setup (){
  pinMode(Led1, OUTPUT); //leds en sorties
  pinMode (Led2, OUTPUT); 
  pinMode(buttonPin1, INPUT); //boutton en entrée
  Serial.begin(9600); //permet de lire la valeur aléatoire ensuite
  lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2 lignes
  lcd.write("Joueur 1:");
  
}
void loop ()
{
  //----------------Led 1 ------------------------
  valeurvariable1=random(2); //assigne à valeurvariable la fonction random (trouve entre 0 et 1 une valeur)
  //Serial.println(valeurvariable1); //lit la valeur trouvé
  if (valeurvariable1==1) //test si la variable=1 alors on allume la led puis on l'éteint au bout de 750 ms
  {
    digitalWrite (Led1, HIGH);
    delay (750);
    digitalWrite (Led1, LOW);
  }
  else 
  {
    digitalWrite (Led1, LOW);
  }
  //-------------------Led 2 ----------------------
  valeurvariable2=random(2); // de même pour la seconde led
  //Serial.println(valeurvariable2);
  if (valeurvariable2==1)
  {
    digitalWrite (Led2, HIGH);
    delay (750);
    digitalWrite (Led2, LOW);
  }
  else
  {
    digitalWrite (Led2, LOW);
  }
   delay(4000); // permet de répéter l'expérience toutes les 4 secondes 
  //--------------------Boutton 1--------------------
  buttonState = digitalRead(buttonPin1);
  valLed1 = valeurvariable1;
//Serial.println(valLed1);
  if (valLed1==HIGH)
  {
    if (buttonState== HIGH && buttonState!=ButtonBase) //ici j'ai aussi essayé comme ça:   if (valLed1==1 && buttonState== HIGH && //buttonState!=ButtonBase)
    {
      scoreJ1=scoreJ1+1;//ajouter 1 point sur l'écran lcd
      lcd.setCursor (9,0);
      lcd.print (scoreJ1);
    }
    else
    {
      scoreJ1=scoreJ1;
      lcd.setCursor (9,0);
      lcd.print (scoreJ1);
    }
    ButtonBase=buttonState;
  }
/*if (valLed1==0)
  {
   if (buttonState==HIGH && buttonState!=ButtonBase) 
   {
     scoreJ1=scoreJ1-1; //soustraire -1 point sur l'écran lcd
     lcd.setCursor (9,0);
     lcd.print (scoreJ1);
   }
   else
   {
     scoreJ1=scoreJ1;
     lcd.setCursor (9,0);
     lcd.print (scoreJ1);
   }*/
   Serial.println(scoreJ1);
   ButtonBase=buttonState;
 }
(j'ai mit en commentaire une partie du programme car il ne fonctionnait pas non plus)

Alors en cherchant sur internet, j'ai trouvé qu'il fallait essayer de faire une interruption dans le programme car Arduino et le multitâche ne font pas bon ménage à ce que j'ai compris. En effet, l'idée était de gérer une action de manière prioritaire, étant donné que le "delay" bloquait tout le reste des instructions pendant 4000ms. J'ai utilisé ce delay afin de répéter l'action entre allumer la led ou la laisser éteinte, ça me semblait être un moyen efficace pour gérer l'aléatoire.
J'ai essayé avec une certaine syntaxe cette interruption, mais en vain.. J'ai donc demander à mon professeur de m'aider et de me dire comment faire, seulement lui même ne connait pas comment s'utilise l'interruption sur Arduino. Il m'a donc demandé de reprendre le programme et de simplifier la chose (sauf que ça ne simplifie pas réellement en réalité ..)

En effet, maintenant, la led reste éclairée tant que le joueur n' a pas appuyé sur le bouton lui correspondant. Alors effectivement, quand j'appuie sur le bouton, la led s'éteint, et il m'affiche 1 point sur l'écran lcd, en revanche la led ne s'éclaire plus.. Autre point important, la led s'éclaire dès la mise en route du programme (En fait, j'ai récupéré le système d'aléatoire que j'avais crée dans l'ancien programme et je l'ai modifié un petit peu ici, sauf que ça ne fonctionne pas..)
Après ça, j'ai essayé d'utilisé un système de fonction, mais en vain aussi..
Voici le programme adapté à la nouvelle consigne:
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int Led1=13; // déclarations des variables Led sur les broches
int Led2=12;
int buttonPin1=1; //déclaration des variable bouttons (broche + permettre lecture de l'etat du boutton
int buttonPin2=3;
int scoreJ1=0;
int scoreJ2=0;
int buttonState=0;
int ButtonBase=buttonState;
int valeurvariable1=0;
void setup ()
{
  pinMode(Led1, OUTPUT); //leds en sorties
  pinMode (Led2, OUTPUT);
  pinMode (buttonPin1, INPUT);
  pinMode (buttonPin2, INPUT);
  lcd.begin(16,2); 
  lcd.write("Joueur 1:");
}

void loop () 
{
  valeurvariable1=random(2); //assigne à valeurvariable la fonction random (trouve entre 0 et 1 une valeur)
  if (valeurvariable1==1) //test si la variable=1 alors on allume la led
  {
    digitalWrite (Led1, HIGH);
  }
  while (valeurvariable1==1)
  {
    buttonState=digitalRead (buttonPin1);
    if (buttonState==HIGH && buttonState!=ButtonBase)
    {
      scoreJ1=scoreJ1+1;
      lcd.setCursor (9,0);
      lcd.print (scoreJ1);
      digitalWrite (Led1, LOW);
      valeurvariable1=0;
    }
    else
    { 
      scoreJ1=scoreJ1;
      lcd.setCursor (9,0);
      lcd.print (scoreJ1);
    }
    ButtonBase=buttonState;
  }
  while (valeurvariable1==0)
  {
    buttonState=digitalRead (buttonPin1);
    if (buttonState==HIGH && buttonState!=ButtonBase)
    {
      scoreJ1=scoreJ1-1;
      lcd.setCursor (9,0);
      lcd.print (scoreJ1);
    }
    if (valeurvariable1==0)
    { 
      digitalWrite (Led1, LOW);
      scoreJ1=scoreJ1;
      lcd.setCursor (9,0);
      lcd.print (scoreJ1);
    }
    ButtonBase=buttonState;
  }

}
(je précise que je n'essaye pour le moment que de traiter le joueur 1 avec une led, d'où le fait que je n'utilise pas toutes les variables, tant que le programme de base ne fonctionne pas, je ne vais pas me risquer à aller faire plusieurs choses à la fois).
Merci d'avance pour vos réponses,
à bientôt !