Fonction de retard Arduino et pourquoi vous ne devriez pas l'utiliser

Fonction de retard Arduino et pourquoi vous ne devriez pas l'utiliser

Quand tu as commencé apprendre à développer pour l'Arduino , vous avez probablement construit un produit qui fonctionne un peu comme ceci :



Une seule lumière LED serait connectée à votre Arduino. Cela s'éteindrait et s'éteindrait toutes les secondes environ, et continuerait jusqu'à ce que l'Arduino soit éteint. C'est le programme 'Hello World' de Arduino , et illustre parfaitement comment quelques lignes de code peuvent créer quelque chose de tangible.

Je suis également prêt à parier que vous avez utilisé le retard() fonction pour définir les intervalles entre l'allumage et l'extinction de la lumière. Mais voici le problème : bien que le délai soit pratique pour les démonstrations de base du fonctionnement d'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()

La façon dont le retard() la fonction fonctionne est assez simple. Il accepte un seul argument entier (ou nombre). Ce nombre représente le temps (mesuré en millisecondes) pendant lequel le programme doit attendre avant de passer à la ligne de code suivante.

Mais le problème est que le retard() n'est pas un bon moyen de faire attendre votre programme, car c'est ce qu'on appelle une fonction de « blocage ».



est sans danger pour les cartes de crédit

La 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 une cuisine : Henri Blocage , et Eduardo Non bloquant . Les deux font le même travail, mais de manière très différente.

Quand Henry prépare le petit-déjeuner, il commence par mettre deux tranches de pain dans le grille-pain. Quand enfin ping , et le pain ressort bien doré, Henry le met dans une assiette et casse deux œufs dans une poêle à frire. Encore une fois, il reste là pendant que l'huile éclate et que les blancs commencent à durcir. Quand ils ont fini, il les dresse et commence à faire frire deux tranches de bacon. Une fois qu'ils sont suffisamment croustillants, il les retire de la poêle, les met dans l'assiette et commence à manger.

Eduardo fonctionne d'une manière légèrement différente. Pendant que son pain grille, il a déjà commencé à faire frire ses œufs et son bacon. Au lieu d'attendre qu'un élément finisse de cuire avant de passer au suivant, il cuisine plusieurs éléments en même temps . Le résultat final est qu'Eduardo prend moins de temps pour préparer le petit-déjeuner qu'Henry - et au moment où Henry Blocking a terminé, les toasts et les œufs sont devenus froids.

C'est une analogie stupide, mais elle illustre le point.

Blocage Les fonctions empêchent un programme de faire autre chose jusqu'à ce que cette tâche particulière soit terminée. Si vous voulez plusieurs Actions se produire en même temps, vous ne pouvez tout simplement pas utiliser retard() .

En particulier, si votre application vous oblige à acquérir en permanence des données à partir de capteurs connectés, vous devez prendre soin d'éviter d'utiliser le retard() fonction, car il s'arrête absolument tout .

Heureusement, retard() n'est pas le seul moyen de faire attendre votre programme lors du codage pour Arduino.

Rencontrez Millis()

Les millis() fonction effectue une seule tâche. Lorsqu'il est appelé, il retourne (comme un longue datatype) le nombre de millisecondes qui se sont écoulées depuis le premier lancement du programme. Alors, pourquoi est-ce utile ?

Parce qu'en utilisant un peu de mathématiques simples, vous pouvez facilement « chronométrer » les aspects de votre programme sans affecter son fonctionnement. Ce qui suit est une démonstration de base du fonctionnement de millis(). Comme vous le verrez, le programme allumera la lumière LED pendant 1000 millisecondes (une seconde), puis l'éteindra. Mais surtout, il le fait d'une manière non bloquante.

Voyons maintenant comment cela fonctionne avec Arduino.

Ce programme - qui est fortement basé sur un de la documentation officielle Arduino - fonctionne en soustrayant l'heure précédente enregistrée de l'heure actuelle. Si le reste (c'est-à-dire le temps écoulé depuis le dernier enregistrement) est supérieur à l'intervalle (dans ce cas, 1000 millisecondes), le programme met à jour le heure précédente variable à l'heure actuelle, et allume ou éteint la LED.

comment supprimer mes recherches google

Et parce qu'il s'agit d'un code non bloquant, tout code situé en dehors de ce premier si déclaration devrait fonctionner normalement.

Simple, n'est-ce pas ? Notez comment nous avons créé la variable heure actuelle en tant que non signé longue. Un non signé valeur signifie simplement qu'elle ne peut jamais être négative ; nous faisons cela pour que le nombre maximum que nous puissions stocker soit plus grand. Par défaut, les variables numériques sont signées, ce qui signifie qu'un 'bit' de mémoire pour cette variable est utilisé pour stocker si la valeur est positive ou négative. En spécifiant que ce ne sera que positif, nous avons un petit plus avec lequel jouer.

Interruptions

Jusqu'à présent, nous avons découvert une façon d'aborder le timing dans notre programme Arduino qui est meilleure que retard() . Mais il existe un autre moyen, bien meilleur, mais plus complexe : interrompt . Ceux-ci ont l'avantage de vous permettre de chronométrer avec précision votre programme Arduino, et de répondre rapidement à une entrée externe, mais dans un asynchrone manière.

Cela signifie qu'il s'exécute en conjonction avec le programme principal, attendant constamment qu'un événement se produise, sans interrompre le flux de votre code. Cela vous aide à répondre efficacement aux événements, sans affecter les performances du processeur Arduino.

Lorsqu'une interruption est déclenchée, elle arrête le programme ou appelle une fonction, communément appelée Gestionnaire d'interruption ou un Routine de service d'interruption . Une fois que cela a été conclu, le programme revient alors à ce qu'il était.

La puce AVR alimentant l'Arduino ne prend en charge que les interruptions matérielles. Ceux-ci se produisent lorsqu'une broche d'entrée passe de haut en bas, ou lorsqu'elle est déclenchée par les minuteries intégrées de l'Arduino.

Cela semble cryptique. Déroutant, même. Mais ce n'est pas le cas. Pour voir comment ils fonctionnent et voir quelques exemples d'utilisation dans le monde réel, cliquez sur la documentation Arduino .

Ne soyez pas bloqué

À l'aide de millis() Certes, il faut un peu de travail supplémentaire par rapport à l'utilisation retard() . Mais croyez-moi, vos programmes vous en remercieront, et vous ne pouvez pas faire du multitâche sur l'Arduino sans cela.

Si vous voulez voir un exemple de millis() utilisé dans un projet Arduino du monde réel, consultez Arduino Night Light et Sunrise Alarm de James Bruce.

Vous avez trouvé d'autres fonctions de blocage dont nous devrions nous méfier ? Faites-le moi savoir dans les commentaires ci-dessous, et nous discuterons.

Crédits photos : Arduino (Daniel Spiess) , Chef (Ollie Svenson)

Partager Partager Tweeter E-mail Cela vaut-il la peine de passer à Windows 11 ?

Windows a été repensé. Mais est-ce suffisant pour vous convaincre de passer de Windows 10 à Windows 11 ?

Lire la suite
Rubriques connexes
  • DIY
  • La programmation
  • Arduino
A propos de l'auteur Matthieu Hugues(386 articles publiés)

Matthew Hughes est un développeur et écrivain de logiciels de Liverpool, en Angleterre. Il est rarement trouvé sans une tasse de café noir fort à la main et adore absolument son Macbook Pro et son appareil photo. Vous pouvez lire son blog sur http://www.matthewhughes.co.uk et le suivre sur Twitter à @matthewhughes.

comment obtenir un numéro imei sur iphone
Plus de Matthew Hughes

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner
Catégorie Diy