Allumer une led avec un bouton (problème de "delay") [Résolu]

Bonjour à tous !

Je suis tout nouveau sur ce forum et je suis ultra débutant en programmation / électronique.
Je n'aimais pas ça du tout étant aux études mais maintenant ça m'attire beaucoup ! (ya que les c... qui ne changent pas d'avis) :smiley:

Alors voilà, j'ai essayé de faire le petit exercice suivant :
un bouton poussoir (NO), une led sur une breadboard (et les quelques composants nécessaires au bon fonctionnement)
But : j'appuie sur le bouton, la led s'allume (si elle est éteinte) et reste allumée quand je relache. A l'inverse, si elle est allumée, elle s'éteint et reste éteinte.

Voici mon code : (qui fonctionne bien !)

const int led = 2;
const int bouton =4;

int etatBouton; //bouton appuyé ou non
int etatLed; //led allumée ou éteinte

void setup()
{
  // put your setup code here, to run once:
  
pinMode (led, OUTPUT);
pinMode (bouton, INPUT);
}

void loop()
{
  etatBouton = digitalRead(bouton);
  
  if (etatBouton == LOW) // vérifie si qqun est en train d'appuyer sur le bouton
  {
    //si qqun appuie sur le bouton, allume si led éteinte, ou éteint si led allumée
    if (etatLed == HIGH)
    {
    digitalWrite (led, LOW);
    etatLed = LOW;
     delay (200); 
     }
     else
     {
     digitalWrite (led, HIGH);
     etatLed = HIGH;
     delay (200);
     }
     }

}

Ce code fonctionne très bien, mais uniquement après que j'aie mis les "delay". Avant cela, il était très instable. Parfois ça marchait, et parfois non.
Je pense que c'est parce que pendant que j'appuyais, la boucle "void loop()" s'effectuait plusieurs fois et rendait donc l'opération aléatoire. J'ai donc par la suite inséré ces "delay".

Ma question est : y a-t-il un autre moyen de faire fonctionner l'histoire sans les "delay" ? ça ne me paraît pas très catholique comme méthode.

Merci d'avance pour votre aide !

Horia

Salut,

Sans les delay ton code ne pouvait pas marcher correctement, car tant que tu restais appuyé, tu entrais dans le if (état bouton == ...)
Et si ta Led était allumée elle s'éteignait, si éteinte elle s'allumait .. Tu as peut être pu voir qu'elle ne s'allumait pas franchement tant que tu restais appuyé... Car elle clignotait (à fréquence très élevée ...) Et donc quand tu relâchais ton bouton, tu avais une chance sur 2 que ta Led fasse ce que tu voulais ... Avec tes delay(200) ça marche. Mais si tu restes appuyé plus de 200 ms ... Tu vas quitter le if, puis y retourner et la Led changera à nouveau d'état.

Tu dois tester dans ton programme que le bouton a été relâché avant de tester s'il est enfoncé ...

A la fin de loop, il faut placer une boucle qui attende le relâché du bouton

while(digitalRead(bouton)==LOW);

Cette ligne boucle sur elle même tant que le bouton est appuyé. Dès qu'il est relâché le programme reprend sont cours normal.

Si ton programme a d'autres taches a effectuer tu vas le faire attendre avec les méthodes proposées qui sont très bien si tu ne fais rien faire d'autres à ton Arduino, mais sinon... Le mieux, utilises une variable et si elle ne change pas au cours des cycles "loop" suivant c'est que ton doigt est toujours sur le bouton, donc tu passes et lorsque tu relâches tu changes à nouveau l'état de ton booléen et le tour est joué. Il s'agit de gérer le rebond du contact du bouton.