Dans mon code que je construis petit à petit j'imbrique des if puis des else if seulement le dernier
else if que j' ai imbriqué ne me renvois pas d'erreur mais il ne fonctionne pas non plus. Donc si quelqu'un pouvait m'orienter que je puisse corriger mon erreur ça serait sympa.
j' ai mis des //************************************************************
dans la partie du code que j'ai ajouté et sans ces parties la le code fonctionne très bien
même si c pas très propre ni optimisé.
void loop() {
randNumber = random(3) ;
if (randNumber == 0)
{
lion();
Serial.println("jouLion");
do{
buttonStateLion = digitalRead(buttonLion);
buttonStateTigre = digitalRead(buttonTigre);//*******************************************************
}
while(buttonStateLion == 0) ; //tant que compteur est différent , on boucle
Serial.println(buttonStateLion);
if (buttonStateLion != lastButtonStateLion){
//***
if (buttonStateLion == HIGH) {
// si l'état actuel du bouton est HAUT
// il est passé de BAS à HAUT
// affiche les messages sur le PC
Serial.println("GAGNER");
// si l'état du bouton poussoir a changé
digitalWrite(ledGagner, HIGH); //on allume la diode gagner
delay(3*tempo);
digitalWrite(ledGagner, LOW); //on allume la diode gagner
}
}
// ici mettre un sinon si condition un seul des autre bouton es inverser a son
//etat initial
else if (buttonStateTigre != lastButtonStateTigre)//************************************************************
{ //************************************************************
Serial.println("PERDU"); //************************************************************
// si l'état du bouton poussoir a changé //************************************************************
digitalWrite(ledPerdu, HIGH); //on allume la diode perdu //************************************************************
delay(3*tempo); //************************************************************
digitalWrite(ledPerdu, LOW); //on etiend la diode gagner //************************************************************
}
Serial.println("depart");
Serial.println(buttonStateLion);
bouttonStateTousAZero();
Serial.println(buttonStateLion);
Serial.println("arriver");
}
else if (randNumber == 1)
{
tigre();
Serial.println("joutigre");
do{
buttonStateTigre = digitalRead(buttonTigre);
}
while(buttonStateTigre == 0) ; //tant que compteur est différent de 5, on boucle
Serial.println(buttonStateTigre);
if (buttonStateTigre != lastButtonStateTigre){
//***
if (buttonStateTigre == HIGH) {
// si l'état actuel du bouton est HAUT
// il est passé de BAS à HAUT
// affiche les messages sur le PC
Serial.println("GAGNER");
// si l'état du bouton poussoir a changé
digitalWrite(ledGagner, HIGH); //on allume la diode gagner
delay(3*tempo);
digitalWrite(ledGagner, LOW); //on allume la diode gagner
}
Serial.println("depart");
Serial.println(buttonStateTigre);
bouttonStateTousAZero();
Serial.println(buttonStateTigre);
Serial.println("arriver");
}
}
else if (randNumber == 2)
{
tortue();
Serial.println("jouTortue");
do{
buttonStateTortue = digitalRead(buttonTortue);
}
while(buttonStateTortue == 0) ; //tant que compteur est différent de 5, on boucle
Serial.println(buttonStateTortue);
if (buttonStateTortue != lastButtonStateTortue){
//***
if (buttonStateTortue == HIGH) {
// si l'état actuel du bouton est HAUT
// il est passé de BAS à HAUT
// affiche les messages sur le PC
Serial.println("GAGNER");
// si l'état du bouton poussoir a changé
digitalWrite(ledGagner, HIGH); //on allume la diode gagner
delay(3*tempo);
digitalWrite(ledGagner, LOW); //on allume la diode gagner
}
}
Serial.println("depart");
Serial.println(buttonStateTortue);
bouttonStateTousAZero();
Serial.println(buttonStateTortue);
Serial.println("arriver");
}
}
Tes boutons sont à LOW ou HIGH lorsque tu appuies dessus
Dans un cas comme dans l'autre ton while est bizarre. Qu'est ce que tu veux faire dans ce while ?
J'ai une led qui me donne un code morse aléatoire pour boutons 1,2 ou 3
Je veux que le while vérifie si l'un de ces boutons a été appuyer et si le code morse est 1 et que si j'appuie
sur 1 la led gagner (vert)s'allume mais si l'on appuit sur 2 ou 3 la led (rouge) s'allume.
while vérifie l'état des boutons et tant que aucun n'a changé d'état il boucle do pour lire l'état des boutons.
Si je ne mets qu'une seule condition dans while ça fonctionne.
bouton en LOW appuyé.
J'aurais bien mis mon code entier mais on est limité à 9000 caractères.
Pour chaque bouton, il faut que tu testes s'il a été appuyé comme tu l'as fait et tu attribues une valeur à une variable (par exemple boutonAppuye=0 pour le premier bouton).
Ensuite quand cette variable (que tu as initialisé par exemple à -1) est différente de sa valeur initiale tu fais le test if (boutonAppuye==randNumber) pour savoir si c'est gagné ou perdu.
J'ai honte, je comprends bien ce que tu me dis et la simplicité par rapport à ce que j'avais fait mais je n'arrive pas le transcrire en code. Peux-tu m'aider un peu plus ?
Merci.
void loop() {
static int randNumber=-1;
static int boutonAppuye=-1;
static byte lastButtonStateLion=LOW;
static byte lastButtonStateTigre=LOW;
static byte lastButtonStateTortue=LOW;
byte buttonStateLion;
byte buttonStateTigre;
byte buttonStateTortue;
if (randNumber==-1)
{
randNumber=random(3);
switch (randNumber)
{
case 0:
Serial.println("jouLion");
break;
case 1:
Serial.println("jouTigre");
break;
case 2:
Serial.println("jouTortue");
break;
}
boutonAppuye=-1; // on attend l'appui sur un bouton
}
buttonStateLion = digitalRead(buttonLion);
if (buttonStateLion != lastButtonStateLion) {
if (buttonStateLion == HIGH)
boutonAppuye=0;
lastButtonStateLion=buttonStateLion;
}
buttonStateTigre = digitalRead(buttonTigre);
if (buttonStateTigre != lastButtonStateTigre) {
if (buttonStateTigre == HIGH)
boutonAppuye=1;
lastButtonStateTigre=buttonStateTigre;
}
buttonStateTortue = digitalRead(buttonTortue);
if (buttonStateTortue != lastButtonStateTortue) {
if (buttonStateTortue == HIGH)
boutonAppuye=2;
lastButtonStateTortue=buttonStateTortue;
}
if (boutonAppuye!=-1)
{
// on a appuyé sur un bouton, on teste si c'est le bon
if (boutonAppuye==randNumber)
{
// c'est gagné
Serial.println("GAGNE");
}
else
{
// c'est perdu
Serial.println("PERDU");
}
delay(3000); // délai entre chaque jeu
randNumber=-1; // nouveau jeu
}
delay(20); // pour l'anti rebond
}
Dans un premier temps on génère un nombre aléatoire
Ensuite on teste les boutons
Ensuite si un des boutons a été appuyé, on teste si c'est le bon
Comme la fonction loop est appelée cycliquement, il faut s'assurer de ne pas faire des actions qui sont déjà faites. On pourrait utiliser des flags, moi j'ai choisi d'utiliser la valeur particulière -1 (pour randNumber et boutonAppuye)