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

Alors que delay () est 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.

Alors que delay () est 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.
Publicité

Quand vous avez commencé à apprendre Comment développer Arduino: un guide pour débutants Introduction à Arduino: un guide pour débutants Arduino est une plate-forme de prototypage électronique open source basée sur du matériel et des logiciels flexibles et faciles à utiliser. Il est destiné aux artistes, designers, amateurs et toute personne intéressée par la création d'objets ou d'environnements interactifs. Lire la suite pour l'Arduino Qu'est-ce que Arduino et que pouvez-vous faire avec? Qu'est-ce que Arduino et que pouvez-vous faire avec? L'Arduino est un petit appareil électronique remarquable, mais si vous n'en avez jamais utilisé auparavant, que sont-ils exactement, et que pouvez-vous faire avec un? En savoir plus, vous avez probablement construit un produit qui fonctionne un peu comme ceci:

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

arduino-led

Je suis également prêt à parier que vous avez utilisé la fonction delay () pour définir les intervalles entre la lumière allumer et éteindre. Mais voici la chose: tandis que le retard est pratique pour les démonstrations de base sur le 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 Delay () fonctionne

La façon dont la fonction delay () fonctionne est assez simple. Il accepte un entier unique Les bases de la programmation informatique 101 - Variables et DataTypes Les bases de la programmation informatique 101 - Variables et DataTypes Ayant présenté et parlé un peu de la programmation orientée objet avant et d'où son nom vient, je pensais qu'il est temps de passer les bases absolues de la programmation d'une manière non spécifique à la langue. This ... Lire la suite (ou nombre) argument. Ce nombre représente le temps (mesuré en millisecondes) que le programme doit attendre avant de passer à la ligne de code suivante.

Mais le problème est que la fonction delay () n'est pas un bon moyen de faire patienter votre programme, car c'est ce qu'on appelle une fonction de "blocage".

La différence entre les fonctions de blocage et de non-blocage

Pour illustrer pourquoi les fonctions de blocage sont mauvaises, je veux que vous imaginiez deux chefs différents dans une cuisine: Henry Blocking, et Eduardo NonBlocking . Les deux font le même travail, mais de façon très différente.

Quand Henry prépare le petit déjeuner, il commence par mettre deux pains dans le grille-pain. Quand il pique finalement, et le pain sort brun doré, Henry le met sur une plaque et fait craquer deux oeufs dans une poêle à frire. Encore une fois, il se tient à côté de l'huile et les blancs commencent à durcir. Quand ils ont fini, il les assiette et commence à frire deux tranches de bacon. Une fois qu'ils sont suffisamment croustillants, il les enlève de la poêle, les met dans l'assiette et commence à manger.

arduino-chef

Eduardo travaille d'une manière légèrement différente. Pendant que son pain chauffe, il a déjà commencé à faire frire ses œufs et son bacon. Au lieu d'attendre qu'un article finisse de cuire avant de passer au suivant, il cuit plusieurs articles simultanément . Le résultat final est qu'Eduardo prend moins de temps pour faire le petit-déjeuner qu'Henry - et au moment où Henry Blocking a fini, le pain grillé et les œufs sont devenus froids.

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

Les fonctions de blocage empêchent un programme de faire quoi que ce soit d'autre jusqu'à ce que cette tâche particulière soit terminée. Si vous souhaitez que plusieurs actions se produisent en même temps, vous ne pouvez pas utiliser delay () .

En particulier, si votre application vous demande d'acquérir en permanence des données de capteurs attachés, veillez à ne pas utiliser la fonction delay (), car elle interrompt absolument tout .

Heureusement, delay () n'est pas le seul moyen de faire patienter votre programme lors du codage d'Arduino.

Rencontrez Millis ()

La fonction millis () exécute une seule tâche. Lorsqu'il est appelé, il renvoie (en tant que type de données long ) le nombre de millisecondes écoulées depuis le lancement du programme. Alors, pourquoi est-ce utile?

Parce qu'en utilisant un peu de maths simples, vous pouvez facilement "chronométrer" les aspects de votre programme sans avoir d'impact sur 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.

Maintenant, regardons comment cela fonctionne avec Arduino.

arduino-millis-exemple

Ce programme - qui repose largement sur celui de la documentation officielle d'Arduino - fonctionne en soustrayant l'heure enregistrée précédente de l'heure actuelle. Si le reste (c'est-à-dire le temps écoulé depuis la dernière fois) est supérieur à l'intervalle (dans ce cas 1000 millisecondes), le programme met à jour la variable previousTime et active ou désactive la LED.

Et parce que c'est un non-bloquant, tout code situé en dehors de cette première instruction if devrait fonctionner normalement.

Simple, n'est-ce pas? Notez comment nous avons créé la variable currentTime en tant que long non signé . Une valeur non signée 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 de nombre 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 bit supplémentaire à jouer.

Interruptions

Jusqu'à présent, nous avons découvert une façon d'aborder le timing dans notre programme Arduino qui est meilleure que delay () . Mais il y en a une autre, bien meilleure, mais plus complexe: les interruptions . Ceux-ci ont l'avantage de vous permettre de programmer précisément votre programme Arduino, et de répondre rapidement à une entrée externe, mais de manière asynchrone .

Cela signifie qu'il fonctionne en conjonction avec le programme principal, en attendant constamment qu'un événement se produise, sans interrompre le flux de votre code. Cela vous permet de 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 routine de service d'interruption . Une fois que cela a été conclu, le programme revient ensuite à ce qu'il était en train de faire.

La puce AVR alimentant l'Arduino prend uniquement en charge 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 énigmatique. Confus, 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 vous bloquez pas

Utiliser millis () nécessite certes un peu de travail supplémentaire par rapport à l'utilisation de delay () . 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 réel, consultez l'Arduino Night Light et l'alarme Sunrise de James Bruce. Arduino Night Light et Sunrise Alarm Project Arduino Night Light et Sunrise Alarm Project Aujourd'hui, nous allons faire un réveil sunrise, qui vous réveillera doucement et lentement sans avoir recours à une machine de bruitage offensive. Lire la suite

Trouvé d'autres fonctions de blocage dont nous devrions nous méfier? Faites-moi savoir dans les commentaires ci-dessous, et nous allons discuter.

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

In this article