Executer une boucle une seule fois

Bonjour à tous,

Je débute la programmation et j'ai un petit soucis.
J'ai un circuit qui inclue des relais mais on va dire que c'est des Leds, ce sera plus simple pour régler le problème.

Je veux que quand j'appuie sur un petit bouton elle s'allume toutes, très rapidement, les unes après les autres et ce, une seule fois.
C'est à dire:
J'appuie sur le bouton.
La première s'allume puis s'éteint.
La deuxième s'allume puis s'éteint.
etc...
Fin de la boucle et rien ne se passe jusqu'à ce j'appuie de nouveau sur le bouton.

Apparemment il faut utiliser un bouléen.
Mais ça ne marche pas, elle clignote toutes, successivement tant que j'ai le doigt sur le bouton.

Voici mon code:

int tps = 50; // Délais entre chaque Flash
int bouttonstate = 0; // État du bouton
boolean running = false;

const int flash1 = 5; // DigitOut 1
const int flash2 = 6; // DigitOut 2
const int flash3 = 7; // DigitOut 3
const int led = 13; // Led de vérification
const int boutton = 2; // Bouton déclencheur



void setup() {
  Serial.begin(9600);

  pinMode(boutton, INPUT);
  pinMode(led, OUTPUT);
  pinMode(flash1, OUTPUT); 
  pinMode(flash2, OUTPUT);
  pinMode(flash3, OUTPUT);
}

void loop() {
  bouttonstate = digitalRead(boutton);

  if (bouttonstate == HIGH && running == false)
  {
    delay (100); // Pause anti rebond
    digitalWrite (led, HIGH);
    digitalWrite (flash1, HIGH);
    delay (tps);
    digitalWrite (flash1, LOW);
    digitalWrite (flash2, HIGH);
    delay (tps);
    digitalWrite (flash2, LOW);
    digitalWrite (flash3, HIGH);
    delay (tps);
    digitalWrite (flash3, LOW);
    digitalWrite (led, LOW);
    running = true;
  }
  else {
    digitalWrite (led, LOW);
    digitalWrite (flash1, LOW);
    digitalWrite (flash2, LOW);
    digitalWrite (flash3, LOW);
    running = false;
  }
}

Merci!!!

Salut,

N'oublies pas de poster ton code avec les balises "code", le bouton avec un '#' dessus.

Sinon, regarde bien ce bout de ton programme:

if (bouttonstate == HIGH && running == false)
  {
   ... // allumage et extinction de tes sorties

    running = true;
  }
  else {
    ... // toutes les sorties mises à l'état bas

    running = false;
  }
}

Quand le bouton est appuyé, et 'running == false', tu enclenches le déclenchement des sorties. A la fin de cette séquence, tu mets 'running = true;'.
Si tu ne relâches pas ton bouton, tu repasse dans la comparaison 'if... else...', qui t’amène sur 'else...', qui te met 'running' à false.
En restant toujours appuyé sur ton bouton, tu recommences sans fin jusqu'au relâchement.

Il faut que tu rajoute une condition, qui surveille le relâchement du bouton (si le bouton est appuyé et 'running == false', je fais ça 1 fois; si le bouton est appuyé et 'running == true', je ne fais rien, j'attends. Quand le bouton est relâché, je peux remettre 'running' à false).

Cherche un peu, si tu ne trouves pas je te donnerai ma solution :slight_smile:

Bonjour,

Vu que tu replace running à false après avoir fait commuter tes relay la condition dans ton if est toujours vrai, il faut que tu fasse une boucle sur l'état du bouton pour bloquer le programme tant que celui ci n'est pas relâché :wink:

Exemple :

if (digitalRead(boutton) == HIGH) // le bouton a été appuyé
  {
     delay(100); // Anti rebond software
    // ...
    while(digitalRead(boutton) == HIGH); // tant que le bouton reste appuyé on boucle sans fin
    // quand le code sort de la boucle c'est que le bouton a été relaché
  }
  else {
    // ...
  }
}

Pas grave AlienArea51, personnellement je te pardonne ^^

Mais des fois, il faut chercher simple :smiley: