La fonction Arduino Delay et pourquoi vous ne devriez pas l’utiliser
Lorsque vous avez commencé à apprendre à développer pour Arduino, vous avez probablement créé un produit qui fonctionnait un peu comme ceci :
Une lumière LED sera connectée à votre Arduino. Cela s’éteindra et s’éteindra toutes les secondes environ et continuera jusqu’à ce que l’Arduino s’éteigne. Il s’agit du programme « Hello World » d’Arduino qui illustre parfaitement comment quelques lignes de code peuvent créer quelque chose de tangible.
Je serais également prêt à parier que vous avez utilisé Retard() fonction pour définir l’intervalle entre l’allumage et l’extinction des lumières. Mais voici le problème : bien que le délai soit pratique pour une démonstration de base du fonctionnement d’un Arduino, vous ne devriez vraiment pas l’utiliser dans le monde réel. Voici pourquoi – et ce que vous devriez utiliser à la place.
Comment fonctionne delay()
Chemin Retard() Le travail fonctionnel est très simple. Il accepte un seul argument entier (ou nombre). Ce nombre représente le temps (en millisecondes) que le programme doit attendre avant de passer à la ligne de code suivante.
Mais le problème est, Retard() Une fonction n’est pas un bon moyen de faire attendre un programme, car c’est une fonction dite « bloquante ».
Différence entre les fonctions bloquantes et non bloquantes
Pour illustrer pourquoi les fonctions de blocage sont mauvaises, je veux que vous imaginiez deux chefs différents dans la cuisine : Henri Bullocket Eduardo non bloquantLes deux font le même travail, mais de manière très différente.
Quand Henry a préparé le petit-déjeuner, il a d’abord mis deux tranches de pain dans le grille-pain.quand enfin ping, le pain est soudainement devenu doré, et Henry l’a mis dans une assiette et a mis deux œufs dans la poêle. Encore une fois, il est resté là pendant que l’huile éclatait et que les blancs commençaient à durcir. Une fois terminé, il les met dans une assiette et commence à faire frire deux tranches de bacon. Une fois qu’ils étaient assez croustillants, il les sortit de la poêle, les mit dans une assiette et commença à manger.
Faire une vidéo du jour
Eduardo fonctionne un peu différemment. Pendant que son pain grillait, il faisait déjà frire des œufs et du bacon.Au lieu d’attendre qu’un élément finisse de cuire avant de faire le suivant, il cuisine plusieurs éléments. SimultanémentLe résultat final est qu’Eduardo prépare le petit-déjeuner en moins de temps qu’Henry – au moment où Henry Blocking est terminé, les toasts et les œufs sont froids.
C’est une analogie idiote, mais elle illustre le point.
bloc Une fonction empêche le programme de faire quoi que ce soit d’autre jusqu’à ce qu’une tâche spécifique soit terminée.si vous en voulez plusieurs action En même temps, vous ne pouvez tout simplement pas utiliser Retard().
En particulier, si votre application vous oblige à obtenir en permanence des données de capteurs connectés, veillez à ne pas utiliser Retard() fonctionner car il suspend absolument tout.
Heureusement, Retard() Ce n’est pas le seul moyen de faire attendre votre programme pendant le codage pour l’Arduino.
Rencontrez Millis ()
cette milliseconde() Une fonction exécute une seule tâche.Lorsqu’il est appelé, il retourne (comme longue type de données) Le nombre de millisecondes qui se sont écoulées depuis le premier démarrage du programme. Alors, pourquoi est-ce utile ?
Parce qu’en utilisant un peu de maths simples, vous pouvez facilement « chronométrer » des aspects de votre programme sans affecter son fonctionnement. Vous trouverez ci-dessous une démonstration de base du fonctionnement de millis(). Comme vous pouvez le voir, le programme allumera la lumière LED pendant 1000 millisecondes (une seconde), puis l’éteindra. Mais surtout, il le fait de manière non bloquante.
Voyons maintenant comment cela fonctionne avec Arduino.
Ce programme – basé en grande partie sur celui de la documentation officielle Arduino – fonctionne en soustrayant l’heure précédemment enregistrée de l’heure actuelle.Si le reste (c’est-à-dire le temps écoulé depuis le dernier temps enregistré) est supérieur à l’intervalle (dans ce cas 1000 millisecondes), le programme se met à jour dernière fois Peut être changé à l’heure actuelle et allumer ou éteindre la LED.
Et comme il n’est pas bloquant, tout code en dehors du premier si déclaration devrait bien fonctionner.
Simple, n’est-ce pas ?Remarquez comment nous avons créé la variable heure actuelle comme un non signé longue.une non signé valeur signifie simplement qu’elle ne peut jamais être négative ; nous faisons cela pour que le nombre maximum que nous pouvons stocker soit plus grand. Par défaut, les variables numériques sont signées, ce qui signifie qu’un « bit » de mémoire pour la variable est utilisé pour stocker si la valeur est positive ou négative. En précisant qu’il ne sera qu’actif, nous avons un petit plus avec lequel jouer.
couper la parole
Jusqu’à présent, nous avons vu un moyen de gérer le temps dans un programme Arduino qui est plus rapide que Retard()Mais il y a un autre meilleur moyen, mais plus compliqué : couper la paroleIls ont l’avantage de vous permettre de chronométrer précisément votre programme Arduino et de répondre rapidement aux entrées externes, mais asynchrone Chemin.
Cela signifie qu’il s’exécute parallèlement au programme principal, attendant constamment que des événements se produisent sans interrompre le flux de code. Cela vous aide à réagir efficacement aux événements sans affecter les performances du processeur Arduino.
Lorsqu’une interruption est déclenchée, soit elle arrête le programme, soit elle appelle une fonction, généralement appelée gestionnaire d’interruption ou un interrompre la routine de serviceUne fois terminé, le programme revient à son état d’origine.
Les puces AVR qui alimentent l’Arduino ne prennent en charge que les interruptions matérielles. Cela se produit lorsqu’une broche d’entrée passe de haut en bas ou est déclenchée par la minuterie intégrée de l’Arduino.
Cela semble mystérieux. Même déroutant. mais ce n’est pas la vérité. Pour savoir comment ils fonctionnent et pour voir quelques exemples d’utilisation dans le monde réel, cliquez sur la documentation Arduino.
ne sois pas bloqué
utiliser milliseconde() Nécessite certes un travail supplémentaire par rapport à l’utilisation Retard()Mais croyez-moi, votre programme vous remerciera, vous ne pouvez pas effectuer plusieurs tâches sur l’Arduino sans lui.
Si vous voulez voir un exemple milliseconde() Pour les projets Arduino réels, consultez la veilleuse Arduino et l’alarme Sunrise de James Bruce.
Vous avez trouvé d’autres fonctionnalités de blocage dont nous devrions nous méfier ? Faites-le moi savoir dans les commentaires ci-dessous et nous discuterons.
Crédits image : Arduino (Daniel Spiess), Chef (Ollie Svenson)
A propos de l’auteur