LOCODUINO

Répéter des instructions : les boucles

.
Par : Jean-Luc

DIFFICULTÉ :

Nous allons ajouter une nouvelle corde à notre arc avec les boucles. Une boucle permet d’exécuter de manière répétitive une ou plusieurs instructions. Un premier usage auquel nous pouvons penser est de lire plusieurs capteurs de même nature pour effectuer en conséquence plusieurs actions de même nature. Par exemple supposons que vous vouliez gérer 5 ou 6 ILS avec un Arduino, il est plus concis et plus clair de le faire avec une boucle que de répliquer les instructions pour chacun des ILS.

Le langage permettant de programmer l’Arduino offre 3 types de boucles qui ont chacune un usage.

La boucle while ( ... ) { ... }

La boucle permet de répéter des instructions tant qu’une condition est vraie. Si vous ne savez pas ce qu’est une condition dans le langage de l’Arduino, faites un tour dans l’article « Instructions conditionnelles : le if ... else », vous y trouverez toutes les explications nécessaires.

La syntaxe de la boucle while est la suivante :

while (condition) {
  // à remplacer par les instructions qui seront 
  // exécutées tant que la condition est vraie
}

La boucle suivante est celle utilisée pour mettre en œuvre des boucle infinies, celles qui répètent les instructions sans jamais s’arrêter :

while (true) {
    // instructions exécutées à l'infini
}

Si la boucle n’est pas infinie, la condition est soit issue de l’extérieur de l’Arduino, soit remise à jour par les instructions que la boucle répète. Sinon elle ne peut pas changer. Ainsi si l’on veut compter combien de temps, en dizaines de millisecondes, la broche 4, configurée en entrée numérique, de l’Arduino est HIGH [1], on pourra écrire :

void loop() {
    unsigned long dureePression = 0; // variable pour compter la durée
 
    while (digitalRead(4) == HIGH) {
        dureePression++;
        delay(10);
    }
 
    Serial.println(dureePression);
}

Si le signal sur la broche 4 n’est pas HIGH Au moment du digitalRead, les deux instructions qui sont dans la boucle ne seront pas exécutées et dureePression restera à 0. Si le signal est HIGH au moment de l’exécution du digitalRead, dureePression sera incrémenté puis après 10ms le signal sera de nouveau testé et ainsi de suite. On voit également que la durée sera comptée de manière optimiste. Pour une durée inférieure à 10ms on retrouvera 1 dans dureePression, pour une durée comprise entre 10ms et 20ms, on retrouvera 2, etc.

Incrémenter consiste à ajouter quelque chose à une variable, généralement 1. Décrémenter est l’action inverse. Pour incrémenter dans le langage Arduino, on peut écrire dureePression = dureePression + 1; ou dureePression++;. -- est l’opérateur de décrémentation.

La boucle do { ... } while (condition);

On a vu dans la boucle while (...) { ... } que si la condition était fausse, les instructions de la boucle ne sont pas exécutées. Parfois, il est nécessaire de faire des calculs pour déterminer la condition. Avec la boucle while (...) { ... } que nous venons de voir, il faudrait calculer une première fois la condition avant la boucle puis une seconde fois, répétitivement, dans la condition de la boucle. Pour éviter la duplication du code de calcul de la condition, il existe un autre type de boucle.

Dans la boucle do { ... } while ( ... ); la condition est testée à la fin de la boucle au lieu d’être testée au début. Les instructions de la boucle sont donc exécutées au moins une fois. La syntaxe est la suivante :

do {
    // instructions de la boucle
} while (condition);

Notez le point-virgule obligatoire à la fin du while...

La boucle for ( ... ; ... ; ... ) { ... }

La boucle for ( ... ; ... ; ... ) { ... } permet de répéter une séquence d’instructions avec une séquence d’initialisation exécutée avant la boucle, une condition de continuation et une séquence exécutée à la fin des instructions de la boucle.

La syntaxe est la suivante :

for ( initialisation ; condition ; incrementation ) {
    // instructions de la boucle
}

Habituellement, l’initialisation consiste à mettre une variable, que l’on appelle compteur de boucle à 0 ; la condition consiste à tester cette variable par rapport à une valeur où la boucle doit s’arrêter ; l’incrémentation consiste à incrémenter cette variable. On trouve donc le plus souvent cette boucle sous cette forme par exemple :

for ( int i = 0 ; i < 10 ; i++ ) {
    Serial.println(i);
}

Dans l’ordre d’exécution,, la variable i est déclarée et initialisée à 0. Puis, de manière répétitive, i est comparé à 10 et si il est strictement inférieur, Serial.println(i); est exécuté puis i est incrémenté. Si i est supérieur ou égal à 10, l’exécution du programme continue après la boucle.

La condition étant évaluée avant l’exécution les instructions de la boucle, ces dernières ne sont jamais exécutées si la condition est fausse dès la première évaluation de la condition.

Vous rencontrerez parfois des boucles for où l’initialisation, la condition et l’incrémentation sont vides, comme ceci :

for (;;) {
  // instructions de la boucle
}

Cette syntaxe particulière permet, comme le while (true) { ... } que nous avons vu plus haut de mettre en œuvre des boucles infinies.

C’est très exactement de cette manière que le logiciel de base de l’Arduino appelle la fonction loop() répétitivement.

Si ce n’est pas déjà fait, lisez également « La programmation, qu’est ce que c’est », « Types, constantes et variables », « Instructions conditionnelles : le if ... else » et « Calculer avec l’Arduino (1) »

[1Il peut s’agir d’un capteur de présence et cette durée peut renseigner sur la vitesse d’un train par exemple

7 Messages

  • Répéter des instructions : les boucles 19 février 2017 20:56, par peter

    bonjour , ton article est super mais je n’ai as trouver ce que je rechercher :
    il me faudrait une boucle qui se répète a l’infini mais qui peut être interrompu a n’importe quel moment...
    je suis sur une lampe qui diffuse de la lumiere avec des led et une télécommande .
    quand j’appuie sur la touche 1 ,ça fait du bleu,2 du rouge...ect .Le problème surviens lorsque je veut qu’il fasse toute les couleurs les une après les autre a l’infini,il ne fait plus les couleurs une par une si j’appuie sur la touche 1,2...ect.

    Répondre

    • Répéter des instructions : les boucles 19 février 2017 21:19, par Jean-Luc

      Bonsoir,

      pour sortir d’une boucle quelle qu’elle soit, il faut utiliser l’instruction break.

      Répondre

      • Sortir d’une boucle 13 mars 2017 11:04, par bartolo

        Je sais allumer éteindre une led, j’ai même fait un feux tricolore jaune, rouge , vert et jaune mais je ne sais pas ou mètre la fonction pour l’arrêter, il y a pleins d’explications sympa merci
        Mais serait ’il possible d’avoir un prog qui allume une led 2 fois ou plus et qui s’arrête

        Merci pour un nul de 71 ans

        Répondre

    • Répéter des instructions : les boucles 20 février 2017 15:35, par Dominique

      Bonjour,

      Dans un programme Arduino, la moindre faute d’orthographe ou de syntaxe a pour conséquence une erreur de compilation qui stoppe le développement.

      Jean-Luc est gentil de vous donner la bonne réponse ! Avec plus de 20 fautes dans 6 lignes et demi, le compilateur vous aurait répondu "ERREUR". A vous de corriger !

      Alors, si vous êtes capable de faire 0 faute dans vos programmes, pourquoi ne pas en faire autant sur ce site : c’est une question de respect.
      Vous seriez étranger, on comprendrait mais là, ce n’est pas le cas.
      Désolé de l’avertissement.

      Répondre

  • Répéter des instructions : les boucles 17 août 2020 17:46, par grace

    salut. Svp je veux que tout mon programme s’arrete lorsqu’une condition n’est pas respecter . Que dois je faire svp

    Répondre

  • Répéter des instructions : les boucles 18 août 2020 18:00, par msport
    if (!condition)
    { while(1);
    }

    Répondre

Réagissez à « Répéter des instructions : les boucles »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Les derniers articles

Les articles les plus lus