Peut-on modifier la valeur de millis()?

Voilà tout est dans le titre..
Est-il possible d'imitialiser millis() à une valeur?
Merci

Non, millis s'initialise au lancement du programme.
Par contre tu peux mémoriser le contenu de millis à un instant donné pour l'utiliser par la suite

à cœur vaillant, rien d'impossible !
mais on ne voit pas trop l'intérêt ?

trimarco232:
à cœur vaillant, rien d'impossible !
mais on ne voit pas trop l'intérêt ?

Exactement.
Un petit éclaircissement :
millis() n'est pas une mémoire c'est une fonction qui retourne une valeur.
Pour faire ce que tu veux faire il faut ouvrir les fichiers sources qui contiennent la fonction millis() pour trouver le nom de la variable et pour modifier la fonction car les variables déclarées à l'intérieur d'une fonction ne sont pas accessible de l'extérieur à cette fonction autrement que par "return xyz".

C'est faisable mais pas simple et totalement inutile car millis() se gère très bien avec des variables de travail.
unsigned long ancienne_valeur ;
unsigned long nouvelle_valeur ;
unsigned long temps_passe ;

ancienne_valeur = millis();
// Action
// Action
nouvelle_valeur = millis() ;
temps_passe = nouvelle_valeur - ancienne_valeur ;

En faisant ainsi les règles de l’arithmétique numérique font que même si millis() arrive à la valeur maximale d'un "long" et revient à 0 (on dit qu'il reboucle) le résultat sera quand même juste.

Edit : modification de long en unsigned long (Merci JML)

Merci je corrige

le résultat sera quand même juste

oui, car quand on se préoccupe de millisecondes, forcément, ce n'est pas pour des durées dépassant 49 jours

trimarco232:
oui, car quand on se préoccupe de millisecondes, forcément, ce n'est pas pour des durées dépassant 49 jours

Pas compris votre point ? on peut jouer avec millis() pour un programme qui tourne pendant très longtemps

Je pense que Trimarco évoque des temporisations qui dure moins longtemps que le maximum permis par un unsigned long.

Faire un tempo de plus des ~50jours (que permet millis() dans le cas d’une uno, nano, mega etc...) n’as plus de sens avec millis()

ben la question n'est pas de faire ou pas une tempo de plus de 49 jours, la question est que si l'arduino est sous tension depuis plus de 49jours, forcément à un moment millis() repassera par zéro, et à ce moment, peu importe la temporisation que l'on fait avec, si on fait la soustraction dans le bon sens la temporisation sera quand même juste.

OK possible

Je n’ai jamais eu besoin de faire un truc 50 jours plus tard mais si c’était le cas je prendrai une RTC effectivement.

Mais bon c’est faisable... pour représenter cette durée il faudrait un une variable entière sur 64 bits genre ULL (ce qui génère plein de code à la moindre opération) pour stocker la durée....

l’approche que je prendrais sans RTC c’est de stocker le nombre de rollover et le modulo et tracker les rollover puis ensuite on revient au cas classique

Bonjour les amis,
Bien que millis puisse être employée pour de « courtes » temporisations allant de la seconde à une journée par exemple, la marge des 49 Jours va forcément créer un problème quand le compteur utilisé dans l’ATmega328 repassera à zéro. Hors ce cas n’a rien de rare. Par exemple une station météorologique fonctionnant toute l’année, une petite station scientifique également en action permanente. Aussi, pour chronométrer de courtes séquences, on se contente d’effectuer une soustraction entre la valeur de millis au déclenchement du chronométrage, et sa valeur actuelle.
Bon, c’est banal et classique.
Mais lorsque le compteur binaire de millis repasse à zéro, PAFFF, c’est le cafouillage !
Pour tourner cette difficulté, je peux vous proposer deux applications où j’ai forcément été confronté à ce problème. Dans le code du programme il y a la séquence de traitement et les explications dans le didacticiel …
Amicalement : Nulentout.

Une NANO STATION MÉTÉO

Panneaux solaires. BOLOMÈTRE.

Bonjour
Comme l'explique bricofoy: si on fait la différence des deux insignes long, ça ne posera pas de problème au débordement de millis()

C'est gentil mais c'est inutile.
Si tu passe par des variables comme je l'ai indiqué il n'y a rien à faire les écarts de temps seront toujours justes du moment qu'ils ne dépassent pas 49 jours mais là c'est un autre utilisation, on frise l'absurde.

C'est simplement dû au principe de la soustraction binaire.

"Si tu passe par des variables comme je l'ai indiqué il n'y a rien à faire les écarts de temps seront toujours justes du moment qu'ils ne dépassent pas 49 jours mais là c'est un autre utilisation, on frise l'absurde."

Je suis étonné que tu qualifie d'absurde une application dépassant 49 jours alors que deux Posts plus haut je présente deux applications de ce type ... je te garantie qu'elles n'on rien de ridicule.
Ha oui, petite question ... c'est quoi la courtoisie ?

nulentout:
"Si tu passe par des variables comme je l'ai indiqué il n'y a rien à faire les écarts de temps seront toujours justes du moment qu'ils ne dépassent pas 49 jours mais là c'est un autre utilisation, on frise l'absurde."

Je suis étonné que tu qualifie d'absurde une application dépassant 49 jours alors que deux Posts plus haut je présente deux applications de ce type ... je te garantie qu'elles n'on rien de ridicule.
Ha oui, petite question ... c'est quoi la courtoisie ?

J’ai pas bien compris - pouvez vous préciser pourquoi vos 2 applications gèrent des calculs de durée de plus de 50 jours? A vous lire il me semble qu’elles tournent vers plus de 50 jours.

Je n'ai pas dit que tes applications ne fonctionnait pas.

Je me place coté matériel.
Je trouve qu'utiliser une fonction qui donne le temps à la millisecondes prés pour gérer des temps de plus 49jours c'est à dire plus de 4,2336 milliards de ms avec une référence d'horloge peu précise et qui dérive (les résonateurs qui équipent les cartes arduino sont à quelques % près et bougent en température) n'est pas vraiment ce qui me viendrait à l'esprit.
Il y a fort à parier qu'au bout de 50 jours l'erreur serra de plusieurs secondes voire même de plusieurs minutes.
Une RTC DS3231 à 1€ et précise à ± 2ppm avec son oscillateur à MEMS compensé en température fera bien mieux le travail.

Il y a une chose qui me gène, me tracasse:
pourquoi veut on utiliser millis() pour gérer le temps avec comme precision celle du résonnateur de l'arduino(10-4: ça fait ca 8 secondes par jour, soit une dérive potentielle de 4 minutes par mois: pour une station meteo -exemple évoqué - ça peut mener à des absurdités, comme une temperature externe qui, au bout d'un an, se met à croître systematiquement avant le lever du soleil....

autre bizarrerie: on ne compte que par 8,16,32 et 64 bits: mais mettre un compteur (sur 8 bits ) qui compterait le nombre de depassements de millis (incremente si l'octet de poids fort de millis est non nul la fois précedente, et devient nul: ce peut être fait avec une frequence assez lâche, n'omposant pas de modifier millis à chaque nouvelle version d'arduio) reviendrait à un compteur sur 40 bits .... et à une complication indéniable du logiciel (tout en retsant faisable...)

es résonateurs qui équipent les cartes arduino sont à quelques % près et bougent en température

Si c'est à quelque spour cent près, -mettons 1%-: en un jour, on peut dériver d'une minute -86 seondes- .... en 50 jours, on est à 4300 secondes prés: une station meteo externe verrait des bizarreries.... (ou une mesure de température dans les bureaux: la température peut monter, avec ce genre de mesures, avant que le chauffage soit branché- s'il est à heure fixe, avec une horloge fiable-

Et avec la nouvelle série de cartes arduino les nano every,33, etc cela sera pire.

Les schéma sont publiés et on peut avoir les cheveux qui se dressent sur la tête en découvrant qu'il n'y a même pas de résonateur externe : par économie ces nouvelles cartes tournent sur l'oscillateur interne qui est encore moins précis et qui bouge largement en fonction de la température de la puce --> la fréquence sera dépendante du courant que l'on fera passer dans les sorties ! C'est pas beau ça !
Il y en a qui vont se faire avoir car malhonnêtement ce n'est pas annoncé.

trimarco232:
à cœur vaillant, rien d'impossible !
mais on ne voit pas trop l'intérêt ?

Par curiosité, j'aime comprendre, essayer...
Et comme il y a bcp de choses que je ne sais/comprends pas encore, je me renseigne. Mais le sujet agite quand même notre petit monde.