OK j'avais pas compris l'arrêt (fin de l’acquisition). Cela fait deux conditions, soit deux tests.
Je reprends l'idée de diminuer le temps de la boucle. C'est surtout le temps quand il n'y a pas d'acquisition. Quand une acquisition se présente, elle peut durer longtemps, cela n'a pas trop d'importance (tant que cela ne retarde pas l'acquisition suivante). Du coup, il est plus judicieux de tester la fin des toutes les acquisition en fin de lecture. Il est alors possible de combiner les deux valeurs tempsEchant et dureeAcquisition, par exemple en laissant le test sur tempsCourant >= tempsPrec et en mettant tempsEchant au maximum (il n'y aura plus d'échantillonage avant 50 jours), ou de faire une boucle infinie...
loop() deviendrait alors a peu près:
void loop()
{
tempsCourant = millis() - tempsZero;
if (tempsCourant >= tempsPrec)
lecture();
}
Le réglage étant mis dans setup.
Et pour éviter de ranger et de ressortir tempsCourant, on peut laisser:
void loop()
{
if (millis() - tempsZero >= tempsPrec)
lecture();
}
La deuxième forme fonctionne sauf au moment ou le compteur de temps déborde. Il faut donc utiliser la première forme. C'est bon pour toutes les chronométrages.
Si on fait:
unsigned long tempsZero;
unsigned long tempsPrec;
...
if (millis() - tempsZero >= tempsPrec)
La soustraction et la comparaison se font en 32 bits. Comme Arduino est un micro 8 bits, les opérations doivent se faire en 4 fois. Si on fait:
word tempsZero;
word tempsPrec;
...
if (word(millis()) - tempsZero >= tempsPrec)
On n'a plus que des opérations sur 16 bits. C'est donc deux fois plus rapide.
Cela fonctionne si il est possible de passer en 16 bits, c'est à dire si on utilise micros(), on ne peut dépasser 65000µs soit 65ms.
Pour vérifier ce que je dis, voici un "blink without delay" en utilisant des word:
const word DEMI_PERIODE = 500;
word dernierChangement;
void setup()
{
pinMode(LED_BUILTIN, OUTPUT); // Configuration de la broche de la led
}
void loop()
{
if (word(millis()) - dernierChangement >= DEMI_PERIODE)
{
// Changement de l'état de la LED
if (digitalRead(LED_BUILTIN) == HIGH) // Si la LED est allumée
digitalWrite(LED_BUILTIN, LOW); // Éteint la led
else // Si la LED est éteinte
digitalWrite(LED_BUILTIN, HIGH); // Allume la led
dernierChangement += DEMI_PERIODE; // Nouveau départ
}
}
On peut même utiliser des byte:
const byte DEMI_PERIODE = 250;
byte dernierChangement;
void setup()
{
pinMode(LED_BUILTIN, OUTPUT); // Configuration de la broche de la led
}
void loop()
{
if (byte(byte(millis()) - dernierChangement) >= DEMI_PERIODE)
{
// Changement de l'état de la LED
if (digitalRead(LED_BUILTIN) == HIGH) // Si la LED est allumée
digitalWrite(LED_BUILTIN, LOW); // Éteint la led
else // Si la LED est éteinte
digitalWrite(LED_BUILTIN, HIGH); // Allume la led
dernierChangement += DEMI_PERIODE; // Nouveau départ
}
}
Je crois que la soustraction se fait en 16 bits, d’où la présence d'un deuxième byte(). Le seul intérêt est d'utiliser moins de mémoire