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":
function pattern5on5off(unsigned long totalTime)
{
// Calculate how far through the current cycle we are
const unsigned long cycleTime = totalTime % 10000;
// If we're in the first 5 seconds of the cycle then turn the light on.
// Otherwise, turn it off.
if (cycleTime < 5000)
digitalWrite(3, HIGH);
else
digitalWrite(3, LOW);
}
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 obtenez millis()
; par exemple:
void loop()
{
const unsigned long totalTime = millis();
pattern5on5off(totalTime);
// call other patterns here...
}
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()
dans loop()
, il ne démarre pas à 0 (l'appareil aura déjà été en cours d' exécution pour un court laps de temps avant loop()
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 fois loop()
. Par exemple:
unsigned long g_startTime = 0;
void loop()
{
unsigned long totalTime = 0;
if (g_startTime == 0) {
// This is the first cycle.
// Store the start time so we can compensate later.
g_startTime = millis();
} else {
// This is not the first cycle.
// Compensate for the start time.
totalTime = millis() - g_startTime;
}
pattern5on5off(totalTime);
// etc..
}