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 !
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);
}
}
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
9 tours pas 10
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
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é
Oui et pour 10 répétitions, il faut partir de zéro :
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.
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
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
Ce code est très basique mais on pourrait même utiliser une machine à état
Oui on peut facilement rester bloqué dans la loop() (qui toune toujours) et c'est parfois utile.
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 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 :
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
}
}
}
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() {}