Arduino : Comment Gérer Le Temps
Maybe your like
Comme nous l'avons dit précédemment, lorsque vous utilisez la fonction delay() ou delayMicroseconds() tout le programme s’arrête. Ce n'est pas toujours un souci, si le programme n'a rien d'autre à effectuer, mais dans certains cas c'est gênant par exemple si vous souhaitez continuer à surveiller une entrée et répondre rapidement.
Par exemple, nous voulons faire clignoter une LED à une certaine fréquence, sauf si un bouton est appuyé. On pourrait modifier le programme précédent de clignotement ainsi :
Le souci cependant c'est que si on appuie sur le bouton juste après avoir allumé la LED, rien ne va se passer et si on ne le tient pas appuyé plus de 2 secondes, le code ne verra pas la broche à LOW lors du prochain tour de boucle : notre programme n'est pas réactif, l'expérience utilisateur est mauvaise.
Pour corriger cela, il faut écrire un programme qui ne va pas bloquer le microcontrôleur.
On va donc commencer par écrire un clignotement qui ne bloque pas, sans delay(). Il suffit de mémoriser le moment de dernier changement d'état de la LED (debut) et laisser la LED dans cet état jusqu'à ce qu'une certaine durée se soit écoulée. À ce moment, on inverse à nouveau l'état de la LED, on note ce nouveau moment et on recommence.
Tout le secret est donc dans le test :
Sélectionnezif (maintenant - debut >= 1000)que l'on répète dans la boucle. Le calcul dit : « si la durée écoulée entre le début et maintenant dépasse 1000 millisecondes alors… ».
Vous remarquez qu'il n'y a pas de else. Donc si le temps n'est pas écoulé, on ne fait rien et la boucle va juste reboucler et on va continuer à tester si c'est le bon moment. Ça ne change donc pas trop du code précédent, on clignote, mais la grande différence, c'est que l'on peut donc effectuer d'autres traitements si le temps n'est pas écoulé.
Par exemple, on pourrait dire « si le bouton est appuyé, éteindre la LED et ne plus clignoter ».
Dans ce code, on va regarder si c'est le moment de clignoter seulement si le bouton n'est pas appuyé, sinon on éteint la LED. Comme nous n'avons plus de delay(), le code ne bloque jamais et donc notre programme sera maintenant très réactif : dès que vous pressez le bouton, la LED s'éteint et dès que vous le relâchez, elle se remet à clignoter.
Une erreur fréquente est de prendre un int ou unsigned int comme type de variable pour représenter le temps (debut, maintenant). Sur un UNO ou MEGA un int ne peut pas aller au-delà de 32 767 et un unsigned int au-delà de 65 535 – soit environ 33 ou 66 secondes. Donc si vous testez votre code pendant quelques secondes, vous n'allez rien déceler, mais en production, très vite votre code aura un comportement anormal. Il est donc important de toujours prendre un unsigned long (que l'on note aussi uint32_t pour unsigned int sur 32 bits) pour représenter le temps.
Vous remarquerez que le test sur la durée est écrit sous la forme maintenant - debut >= 1000. On voit souvent des codes avec maintenant >= debut + 1000 et c'est mathématiquement similaire dans le cas général. Cependant, il faut retenir la première formulation et bannir la seconde si votre code doit tourner longtemps. En effet, quand vous approcherez des ~50 jours fatidiques, le unsigned long qui permet de stocker debut va s'approcher de sa valeur maximale. Rajouter 1000 à cette valeur va donc faire déborder ce qui est représentable et on se retrouvera avec une valeur proche de zéro.
La valeur de millis() (maintenant) sera elle très grande (proche des 50 jours) et donc le test maintenant >= debut + 1000 sera tout de suite vrai, sans avoir attendu les 1000 ms. En prenant l'approche par soustraction, même lorsque maintenant a débordé et retourné à 0 et que debut est proche de 50 jours, maintenant - debut représentera bien la bonne durée, et le test sera valable.
Tag » Arduino Compter Le Temps
-
Compteur De Temps Entre Deux Mesures Sur Arduino - Français
-
Compter Les Temps D'activité D'une Sortie - Français - Arduino Forum
-
Calculer Le Temps Entre Deux états - Français - Arduino Forum
-
Compter Le Temps Qui S'écoule Dans Notre Vie Sans Utiliser Millis() Et ...
-
La Gestion Du Temps Avec Arduino - L'esprit Do It Yourself
-
Introduire Le Temps - Arduino : Premiers Pas En Informatique ...
-
Comment Gérer Le Temps Dans Un Programme - Locoduino
-
Arduino Cours Sur Le Temps Avec Delay Et Millis - Oui Are Makers
-
Arduino #33: Comment Mesurer Le Temps D'exécution
-
Arduino #25: La Gestion Du Temps - Les Fonctions Millis() Et Micros ...
-
Arduino 33 BLE : Mesure De Temps Et De Fréquence
-
Déterminer Le Temps D'exécution D'une Fonction En Langage Arduino.
-
Utilisation De La Fonction Millis() De L'IDE Arduino - AranaCorp
-
[Arduino] Compter Le Temps Par AntoineMompas - Page 1