Ardu? No!Initiation ≫ delay()

delay()

Quand nous avons mis l'ordre d'écrire Bonjour dans loop(), il s'affichait sur la console ce mot plusieurs fois à toute vitesse: la console est vite remplie, l'ascenseur semble bloqué car il va en dernière ligne.

Nous allons ralentir le mouvement. Il faut donc dans loop() répéter indéfiniment (c'est loop() qui fait que cela répète):
- affiche le mot Bonjour
- attendre un peu

A cet effet, il existe une fonction nommée delay() qui va attendre. Il faut donner comme paramètre à cette fonction le nombre de millisecondes (1/1000ème de seconde). Pour attendre une seconde, soit 1000ms, il faut donc donner la valeur 1000.

Dans le setup(), on laissera l'initialisation de la liaison série, et dans loop() qui contient déjà le Serial.println() on rajoutera donc la ligne suivante:

delay(1000);

delay() est une fonction, il y a donc des parenthèses pour l'appeler. Cette fonction n'a pas de résultat direct (elle ne retourne pas de valeur), mais a un effet de bord, l'attente. L'appel à l'instruction s'appelle une instruction. Je la qualifierais de simple. Une instruction c'est une action élémentaire, ce peut être un appel de fonction, mais aussi un calcul, un test, un traitement conditionnel...

Où mettre delay(1000);

La règle générale est de mettre une instruction par ligne. Que vous mettiez tout sur la même ligne ou pas, cela ne change pas le résultat final car la compilation transforme tout ce qui a été écrit en code machine, et dans le code final, il n'y a évidemment plus les espaces, les retours à la ligne, et même les noms ont disparus (setup, delay...). Vous pourriez même écrire pour la boucle:

void
loop
(
)
{
Serial
.
println
(
"Bonjour"
)
;
}

Ce qui est le plus important est que ce soit le plus lisible possible. Il y a d'autres règles que nous verrons ultérieurement.

Tel que j'ai défini mon programme tout à l'heure, il faut que je mette cette instruction après l'écriture du mot bonjour. Le programme fait maintenant:

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

void loop() {
  Serial.println("Bonjour");
  delay(1000);
}

Testez donc cet exercice. Vous devez avoir l'écran qui se remplit à raison d'une ligne par seconde.

Mais que se passerait-il si on mettait l'attente avant et pas après? Le mieux est d'essayer. Vous ne risquez rien, si cela ne fonctionne pas il ne peut pas y avoir de casse. Et vous devez voir la même chose. Est-ce normal?

Dans la boucle il y a deux choses à faire alternativement. Si on met l'attente avant ou après l'écriture, il y aura toujours l'alternance. Mais il y a une toute petite différence au début. Quand on lance le programme, si l'attente est après, on écrit tout de suite, dans l'autre cas, on retarde la première écriture d'une seconde. Mais cela ne se voit pas vraiment, quand on lance le programme en faisant un téléversement il y a déjà une attente, et une seconde de plus ou pas ne se voit pas beaucoup.

Code bloquant

Certains dénigrent delay() parce qu'elle est bloquante. Cela veut dire que pendant que delay() compte le temps, on ne peut rien faire, elle utilise tout le temps de calcul. Je prends une image de la vie courante. Vous jouez à cache-cache et c'est vous qui devez compter jusqu'à 100 pendant que les autres se cachent. Pendant ce comptage, le temps est perdu, vous ne pouvez pas en profiter pour chanter, pour répondre au téléphone, pour penser à ce que l'on va manger à midi... Ce comptage est bloquant, il occupe tout.
On vous offre pour Noël un minuteur. C'est chouette pour cache-cache. Vous réglez le minuteur sur 1mn 40, mais pendant ce temps, vous pouvez faire autre chose! Vous pouvez chanter! On dira que l'attente n'est pas bloquante car on peut faire autre chose en attendant.

Et c'est bien ou pas bien d'être bloquant? Dans le cas ou on affiche notre mot Bonjour, cela n'a pas d'intérêt de pouvoir faire autre chose, car nous n'avons rien d'autre à faire. Mais parfois, il faudra faire autrement. On peut avoir à regarder l'état d'un bouton et agir; on ne peut alors pas se permettre d'attendre que le temps soit écoulé. Cela compliquera les choses, et nous verrons cela beaucoup plus tard.