Allumage/Extinction de led à la suite avec bouton poussoir.

Bonjour, je suis nouveau sur le forum, j'apprends les concepts de l'électronique avec un PDF du site du zéro.

L'exercice que je réalise en ce moment consiste, à l'aide de 2 boutons poussoir, d'allumer 1 par 1 ou d'éteindre 1 par un les LED selon le bouton sur lequel j'appuie.

J'ai donc voulu faire le code sans regarder la correction, le problème est que mes 4 LEDs s'allume en même temps lorsque j'appuie sur le bouton 1 et il s'éteigne en même temps lorsque j'appuie sur le bouton 2. Je ne comprends pas ou est mon erreur. Elle est bien dans le code car lorsque j'ai copier le code de la correction pour le tester, tout fonctionne correctement.

Voilà mon code :

const int bouton1 = 2;
const int bouton2 = 3;
const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int led4 = 10;
int etat1;
int etat2;
int nombreAppui1 = 0;

void setup()
{
 pinMode (bouton1, INPUT);
 pinMode (bouton2, INPUT);
 pinMode (led1, OUTPUT);
 pinMode (led2, OUTPUT);
 pinMode (led3, OUTPUT);
 pinMode (led4, OUTPUT);
}

void loop() 
{
etat1 = digitalRead(bouton1);

etat2 = digitalRead(bouton2);


if (etat1 == HIGH)
{
  nombreAppui1 ++;
}
if (etat2 == HIGH)
{
  nombreAppui1 --;
}
if (nombreAppui1 > 4)
{
  nombreAppui1 = 4;
}
if (nombreAppui1 < 0)
{
  nombreAppui1 = 0;
}

digitalWrite (led1, HIGH);
digitalWrite (led2, HIGH);
digitalWrite (led3, HIGH);
digitalWrite (led4, HIGH);

if (nombreAppui1 >=1)
  {
digitalWrite (led1, LOW);
  }
if (nombreAppui1 >= 2)
  {
digitalWrite (led2, LOW);
  }
if (nombreAppui1 >= 3)
  {
digitalWrite (led3, LOW);
  }
if (nombreAppui1 >= 4)
  {
digitalWrite (led4, LOW);
  }

}

J'ai résolu mon problème en rajoutant 2 variable "memoire_plus" et "mémoire_minus" j'ai pris juste cette partie de la correction et je l'ai mis dans mon code ça fonctionne, mais je ne comprends pas du tout à quoi servent ces variables... Si quelqu’un peut m'éclairer ?

Voilà le code :

const int bouton1 = 2;
const int bouton2 = 3;
const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int led4 = 10;
int etat1;
int etat2;
int nombreAppui1 = 0;
int memoire_plus = HIGH;
int memoire_minus = HIGH;

void setup()
{
 pinMode (bouton1, INPUT);
 pinMode (bouton2, INPUT);
 pinMode (led1, OUTPUT);
 pinMode (led2, OUTPUT);
 pinMode (led3, OUTPUT);
 pinMode (led4, OUTPUT);
}

void loop() 
{
etat1 = digitalRead(bouton1);

etat2 = digitalRead(bouton2);


if ((etat1 != memoire_plus) && (etat1 == LOW))
{
  nombreAppui1++;
}
memoire_plus = etat1; 
if ((etat2 != memoire_minus) && (etat2 == LOW))
{
  nombreAppui1--;
}
memoire_minus = etat2; 
if (nombreAppui1 > 4)
{
  nombreAppui1 = 4;
}
if (nombreAppui1 < 0)
{
  nombreAppui1 = 0;
}

digitalWrite (led1, HIGH);
digitalWrite (led2, HIGH);
digitalWrite (led3, HIGH);
digitalWrite (led4, HIGH);

if (nombreAppui1 >=1)
  {
digitalWrite (led1, LOW);
  }
if (nombreAppui1 >= 2)
  {
digitalWrite (led2, LOW);
  }
if (nombreAppui1 >= 3)
  {
digitalWrite (led3, LOW);
  }
if (nombreAppui1 >= 4)
  {
digitalWrite (led4, LOW);
  }

}

Bonjour,

Il est important de bien comprendre ce que vous faites quand vous codez pour réussir à faire ce que vous voulez.

Essayez d'écrire d'abord ce que vous voulez faire sur un papier, avec les conditions etc.. et ensuite de traduire en code C/C++

Exemple :

Si j'appuie sur le bouton 1, la led 1 s'allume -> if(etatBouton1==HIGH){digitalWrite (led1, HIGH)}

Evidemment il y à plusieurs façon d'arriver à votre solution finale, ne vous focalisez pas sur le code donné en exemple.

Au passage, comment est câblé votre bouton poussoir ?

bonjour,

ton code "tronqué" et expliqué en commentaires :

...
void loop()
{
  ...
  etat1 = digitalRead(bouton1);                 // lecture état BP1

  if (                                          // comparaisons :
      (etat1 != memoire_plus)                   // entre nouvel état et ancien état de BP1
                                                // c-à-d si BP1 vient de changer d'état
                                                // ( ex: si BP1 est appuyé maintenant mais au tour précédent)
                           &&                   // ET
                              (etat1 == LOW)    // l'état actuel de BP1
                                            )
  {
    nombreAppui1++;                             // si TOUT est vrai, on incrémente
  }
	
  memoire_plus = etat1;                         // on garde en mémoire l'état actuel de BP1
                                                // qui deviendra l'ancien état au tour suivant !
  ...
}

et au vu de ton code, je n'ai pas besoin que tu me dise que tes BPs sont câblés au 0V ... avec une pull-up

Merci pour vos réponses, donc si je comprends bien, c'est le fait d'enregistrer l'état du bouton pour le tour suivant qui permets au code de fonctionner dans mon second code ?

Et concernant le branchement des BPs effectivement il sont branchés avec un Pull-up, cette technique n'est pas l'idéale ?

re-

effectivement, le fait de mémoriser l'état du BP permet de savoir au tour suivant s'il vient de changer d'état.

connaître son état à un instant t ne suffit pas, dans de très nombreux cas il faut aussi savoir si on vient d'appuyer (ou relâcher) pour éviter un effet "mitraillette" : sans la mémoire, il se passe ce que tu obtenais au début, à savoir que toutes tes DELs te semblaient s'allumer en même temps.
c'est en fait faux, elles s'allumaient bien l'une après l'autre, mais c'était tellement plus rapide que tes yeux !

tes BPs sont correctement utilisés : il faut une pull-up, qu'elle soit externe comme dans ton cas ou interne au microcontrôleur.
pour activer les pull-up internes et te passer des résistances, tu peux faire :

pinMode (bouton1, INPUT_PULLUP);

la seule chose qui pourrait manquer c'est un filtrage des rebonds, à moins que tu n'y aies pensé ?

5_cylindres:
et au vu de ton code, je n'ai pas besoin que tu me dise que tes BPs sont câblés au 0V ... avec une pull-up

Je posais simplement la question car dans son premier exemple il y avait : if (etat1 == HIGH)

et dans le deuxième : if (etat1 == LOW)

Quand on débute en électronique ce n'est pas facile d'intégrer toutes les subtilités qu'il peut y avoir et encore moins au niveau du code, surtout quand on pioche sur internet…

speedblood:
Quand on débute en électronique ce n'est pas facile d'intégrer toutes les subtilités qu'il peut y avoir et encore moins au niveau du code, surtout quand on pioche sur internet…

C'est parce ce que "piocher sur Internet" n'est pas suffisant.

En programmation, il faut parfaitement comprendre ce que l'on fait. A deux niveuax :

  • au niveau du système entier, comment il fonctionne, comment les choses s'enchainent. La bonne méthode pour traiter ça c'est papier+crayon+matière grise. Ordi éteint.

  • au niveau du langage de programmation (le C pour commencer). La bonne méthode, c'est
    1 - prise d'informations (tutos, bouquins)
    2 - mise en pratique, sur des exemples très simples ( = faire ses premières gammes )

biggil:
C'est parce ce que "piocher sur Internet" n'est pas suffisant.

En programmation, il faut parfaitement comprendre ce que l'on fait. A deux niveuax :

  • au niveau du système entier, comment il fonctionne, comment les choses s'enchainent. La bonne méthode pour traiter ça c'est papier+crayon+matière grise. Ordi éteint.

  • au niveau du langage de programmation (le C pour commencer). La bonne méthode, c'est
    1 - prise d'informations (tutos, bouquins)
    2 - mise en pratique, sur des exemples très simples ( = faire ses premières gammes )

Exactement, d'où ma question pour savoir si le câblage était en accord avec le code, et non pas une déduction en fonction du code :wink:

Ps : ce n'est pas parce qu'il y a marqué "Newbie" sous un pseudo que la personne l'est forcément.

Bonjour,

En rebondissant sur les propos de 5_cylindres, un filtrage passe-bas aurait été plus judicieux. En regardant le datasheet du µcontroleur, on peut utiliser via les interruptions externes des fonctionnalités très intéressantes comme attachInterrupt() (si on souhaite incrémenter ou décrémenter une valeur sans faire tourner en boucle son programme). Les notions de front montant ou descendant d'un signal ... Et si on est fâché avec les interruptions externes, on peut utiliser par exemple while() pour attendre le retour d'un état sur un bouton ou autre.

Le reste est à écrire sur le papier ...