Bon alors :
millis() est une fonction qui retourne le nombre de millisecondes écoulées depuis le démarrage de l'arduino.
La valeur retournée est de type unsigned long int : c'est un nombre entier positif codé sur 32 bits.
Sa plage de valeurs va de 0 à 2^32-1, soit de 0 à 4 294 967 295
La valeur maxi est donc atteinte au bout de 4 294 967 295 millisecondes après le démarrage de l'arduino, soit 49 jours, 17 heures, 2 minutes, 47 secondes et 295 millisecondes.
Là, il se produit un roll over, c'est-à-dire que la valeur repasse à zéro, puis continue à s'incrémenter.
Il y a un moyen très simple d'éviter tout problème lié à ce phénomène de roll over.
Il suffit de ne pas utiliser telle quelle la valeur retournée par millis(), mais de raisonner uniquement sur la différence entre deux valeurs retournées par millis(), c'est-à-dire sur le délai écoulé entre les deux appels.
par exemple :
unsigned long int delai, topchrono;
...
//debut de periode de mesure
topchrono = millis();
...
//vérification d'expiration du délai à intervalles réguliers
delai = millis() - topchrono;
if (delai > mon_delai_souhaite)
{
youpi_je_traite();
//puis l'une ou l'autre des réinitialisations ci-dessous
top_chrono = millis(); //pour un redéclenchement dans mon_delai_souhaite
top_chrono += mon_delai_souhaite; //pour un redéclenchement à intervalles plus précis
}
L'astuce réside dans le fait que l'opération de soustraction est insensible au roll over.
Ainsi, delai = millis() - topchrono donnera toujours un résultat correct, même si un roll over intervient dans la période d'attente.
Au moment du calcul, millis() aura alors une valeur très petite, et topchrono aura une valeur très grande.
D'un point de vue mathématique, le résultat de la soustraction devrait avoir une valeur négative.
Mais nous sommes dans le monde informatique, avec des entiers ayant une plage de valeurs limitée, et des opérateurs qui tronquent les résultats, ce qui donne au final des valorisations en boucles.
Ainsi par exemples :
4 294 967 295 + 1 = 0
2 - 4 294 967 295 = 3
Et tant pis pour les maths