Chronometre sec:milli

Coucou

Je tente de faire un chronometre simple (pour apprendre à gerer la fonction milli)

J'ai reussi à faire demarrer mon chrono quand je veut.
Le temps en sec et en milli marche bien.

Mais, une fois le chrono arriver à 33sec, le chrono part en negatif !!
il m'affiche ça:
-X -XX

Puis au bout d'un moment, le chrono reprend à 0, puis retourne à 33, et ainsi de suite.

Voila mon code:

// include the library code:
#include <LiquidCrystal.h>


// Lcd + pinout
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//Variable
#define  AnalogBtnPin A0
int AnalogBtn =0; //Valeur entrée A0

int TempsInit = 0;
int TempsReel = 0;
int TempsSec = 0;
int TempsMil = 0;

void setup() {
  
lcd.begin(16, 2);
  
} // fin setup
  


void loop() {
  // Lectur boutons
   AnalogBtn = analogRead(AnalogBtnPin);
    
    
    
    if (AnalogBtn >= 90 &&  AnalogBtn <= 110) // Boutons Haut
    {
      
      TempsInit = (millis());
      
      while(1) {
    delay(20);
   lcd.clear();
   TempsReel = (millis() - TempsInit);
   TempsSec = (TempsReel /1000)%60;
   TempsMil = (TempsReel %1000)/10;
   
     //Affichage + de 10
 if (TempsSec >= 10 ) {
  lcd.setCursor(7,1);
  lcd.print(TempsSec, DEC); }
 
 if (TempsMil >= 10 ) {
   lcd.setCursor(10,1);
   lcd.print(TempsMil, DEC); }
  
 //Affichage - de 10  
 if (TempsSec < 10 ) {
   lcd.setCursor(7,1);
   lcd.print(" ");
   lcd.setCursor(8,1);
   lcd.print(TempsSec, DEC); }
 
 if (TempsMil < 10 ) {
   lcd.setCursor(10,1);
   lcd.print(" ");
   lcd.setCursor(11,1);
   lcd.print(TempsMil, DEC); } 
      }
    }
}  //fin loop

Je comprend pas pourquoi sa fait ça -_-

Merci de votre aide !!!!!

bonjour,
essaye avec
unsigned long TempsInit

Salut

Tes variables Temps sont déclarées en type int.
Dans le monde arduino, int correspond à un nombre entier signé stocké sur deux octets en mémoire.

Un octet est composé de 8 bits (chaque bit a la valeur 0 ou 1).
Un octet peut donc prendre 2^8 = 256 valeurs possibles
Un nombre stocké sur 2 octets peut prendre 256^2 = 65536 valeurs possibles.

La plage de valeurs admises pour un int va de -32768 à 32767 : en gros on met le zéro au milieu (comme souvent) et on répartit les valeurs possibles de part et d'autre.

Ainsi, par exemple, 32767 + 1 = -32768 (si si, à ne pas montrer à un prof de math, ça a tendance à leur donner de l'urticaire).

C'est donc normal que ton chrono soit limité à 33 secondes (en réalité : 32,767 secondes).

Tu utilises la fonction millis() qui, si tu as bien regardé sa définition (ici => millis() - Arduino Reference), te renvoie un unsigned long int.

Ce type louche (y en a d'autres par ici) correspond simplement à un entier non signé codé sur 4 octets.
Sa plage de valeur va de 0 à 2^32 = environ 4 milliards
De quoi mesurer jusqu'à 49 jours et des brouettes avec ton chrono (petit exercice pour vérifier que tu as bien compris, à combien se monte exactement la brouette, en heures/minutes/secondes ?)

Le problème est que tu veux faire entrer un pied trop grand dans une chaussure trop petite.
Donc ça dépasse, mais le compilo coupe tout ce qui dépasse (faut faire gaffe...), pour loger dans deux octets.

Mathématiquement, c'est comme si le résultat de ta fonction millis() était en réalité : ((32768 + millis()) mod 65536) - 32768

Bref (quoique), comme dit infobarquee, remplace tes int par unsigned long et ça devrait le faire

a+

Précision supplémentaire : unsigned (non signé) signifie simplement que le type qui est dérrière ne pourra pas aller dans le négatif, mais on récupère le "domaine négatif" dans le positif. Exemple :

int => -32768 à +32767
unsigned int => 0 à 65535

Dans les deux cas l'amplitude est la même, mais pas centrée au même endroit. C'est simplement lié au fait que le bit le plus à gauche (dit de poids fort, MSB en anglais pour Most Significant Bit) est utilisé ou non pour désigner le signe de la variable.

Coucou

Solutions aussi bete que j'y et meme pas pensé -_-

Merci de vos explication claire et précise !!!!!!!

j'ai un beau chronometre maintenant ^^

Salut.

Super ton post.
je cherche à faire un chrono depuis un moment.
mais impossible d'utilisé millis() correctement.

je cherche à faire un chrono alfano ( je t'invite à jeter un oeil sur mon post)

ton chrono est une super base.
j'aimerais faire un chrono avec les millièmes, sais-tu comment les afficher ?

Bonjour,

Avez vous fait évoluer votre chonomètre ? Pour le faire fonctionner un capteur infrarouge par exemple ?

Merci