patg_:
DizHell:
Si je l'utilise pour faire des comparaison dans le temps, que ce passera t'il lorsque cette fonction arrivera à sa valeur maxi...?
Ma Comparaison risque de ne plus marché, je présume.
Si ça continue de marcher, car la différence des deux valeurs est toujours correcte (j'ai plus le lien qui explique ça en tête).
Pour ce qui est du temps, il ne faut jamais comparer la valeur de millis() ou micros() en absolu mais toujours des différences.
Par exemple pour faire changer d'état une led toute les seconde (je zappe les initialisation/setup etc./..)
Première version : on conserve la date de l’évènement précédant et on calcule le temps écoulé depuis.
On reste en "unsigned long" car le temps écoulé depuis l’évènement précédant est toujours un nombre positif.
unsigned long derniere_date = 0;
byte etat_led = 0;
byte led = 13;
void loop()
{
unsigned long maintenant = millis();
unsigned long temps_ecoule = maintenant - derniere_date;
if ( temps_ecoule >= 1000 )
{
digitalWrite( led, etat_led = ~etat_led );
derniere_date = maintenant
}
}
Dans certains cas, plutôt que de raisonner sur le temps écoulé depuis le précédent évènement, on préfère (ou on doit) calculer la date à laquelle le prochain évènement doit intervenir
Il s'agit donc de savoir si on se trouve avant ou après cet évènement
malheureusement ce code si ne marche pas :
if ( millis() > date_prochain_evenement )
{
}
Tout simplement parce que la valeur de millis() étant compté en millisecondes sur un entier de 32 bits, cette valeur reboucle par 0 toutes les 49 jours.
Donc ce code va marcher la plupart du temps mais va faire une connerie tout les 49 jours
Donc pour savoir si on a dépassé une date ou pas, on va travailler toujours en différence mais signée :
long date_prochain_evenement = (long)millis(); // le (long) est un cast qui force la valeur de millis() a être pris comme un long (signé) au lieu d'un unsigned long
byte etat_led = 0;
byte led = 13;
void loop()
{
long maintenant = (long)millis();
long temps_ecoule = maintenant - date_prochain_evenement;
// si la valeur est négative on n'a pas encore atteint la date attendue
// si la valeur est positive ou nulle, c'est fait
if ( temps_ecoule >= 0 )
{
digitalWrite( led, etat_led = ~etat_led );
// on ajoute 1 seconde pour que le prochain évenement se passe dans 1 seconde par rapport à l'évenement courant
date_prochain_evenement += 1000;
}
}
Au fait, pourquoi ai-je écrit :
date_prochain_evenement += 1000;
Plutot que
date_prochain_evenement = maintenant + 1000;
?