La fonction loop() sur Arduino : son principe, son fonctionnement et comment l'utiliser
Comme la fonction setup() dans un programme Arduino, la fonction loop() est la deuxième fonction fondamentale dans la structure d'un programme Arduino. Cette fonction constitue la partie et la structure de base de tous les sketches développés, quel que soit la référence de la carte utilisée; Arduino Uno, Arduino Nano, Arduino Zero, ... etc. Ainsi, tout programme écrit sous Arduino doit comporter, au minimum, ces deux fonctions essentielles. Ce qui nous donne la structure suivante, même si ces deux fonctions restent vides :
void setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
void loop() {
// placez votre code principal ici, pour qu'il s'exécute en boucle indéfiniment.
}
Ces deux fonctions essentielles pour un code Arduino sont indissociables. Si l’une ou l'autre est manquante, le code ne pourra pas être compilé et une erreur sera signalée dans la fenêtre "sortie" de l'éditeur Arduino IDE. Lorsque vous lancez une nouvelle instance de cet éditeur, c'est automatiquement qu'un programme vide est créé, avec par défaut les deux fonctions setup() et loop(); la capture ci-dessous nous présente cela :

Pourquoi la fonction loop() ?
Contrairement à la fonction setup(), qui ne s'exécute qu'une seule fois au démarrage de la carte, la fonction loop() est exécutée de manière répétitive infinie pendant toute la durée de fonctionnement de notre carte, et plus précisément pendant toute la durée de la mise sous tension du microcontrôleur de la carte Arduino. Pour avancer dans votre formation et avec vos codes, la maîtrise de fonction loop() devient indispensable pour créer et développer non seulement vos premiers programmes, si vous débuter dans la robotique, mais aussi des programmes efficaces, réactifs et fiables.
Ainsi, lorsque le microcontrôleur arrive à l'exécution de la dernière instruction de cette fonction, ce dernier revient automatiquement au début de la fonction et ainsi de suite. Il est donc à noter qu'il n'est pas donc nécessaire d'utiliser une boucle itérative infinie telle que la boucle définie par l'instruction while(true).
Syntaxe de la fonction loop()
Identiquement à la fonction setup(), la syntaxe de cette fonction s'écrit aussi de la même façon comme suit :
void loop() {
// placez votre code principal ici, pour qu'il s'exécute en boucle indéfiniment.
}
Composée de 3 composantes essentielles, cette fonction est décomposée en :
La fonction void
Le mot-clé void en C++ est utilisé pour déclarer une fonction qui ne renvoie aucune valeur à l’issue de son exécution. Contrairement à une fonction qui retour une valeur de type entier (int) ou de type décimal (float), ou tout autre type, une fonction déclarée sous le mot-clé void a pour objectif d’exécuter une série d’instructions sans retourner aucun résultat au programme appelant. Ainsi, la fonction loop() d’un programme Arduino exécute les instructions une par une en boucle indéfiniment, sans retourner aucune valeur.
Le nom de la fonction
Le nom de cette fonction, appelé loop(), ne peut être différent de celui défini par Arduino. Ce mot-clé est donc réservé par le framework Arduino et il ne doit jamais être écrit autrement. Si vous l'oubliez ou vous le modifiez, la compilation du code écrit échoue et un message d'erreur vous sera notifié dans la fenêtre appropriée "sortie" (appelé aussi "Output" si vous installez la version anglaise de l'éditeur Arduino IDE).
Les parenthèses () et les accolades {}
Comme toute fonction void dans la langue C++, il est obligatoire d'ajouter les parenthèses pour déclarer les paramètres de la fonction. Sauf d'après le framework Arduino, la fonction loop() ne prend pas de paramètres et ne transmet aucun. Donc, ces deux parenthèses restent toujours vides.
Et pour définir le début et la fin de cette fonction, comme toute autre fonction écrite en C++, nous devons ajouter deux accolades pour déclarer le début et la fin de cette fonction.
Quel code peut contenir la fonction loop() ?
La fonction loop(), comme indiqué ci-dessus, est la fonction principale pour exécuter l'ensemble des tâches et fonctions que nous souhaitons réaliser ou commander avec la carte Arduino. Pour vous donner une idée, nous vous listons ci-dessous la majorité des traitements possibles depuis cette fonction dans un programme Arduino que nous pouvons réaliser facilement :
- analyser, traiter et calculer,
- lire un ou plusieurs capteurs
- communiquer avec un équipement externe via une liaison en série
- lire une ou plusieurs entrées numériques,
- lire une ou plusieurs entrées analogiqes,
- commander des diodes LED; soit donc afficher la valeur binaire 1 ou 0,
- piloter des moteurs; soit directement ou en ajoutant un étage de protection à base d'un relais, transistor, ou autre,
- écrire sur un écran LCD ou OLED; soit donc un nouvel affichage ou la mise à jour d'un affichage en cours.
- etc.
Il est à noter que certaines fonctions et certaines, qui ne nécessitent d’être exécutées qu’une seule fois, ne doivent pas être placées dans la fonction loop().
Une erreur à ne pas commaitre !
Comme nous l'avons étudié ensemble dans le cours de la fonction setup(), certaines fonctions doivent être déclarées dans le bloc approprié pour initialiser la carte Arduino et non pas dans le corps de la fonction loop() pour traitement. Par exemple, la fonction pinMode(), une fonction utilisée pour configurer le mode de fonctionnement d’une broche numérique, la fonction Serial.begin() pour initialiser la communication série entre notre carte Arduino et l'ordinateur ou tout autre équipement compatible ne doivent pas être prédéfinies dans la fonction loop().
Ainsi, le code ci-dessous est à éviter fortemen :
void setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
void loop()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
Comme nous le constatons, la liaison série serait réinitialisée à chaque passage dans la boucle et la définition du pin 13 aussi. Ce qui n'est pas optimal pour le bon fonctionnement de la solution puisque ces déclarations doivent être faites dans la fonction setup().
La fonction loop() et les boucles itératives
Par défaut, la fonction loop() est une fonction iétrative; qui se rappelle automatiquement dès qu'elle se termine. Certains débutants en codage ajoutent une boucle itérative comme la boucle for, while, ou même do...while à l'intérieur de la fonction principale pour exécuter leurs code en boucle, comme nous le montre l'exemple ci-dessous, sauf qu'Arduino le fait automatiquement :
void loop()
{
while(true)
{
}
}
Cette erreur rend souvent le code, dès qu'il commence à être long et volumineux, plus difficile à le maintenir et peut empêcher l'exécution de certaines bibliothèques correctement.
Exemple
Premiers codes pratiques
Pour vous familiariser encore avec cette fonction, nous vous proposons les quelques exemples ci-dessous pour débuter :
Allumer une LED en permance
Pour allumer une diode LED en permanence, il est demandé de configurer, par exemple la broche 11 de la carte Arduino, comme une sortie dans la fonction setup() puis l'activer à la valeur 1 logique ou HIGH, soit 5V ou 3.3V, dans la fonction loop(). Etant donné que toute instruction de la fonction loop() est répétée indéfiniment, la diode LED restera toujours allumée puisque la fonction digitalWrite() l'allumera et aucune autre fonction ne demandera de l'éteindre, soit la remettre à l'état 0 logique; indiqué par la valeur LOW, soit le 0V.
void setup()
{
pinMode(11, OUTPUT);
}
void loop()
{
digitalWrite(11, HIGH);
}
Clignoter une LED
Dans la continuité du premier code, que nous avons découvert ensemble ci-dessus, si nous éteindrons la diode LED après l'avoir allumée tout en espaçant les deux instructions par un temps d'attente de 2 secondes par exemple, la diode clignotera. Pour cela, dans la même fonction loop(), nous allons ajouter un delay de 2000ms avant de la désactiver la LED. Ainsi, le déroulement du programme demandé sera comme suit :
- la LED s'allume, puis,
- le programme attend deux secondes, puis,
- la LED s'éteint, puis,
- le programme attend deux secondes, en enfin,
- le programme repart de zéro et revient à l'étape 1.
Et le code sera par exemple comme suit :
void setup()
{
pinMode(11, OUTPUT);
}
void loop()
{
digitalWrite(11, HIGH);
delay(2000);
digitalWrite(11, LOW);
delay(2000);
}
Aller plus loin, programmez votre carte Arduino
Pour débuter avec Arduino, nous vous invitons à réaliser, chez vous même si vous n'avez toujours pas acheté votre première carte Arduino, les deux activités de découvertes ci-dessous :
- Arduino Nano - Faire clignoter une diode LED : activité à réaliser sous la solution SimulIDE
- Commande séquentielle de 4 diodes LED à l'aide d'une carte Arduino Uno : activité à réaliser sous la solution SimulIDE
Voir aussi
Pour rappel, nous vous invitons à voir aussi :
Référence
Vous cherchez à obtenir plus de détails, nous vous invitons à consulter la page officielle fournie par Arduino ci-dessous :