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

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

Initiation à Arduino - Guide du débutant Initiation à Arduino - Guide du débutant Arduino est une plate-forme de prototypage électronique à code source ouvert basée sur un matériel et un logiciel flexibles et faciles à utiliser. Il est destiné aux artistes, concepteurs, amateurs et à toute personne intéressée par la création d'objets ou d'environnements interactifs. En savoir plus sur l'Arduino Qu'est-ce qu'Arduino et que pouvez-vous en faire? Qu'est-ce qu'Arduino et que pouvez-vous en faire? L'Arduino est un petit appareil électronique remarquable, mais si vous n'en avez jamais utilisé, que sont-ils exactement et que pouvez-vous en faire? En savoir plus, vous avez probablement créé un produit qui fonctionne un peu comme ceci:

Connecté à votre Arduino serait un seul voyant. Cela s'éteindrait toutes les secondes environ et continuerait jusqu'à ce que l'Arduino soit éteint. C'est le “Bonjour le monde” programme d’Arduino, et illustre parfaitement comment quelques lignes de code peuvent créer quelque chose de concret.

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 la chose: bien que le retard soit pratique pour des 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 Delay () fonctionne

La façon dont le retard() la fonction fonctionne est assez simple. Il accepte un seul entier Principes de base de la programmation informatique 101 - Variables et DataTypes Principes de base de la programmation informatique 101 - Variables et DataTypes Après avoir introduit et parlé un peu de la programmation orientée objet avant et de la source de son homonyme, j'ai pensé qu'il était temps de passer à travers les bases absolues de la programmation d'une manière non spécifique au langage. Cet argument… Lire Plus (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 retard() la fonction n'est pas un bon moyen d'attendre votre programme, car c'est ce qu'on appelle un “blocage” une fonction.

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: Henry bloquant, et Eduardo NonBlocking. 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 rondelles de pain dans le grille-pain. Quand finalement pings, et le pain apparaît brun doré, Henry le met sur une assiette et coupe deux œufs dans une poêle à frire. Encore une fois, il reste à côté de l'huile et les blancs commencent à se durcir. Quand ils ont fini, il les assemble et commence à faire 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..

Eduardo fonctionne d'une manière légèrement différente. Alors que son pain est en train de griller, il a déjà commencé à faire frire ses œufs et son bacon. Au lieu d'attendre la fin de la cuisson d'un plat avant de passer au suivant, il prépare plusieurs plats en même temps. Le résultat final est que Eduardo prend moins de temps que Henry pour préparer le petit-déjeuner - et lorsque Henry Blocking a terminé, les toasts et les œufs ont refroidi..

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 actes se produire en même temps, vous ne pouvez tout simplement pas utiliser retard().

En particulier, si votre application nécessite l’acquisition constante de données provenant de capteurs connectés, veillez à ne pas utiliser le logiciel. retard() fonction, car il fait une pause absolue tout.

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

Rencontrez Millis ()

le millis () fonction effectue une seule tâche. Lorsqu'il est appelé, il retourne (en tant que longue type de données) 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 “temps” aspects de votre programme sans impact sur son fonctionnement. Ce qui suit est une démonstration de base du fonctionnement de millis (). Comme vous le verrez, le programme allume le voyant pendant 1000 millisecondes (une seconde), puis l'éteint. Mais surtout, il le fait de manière non bloquante.

Voyons maintenant comment cela fonctionne avec Arduino.

Ce programme - qui est largement basé sur un document de la documentation officielle Arduino - fonctionne en soustrayant l’heure actuelle de l’heure actuelle. Si le reste (c.-à-d. Le temps écoulé depuis la dernière heure d'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.

Et parce que c'est un code non bloquant, tout code situé en dehors de cette première 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é la 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 une “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 extra pour jouer avec.

Interruptions

Jusqu’ici, nous avons découvert une façon d’approcher le timing de notre programme Arduino qui est meilleure que retard(). Mais il y a un autre moyen, bien meilleur, mais plus complexe: interrompt. Celles-ci ont l’avantage de vous permettre de chronométrer votre programme Arduino avec précision et de répondre rapidement à une entrée externe, 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 permet de réagir efficacement aux événements sans affecter les performances du processeur Arduino..

Lorsqu'une interruption est déclenchée, il arrête le programme ou appelle une fonction, connue sous le nom de Gestionnaire d'interruption ou un Routine de service d'interruption. Une fois que cela est terminé, le programme revient ensuite à ce qu'il se passait.

La puce AVR qui alimente l’Arduino ne prend en charge que les interruptions matérielles. Celles-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 ça ne l'est pas. Pour voir comment ils fonctionnent et voir quelques exemples d’utilisation dans le monde réel, consultez la documentation Arduino..

Ne pas se faire bloquer

En utilisant millis () certes prend un peu de travail supplémentaire par rapport à l'utilisation retard(). Mais croyez-moi, vos programmes vous en remercieront et vous ne pourrez pas effectuer plusieurs tâches en même temps sur l'Arduino..

Si vous voulez voir un exemple de millis () utilisé dans un projet Arduino du monde réel, jetez un œil à la veilleuse et au réveil Sunrise Alarm de James Bruce. Projet de veilleuse et réveil Sunrise Arduino Projet de veilleuse et réveil Sunrise Arduino Aujourd'hui, nous allons fabriquer un réveil lever du soleil, qui vous réveillera doucement et lentement sans recourir à une machine à bruit offensant. Lire la suite

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

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

Explorez plus sur: Arduino, Programmation.