Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Auteur Sujet: Arduino & millis() v1.1 Doute limites [ résolue 50 jours max ]  (Lu 2745 fois)

Manu

  • Newbie
  • *
  • Messages: 36
    • Voir le profil

Bonjour,

Je mets en oeuvre une minuterie qui se reset tous les 2 minutes. Et tout fonctionne bien, mais mon doute est quant à  "millis()". Cela peut devenir un très grand nombre apparemment.

Y a-t-il une certaine limite ?

Exemple:
Disons que si je reset la minuterie tous les 120 jours, "millis()" atteindra la valeur de 10368000000 par exemple. C’est cette valeur qui m’inquiète.

Merci  :)

modif v1.1: const long MsMin  -> unsigned long MsMin
// http://forum.bidouilleur.ca/
// TimerMillis v1.1 Manu
// ( without RTC )

float sec=0;
float min=0;
float hour=0;
float day=0;

unsigned long previousMillis = 0;             // previous time measured to compare with the next
unsigned long MsMin = 60000;               // to add 1 min  every 60000ms (60sec)
const long MinHour = 60;                      // to add 1 hour every 60   min
const long HourDay = 24;                      // to add 1 day  every 24   hours

void setup(){
  Serial.begin(9600);
}

void loop(){

unsigned long currentMillis = millis();

//switch for reset switch-----------------------------------
 if(min>=2){             // this is a switch for reset timer
   previousMillis = currentMillis;            // reset timer
   sec=0;
   min=0;
   hour=0;
   day=0;
 }else{
//Timer-----------------------------------------------------
    if(currentMillis - previousMillis >= MsMin){
      min++;                                     // add 1min
      previousMillis = currentMillis;
    }   
    sec=((currentMillis - previousMillis)/1000);  // for sec
    if(min==MinHour){
      hour++;                                   // add 1hour
      min=0;
    }
    if(hour==HourDay){
      day++;                                    // add 1 day
      hour=0;
    }
  }

//Monitor Show----------------------------------------------
  if(day<10){
    Serial.print("0");
  }
  Serial.print(day,0);
  Serial.print(" D ");
  if(hour<10){
    Serial.print("0");
  }
  Serial.print(hour,0);
  Serial.print(":");
  if(min<10){
    Serial.print("0");
  }
  Serial.print(min,0);
  Serial.print(":");
  if(sec<10){
    Serial.print("0");
  }
  Serial.println(sec,0);

//pause & loop--------------------------------------------
delay(990);
}


« Modifié: juin 15, 2021, 01:44:59 am par Manu »
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Arduino & millis() Doute sur les limites possibles ?
« Réponse #1 le: juin 14, 2021, 02:49:14 pm »

Bonjour Manu,

Bien sûr, il y a une limite car un nombre entier est forcement codé sur un nombre de bits fixe. Dans le cas de la fonction millis() elle retourne un long non signé sur 32 bits. La documentation officielle arduino dit que cela fait 50 jours avant que le compteur passe à  0.

PB
IP archivée

Manu

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Arduino & millis() Doute sur les limites [ résolue 50 jours max ]
« Réponse #2 le: juin 14, 2021, 03:18:43 pm »

Merci papyblue 8)
Pour cette réponse aussi rapide. On ne peut pas demander plus, top !

Sinon pour plus de 50jours, je suis toujours à  temps de rajouter un petit rtc  ;D

C'était clairement écrit mais je ne l'avais même pas vu.
https://www.arduino.cc/reference/en/language/functions/time/millis/

« Modifié: juin 14, 2021, 03:57:57 pm par Manu »
IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Arduino & millis() Doute sur les limites [ résolue 50 jours max ]
« Réponse #3 le: juin 14, 2021, 06:30:58 pm »

Bonjour,

C'est vrai que millis() reboucle au bout de 49 jours et quelques.
Par contre le test
    if(currentMillis - previousMillis >= MsMin){
ne posera pas de problème même en cas de rebouclage car on fait le calcul sur des unsigned. Même si previousMillis est supérieur à  currentMillis le résultat sera quand même positif et le test sera correct.
Par mesure de sécurité il faudra déclarer MsMin en unsigned long et non en long, mais je ne suis pas sur que ce soit nécessaire.
IP archivée

Manu

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Arduino & millis() Doute sur les limites [ résolue 50 jours max ]
« Réponse #4 le: juin 15, 2021, 01:33:56 am »

Merci Kamill,

Oui cela dépend apparemment de l’utilisation ou non de valeurs négatives. Merci d’avoir commenté. Je vais modifier le code v1.1

unsigned long --> 49,71 jours
 32 bits (4 octets) ne stockent pas de nombres négatifs, de 0 à  4 294 967 295 (2^ 32 - 1).
https://www.arduino.cc/reference/en/language/variables/data-types/unsignedlong/


const long --> 24,85 jours
32 bits (4 octets), des entiers -2 147 483 648 à  2 147 483 647.
https://www.arduino.cc/reference/en/language/variables/data-types/long/



« Modifié: juin 15, 2021, 01:49:11 am par Manu »
IP archivée

Manu

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Arduino & millis() v1.1 Doute limites [ résolue 50 jours max ]
« Réponse #5 le: juin 22, 2021, 04:21:29 pm »

Merci à  vous deux, j'ai enfin pu améliorer mon contrôle deréservoire grâce à  cela.

Top!  ;)

http://forum.bidouilleur.ca/index.php?topic=1008.0
IP archivée