Appels de fonctions asynchrones dans l'esquisse Arduino

14

Dans un croquis Arduino, existe-t-il un moyen de faire des appels de fonction asynchrones dans la boucle? Comme écouter les requêtes via le serveur http et les traiter de manière non bloquante .

Jacer Omri
la source
1
Si vous n'êtes pas un débutant en C ++, vous pouvez jeter un œil à la bibliothèque Cosa ( github.com/mikaelpatel/Cosa ). C'est une réécriture complète de la bibliothèque Arduino pour la rendre meilleure: POO et généralement déclenchée par interruption. Je pense qu'ils prennent en charge HTTP, mais je n'ai pas encore vérifié cette partie.
jfpoilpret

Réponses:

11

Oui et non. Vous êtes un peu vague sur ce que vous voulez faire. J'ai fait cela en quelques sections différentes (principalement axées sur la lecture des données des capteurs ... cela s'applique à tout, mais c'est le contexte que j'utilise):

Fils

AFAIK tous les Arduinos n'ont qu'un seul cœur (ils peuvent faire une chose à la fois). Pour la plupart des cartes Arduino, le multithreading matériel n'est pas pris en charge. Cependant, il existe des moyens d'implémenter le multithreading logiciel . L'approche d'AsheeshR ne fonctionnerait pas bien pour les fonctions qui prennent beaucoup de temps à se terminer (c'est-à-dire quelque chose dans une bibliothèque qui prend un certain temps ou un délai) car cela serait coincé par ces instructions, mais cela fonctionnerait bien pour le court fonctions comme pinMode(). La bibliothèque Protothreads répertoriée ici pourrait être meilleure, mais je ne sais pas vraiment.

Il serait difficile d'orchestrer cela avec HTTP, d'autant plus que vous devez faire

Retards

Une manière courante pour un croquis de caler est l'utilisation d'un délai. Cela peut être résolu en utilisant, dans la boucle principale, une instruction if et la millis()fonction qui renvoie une heure (pas une heure d'horloge, mais plutôt l'heure depuis le début de l'Arduino). Vous pouvez également effectuer une boucle dans la boucle pour interroger les données du capteur.

L' millis()approche ne fonctionnerait pas bien avec des choses qui provoquent le blocage de tout le programme (c.-à-d. Plus de retards ou de boucles qui durent un temps notable). Notez que 100 ms IIRC est le temps maximum général pour que l'interface utilisateur ne semble pas décalée.

Les interruptions

Les interruptions sont un excellent moyen de garder les choses presque asynchrones. Ils exécutent un court morceau de code (que vous spécifiez) chaque fois qu'un état de broche change. Il rompt avec le loop(), et revient là où il s'était arrêté une fois le " ISR " exécuté. Je n'ai pas beaucoup de temps pour expliquer comment procéder, mais une recherche rapide sur Google donnera beaucoup de résultats.


En ce qui concerne votre exemple, la section de filetage serait la plus applicable. Ce sujet est assez vague, vous devrez donc expérimenter quelques éléments et trouver quelque chose qui fonctionne.

Pingouin anonyme
la source
3

Je viens de publier du code pour un planificateur de tâches sur le terrain de jeu l'autre jour, vous voudrez peut-être jeter un coup d'œil, peut-être pouvez-vous l'adapter à vos besoins.

Le processeur de l'Arduino est intrinsèquement monothread et ne peut pas effectuer plusieurs tâches. Comme cela a été mentionné, il existe cependant des moyens de créer l'illusion du multitâche. Annonomus Penguin les a assez bien touchés.

Consultez également TimerOne (c'est probablement mieux;)

Aurast
la source
TimerOne est une mauvaise idée car il ne fonctionne qu'avec des arduinos basés sur avr. Par exemple, mon Wemos D1 R1 ne fonctionne pas
Vyachaslav Gerchicov