J'ai un problème qui, à première vue (et étant nouveau sur Arduino), je pensais que c'était une application parfaite pour un Arduino. Cependant, après avoir essayé et échoué à le mettre en œuvre, je doute de moi-même!
Simplement - j'ai besoin de contrôler de nombreuses LED indépendamment, dont beaucoup auront leurs propres modèles individuels - par exemple "5 secondes allumées - 5 secondes éteintes". "flashs continus" - ou séquences telles que "2 flashs, pause, 1 flash". Évidemment, sans le luxe des fils, je deviens un peu décollé. Soyez génial d'entendre si a) Arduino est le meilleur choix et b) si c'est le cas - comment puis-je m'y prendre!
Merci d'avance :)
Réponses:
La gestion de plusieurs modèles en même temps est certainement possible avec une plate-forme comme Arduino, et il existe plusieurs façons de procéder.
Une méthode que je considérerais est d'écrire des fonctions qui représentent efficacement chaque modèle mathématiquement. Vous devez simplement lui transmettre le temps total écoulé dans votre programme jusqu'à présent, et il fera l'action appropriée pour ce moment précis. Il reviendra immédiatement après (pas de retard ou quoi que ce soit).
Pour ce faire, vous devez d'abord savoir combien de temps dure un seul cycle du motif. Vous pouvez ensuite utiliser l'opérateur modulo pour déterminer dans quelle mesure vous êtes dans le cycle actuel. À partir de là, tout ce que vous devez faire est de disposer de certaines
if
conditions pour déterminer quoi faire à un moment donné.Voici à quoi cela pourrait ressembler pour votre modèle "5 secondes allumées, 5 secondes éteintes":
Certes, appeler constamment
digitalWrite()
lorsque vous n'en avez pas besoin techniquement n'est pas très efficace. Cependant, cela ne devrait pas causer de dommages et est assez facile à optimiser si nécessaire.Pour utiliser l'exemple ci-dessus dans un croquis, il vous suffit de l'appeler
loop()
et de passer le numéro que vous obtenezmillis()
; par exemple:D'autres modèles seront plus complexes, mais suivront le même principe. Vous devez simplement utiliser des
if
déclarations appropriées pour exprimer votre logique.La chose vitale à retenir est que la fonction représente un moment précis dans le temps. Il ne doit jamais interrompre ou retarder le programme, sinon il empêchera les autres modèles de s'exécuter.
Edit: Timing sur le premier cycle
Comme jfpoilpret l'a noté dans les commentaires, le tout premier cycle commencera à un point aléatoire. En effet , la première fois que vous appelez
millis()
dansloop()
, il ne démarre pas à 0 (l'appareil aura déjà été en cours d' exécution pour un court laps de temps avantloop()
est appelé). Il est cependant facile à résoudre si nécessaire.Vous le feriez en compensant la
totalTime
valeur par la valeur que vous avez obtenue la toute première foisloop()
. Par exemple:la source
%
approche est que le timing ne sera pas correct la première fois, car il sera juste aléatoire au début.millis
une fois dans la boucle et de transmettre sa valeur en tant que paramètre à chaque fonction led, d'avoir chaque fonction sans paramètre et d'exécuter des millis à l'intérieur de chacune. Cela permettrait à chaque fonction d'obtenir une valeur plus précise, ce qui pourrait ou non être important en fonction du temps nécessaire à l'exécution de chaque fonction dans la boucle, ainsi que des exigences de correction de synchronisation de l'application.Arduino est un bon choix pour la tâche - facile à démarrer. La clé est d'écrire du code non bloquant. Vous pouvez jeter un œil à l'exemple BlinkWithoutDelay.
J'ai fait une suggestion pour votre tâche:
la source
Je sais que le message est ancien, mais j'ai vérifié l'exemple avec l'approche basée sur les tableaux et à mon avis:
donnera toujours la taille allouée (nombre d'éléments) du tableau - dans ce cas 10. Ainsi, le chronométrage ne redémarrera pas jusqu'à ce que vous ayez atteint la "fin" du tableau, en utilisant des éléments non définis. Pour la LED "0":
Salutations Tommy
la source