Arrêt compteur avec boucle For

Bonjour !

J' essai de faire un compteur qui doit arrêter le void loop au bout de 10 répétitions.
Je me suis inspiré de tous ce que j'ai pu voir, lire et comprendre mais je n'ai pas trouvé la bonne syntaxe puisque le loop ne s'arrête pas au bout de 10 répétitions.

Merci pour votre aide ! :wink:

Voici comment j'ai fait :

Void Setup(){
// déclaration variable du compteur
int compteur= 1;
}

Void loop(){
for ( int compteur = 1; compteur <10; compteur ++) {

{
//code à effectuer
}

if (compteur > 10){
       compteur  = 0;
       break; // sortie de la boucle
    }
    delay(50);
}
}

Bonjour

Pourquoi poster dans la catégorie des tutos ?

Lisez svp les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

Je déplace votre post pour cette fois.

Votre code compile ?? (Ça m’étonnerait)

Pour votre question lisez des infos sur la portée des variables scope

➜ votre compteur du setup n’est pas celui de la loop qui n’existe que dans la boucle for.

La loop tournant sans arrêt ce n’est pas un break qui va faire arrêter le code. Il faut une boucle infinie while(true) ; par exemple mais si votre code ne doit pas boucler et faire une seule fois quelque chose, mettez cela dans le setup et laissez la loop vide

Bonjour @guillaume07230

Essayez ce code :

void setup(){

Serial.begin(115200);
}

void loop(){
for ( int compteur = 1; compteur <10; compteur ++) {


Serial.println(compteur);
delay(1000);
}

//if (compteur > 10){
//       compteur  = 0;
//       break; // sortie de la boucle
//    }
//    delay(50);

}

En plus des explications de @J-M-L ça devrait vous aider à comprendre ...
Et Void ou void ????

Bonnes recherches

9 tours pas 10 :slight_smile:
Et ça loop toujours et qui est compteur dans le print ??

void setup(){
  for ( int compteur = 0; compteur <10; compteur ++) {
    // ceci sera exécuté 10 fois i variant de 0 à 9
    …
  }
}

void loop() {} // on ne fait plus rien 


Il y a des problèmes sur le forum j'ai du m'y reprendre à trois fois avant que mes modifications soient prises en compte :wink:

Oui mais le code est buggy :slight_smile:

Bonjour @J-M-L ,
Vous avez tenté de modifier une accolade en trop dans mon message que j'essayai de supprimer moi-même...
C'est pour cette raison que ça a buggé :wink:

Oui et pour 10 répétitions, il faut partir de zéro :

void setup() {
  Serial.begin(115200);
}

void loop(){
  for ( int compteur = 0; compteur <10; compteur ++) {
    Serial.println(compteur);
    delay(1000); 
  }
}

:grinning:
j'avais pas vu les 10 répétitions ...
Bonne journée.

(j'ai refait un peu de ménage pour l'indentation et virer le commentaire qui est perturbant - j'espère que vous ne m'en voudrez pas)

la question est de savoir si @guillaume07230 veut arrêter la loop complètement ou juste faire 10 étapes et recommencer

Bien sûr que non :wink:

Pas certain qu'il le sache lui-même mais il peut préciser...

Bonjour,

On ne peut pas arrêter la loop, mais vous pouvez aussi, pour respecter la philosophie du "setup" et de le "loop", définir la valeur de initiale de "compteur" = 0 dans le setup.
La modifier dans une boucle inclue dans loop.
Et ne faire cette cette boucle que sous une condition.

Ainsi vous faite en permanence ce qui est inscrit dans loop, MAIS que si une condition est remplie.

  • SI compteur < 10:
    ----- ALORS compteur = compteur + 1
  • SINON
    ----- ne rien faire

Au bout de 10 repétitions dans la loop, compteur = 9, et comme il n'est pas remit à 0, vous n'y revenez plus.

Ça peut paraitre une futilité, mais ça peut vous être utile pour comprendre par la suite, pour vos prochains programme, la subtilité de

void setup(): qui ne se fait que une fois au demarrage

void loop(): qui comme son nom l'indique se fait en boucle

void toto(): qui se fait à chaque fois qu'on l'appelle.

...

Bonjour @jef59,

Je pense que @J-M-L voulait dire la boucle ...
On ne peut pas arrêter la loop mais on peut arrêter la boucle après une exécution dans la loop mais je ne veux pas compliquer les choses pour @guillaume07230

mais on peut rester "coincé" dans la loop

void loop() {
 while (true) delay(1);
}

je conviens cependant que ne pas bloquer la loop est une bonne pratique

byte compteur = 0;

void setup() { 
  // on fait les initialisations nécessaire au programme
  ...
}

void loop() {
  if (compteur < 10) {
    ...         //  on fait une étape de ce que l'on veut faire 10 fois
    compteur++; // on augmente le compteur
  } else {
    // on fait ici ce qu'il faut faire d'autre une fois que les 10 fois sont passées
    ...
  }

  // ici on fait ce que l'on veut toujours faire indépendamment du compteur
  ...
}

On peut tout faire en programmation, par exemple on peut limiter le nombre de boucles à 2 :

int  nombreBoucle = 1;

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

}

void loop() {

  while (nombreBoucle < 3) {
    Serial.print("boucle : ");
    Serial.println(nombreBoucle);
    for ( int compteur = 0; compteur < 10; compteur ++) {
      Serial.println(compteur);
      delay(1000);
    }
    nombreBoucle++;
    if (nombreBoucle>2) Serial.println("STOP");
  }
  
}

ça pourrait être 1, 2 ou 3, 4 boucles ... Après il faut que ce soit utile :wink:
Ce code est très basique mais on pourrait même utiliser une machine à état :wink:
Oui on peut facilement rester bloqué dans la loop() (qui toune toujours) et c'est parfois utile.

Bonjour @jef59

Si, on peut avec une boucle infinie :

while(1==1) {;}

ou

while(true) {;}

Vous voulez dire cela ?

byte conteur = 0; // on initialise le conteur
void setup() { // une fois au démarrage
  conteur = 0;
  Serial.begin(115200);
}

void loop() { // boucle à l'infinie
  // on incrémente le conteur
  conteur = conteur++;
  // on affiche la valeur du conteur
  Serial.println(conteur);
  // on attend une demi-seconde pour que l'arrête soit visible
  delay(500);
  // si le conteur est à 9 (de 0 à 9 : 10), alors...
  if(conteur >= 9) {
    Serial.println("Le conteur est à 10 > Arrêt du programme !");
    while(true) {;}  // ...on arrête le programme
  }
}

Alors dans ce cas, le "conteur = 0;" dans le setup ne sert à rien puisqu'il est déjà initialisé à 0.
Mais peut-être ai-je mal compris ;) Si c'est le cas excusez-moi.


Rohh.... Doublé par @J-M-L :woozy_face: EDIT : ah, et aussi par @philippe86220 ;).... Bon je poste quand même.


@guillaume07230 Pour en revenir à votre code de départ (voir post #1), vous n'avez, je pense, pas tout à fait compris ses éléments.


Un for est une boucle qui va s'incrémenter (ou se décrémenter) jusqu'à une certaine valeur passée en paramètre. Tant que cette valeur n'est pas atteinte, on reste dans le for. Par exemple, on peut faire ça :

void setup() {
  for(byte i = 0; i<20;i++) {
    Serial.print("Valeur du conteur : "); Serial.println(i);
    delay(500);
  }
}

void loop() {/*rien ici*/}

Mais on peut aussi décrémenter, comme je l'ai dis :
for(byte i = 0; i<20;i--) {}

En espérant avoir été utile,
Cordialement
Pandaroux007

:roll_eyes: @philippe86220 je montrais tout bêtement une autre possibilité parmis X de programmer une boucle pour qu'elle ne se fasse qu'une seule fois.

Bonne journée.

Pas de soucis, c'est bien ce que tu as fait :wink:

bonjour @pandaroux007,

Je corrige ton premier code :

byte conteur = 0; // on initialise le conteur
void setup() { // une fois au démarrage
  //conteur = 0;
  Serial.begin(115200);
}

void loop() { // boucle à l'infinie
  
  // on affiche la valeur du conteur
  Serial.println(conteur);
  // on attend une demi-seconde pour que l'arrêt soit visible
  delay(500);
  // on incrémente le conteur
  conteur++;
  // si le conteur est à 10 (de 0 à  10), alors...
  if (conteur > 10) {
    Serial.println("Le conteur est à 10 > Arrêt du programme !");
    while (true) {
      ; // ...on arrête le programme
    }
  }
}

Exact

même si c'est un usage classique, ce n'est pas que cela :slight_smile:

C'est en fait très général, l'iteration statement for peut se définir ainsi

for (statement 1; statement 2; statement 3) {
  // bloc de code à exécuter
}

statement 1 est exécutée (une fois) avant l'exécution du bloc de code.
statement 2 définit la condition d'exécution du bloc de code, évalué (à chaque fois) avant chaque exécution du bloc, si c'est faux on s'arrête
statement 3 est exécutée (à chaque fois) après l'exécution du bloc de code.

je peux donc par exemple faire une boucle for comme cela :

bool conditionContinuation() {
  return random(100) < 95;
}

void setup() {
  Serial.begin(115200);
  for (Serial.println("Debut de la boucle"); conditionContinuation(); Serial.println("\tYoupee on continue")) {
    Serial.println("\tune étape de plus");
  }
  Serial.println("Fin de la boucle");
}

void loop() {}

Ce n'est pas faux :thinking:enfin, je veux dire "c'est vrai".