La toute première fois que vous avez utilisé une carte Arduino, vous avez probablement fait quelque chose comme ça:
- Connecté une LED à votre Arduino
- Téléchargé l’esquisse de clignotement par défaut qui allumerait et éteindrait votre LED toutes les secondes
Cela s’appelle le programme « Hello World » d’Arduino et montre qu’avec seulement quelques lignes de code, vous pouvez créer quelque chose qui a une application réelle.
Dans l’exemple précédent, vous utilisez la fonction delay() pour définir les intervalles entre l’allumage et l’extinction de la LED.
Voici le problème: bien que delay() soit pratique et fonctionne pour les exemples de base, vous ne devriez vraiment pas l’utiliser dans le monde réel – Continuez à lire pour savoir pourquoi.
Comment Fonctionne la fonction delay()
Le fonctionnement de la fonction Delay() Arduino est assez simple.
Il accepte un seul entier comme argument. Ce nombre représente le temps en millisecondes que le programme doit attendre avant de passer à la ligne de code suivante.
Lorsque vous retardez (1000), votre Arduino s’arrête sur cette ligne pendant 1 seconde.
delay() est une fonction de blocage. Les fonctions de blocage empêchent un programme de faire autre chose jusqu’à ce que cette tâche particulière soit terminée. Si vous avez besoin que plusieurs tâches se produisent en même temps, vous ne pouvez tout simplement pas utiliser delay().
Si votre application nécessite de lire /enregistrer constamment des données à partir d’entrées, vous devez éviter d’utiliser la fonction delay(). Heureusement, il existe une solution.
Fonction millis() à la rescousse
La fonction millis() lorsqu’elle est appelée, renvoie le nombre de millisecondes qui se sont écoulées depuis le début du programme.
Pourquoi est-ce utile?
Car en utilisant des calculs, vous pouvez facilement vérifier combien de temps s’est écoulé sans bloquer votre code.
L’esquisse ci-dessous montre comment vous pouvez utiliser la fonction millis() pour créer un projet blink. Il allume la lumière LED pendant 1000 millisecondes, puis l’éteint. Mais, il le fait d’une manière non bloquante.
Regardons de plus près une esquisse de clignotement qui fonctionne sans fonction de retard:
/* Blink without Delay, example here: arduino.cc/en/Tutorial/BlinkWithoutDelay*/// constants won't change. Used here to set a pin number :const int ledPin = 13; // the number of the LED pin// Variables will change :int ledState = LOW; // ledState used to set the LED// Generally, you should use "unsigned long" for variables that hold time// The value will quickly become too large for an int to storeunsigned long previousMillis = 0; // will store last time LED was updated// constants won't change :const long interval = 1000; // interval at which to blink (milliseconds)void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT);}void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); }}
Voir le code brut
Cette esquisse ci-dessus se trouve ici et fonctionne en soustrayant l’heure enregistrée précédente (previousMillis) de l’heure actuelle (currentMillis). Si le reste est supérieur à l’intervalle (dans ce cas, 1000 millisecondes), le programme met à jour la variable previousMillis à l’heure actuelle et allume ou éteint la LED.
Et comme il s’agit d’un code non bloquant, tout code situé en dehors de cette première instruction if devrait fonctionner normalement.
Vous pouvez maintenant comprendre que vous pouvez ajouter d’autres tâches à votre fonction loop() et que votre code clignoterait toujours la LED toutes les secondes.
Quelle fonction devez-vous utiliser ?
Nous avons appris deux façons différentes de gérer le temps avec l’Arduino. L’utilisation des fonctions millis() demande un peu de travail supplémentaire par rapport à l’utilisation de delay(). Mais vos programmes ne peuvent pas effectuer le multitâche sur l’Arduino sans cela.