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:
(j'ai mit en commentaire une partie du programme car il ne fonctionnait pas non plus)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; }
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:
(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).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; } }
Merci d'avance pour vos réponses,
à bientôt !
-----