Go Down

Topic: Chronomètre  (Read 157 times) previous topic - next topic

maxime676767

Bonjour, voila un programme pour un chronomètre mais j'aurai une question qu'est ce que signifie "start=millis()"  "MS = millis()-start" et les différents formule entre parenthèse. Merci d'avance pour vos aide :)

Code: [Select]
unsigned long MS;
unsigned long start;

void setup()
{
  Serial.begin (9600);                 
  start=millis();
}

void loop()
{
  MS = millis()-start;

  Serial.print ((MS / 1000) / 60);      // minutes
  Serial.print ("' ");
  Serial.print ((MS / 1000) % 60);      // secondes
  Serial.print ("'' ");
  Serial.println (MS % 1000);           // millièmes
}



pomme-poire

Renvoie le nombre de millisecondes depuis que la carte Arduino a commencé à exécuter le programme courant. Ce nombre débordera (càd sera remis à zéro) après 50 jours approximativement.

salut

dbrion06

millis est le nombre de millisecondes depuis la mise sous tension de l'arduino.
Comme le demarrage de l'arduino peut être lent, start est le nombre de millisecondes jusqu'à ce  qu'il soit effectivement démarré.
MS est donc le nombre de millisecondes entre le moment présent (qui varie; loop se répète jusqu'à la fin des temps) et le démarrage effectif;
on le convertit en minutes en le divisant par 1000, puis par 60;
et les secondes supplémentaires sont la division par 1000, puis le reste "%" de la division par 60....

NOTA: vous affichez avec votre vitesse de 9600 bauds à peu près 1000 caractères par seconde; ce soit être un peu fatiguant de voir un défilement continu (les calculs sont très rapides) à cette vitesse....

BrutusLeCactus

Je vous conseille de lire avant tout zestes de savoir qui vous permettra d'apprendre les bases d'Arduino et donc de vous familiariser avec le monde d'Arduino.

Lien : https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/

maxime676767

Bonjour, merci pour vos réponses, mais j'aimerai juste mieux comprendre les calculs entre parenthèse, j'ai essayé de comprendre ce que vous avez écris, dbrion06, mais j'ai dû mal :/ vous pourrez m'expliquez plus approfondissement s'il vous plait ?

dbrion06

Plus je rentrerai dans les détails, plus je deviendrai incomprehensible.... (les détails sont malheureusement très techniques). Alors que des liens vous sont fournis, et je parie qu'ils sont très bien...

lesept

La fonction millis() compte les millisecondes depuis le lancement du code.
Code: [Select]
MS = millis()-start;start est initialisé à la fin du setup avec la valeur de millis : donc calculer millis()-start revient à calculer à chaque lancement de la loop le nombre de millisecondes écoulées depuis cet instant (la fin du setup).

OK jusque là ?

Le reste c'est pour transformer ce nombre de millisecondes en quelque chose de plus facile à comprendre pour nous : des minutes, secondes et chiffres après la virgule.

Code: [Select]
  Serial.print ((MS / 1000) / 60);      // minutesCeci affiche les minutes écoulées : la division se fait sur des entiers, donc le résultat est un entier aussi. Diviser cette durée par 1000 revient à calculer le nombre de secondes écoulées, diviser ensuite par 60 revient à calculer le nombre de minutes écoulées.

Code: [Select]
  Serial.print ((MS / 1000) % 60);      // secondesLà c'est un peu plus compliqué : MS/1000 est le nombre de secondes écoulées depuis le lancement du chrono, OK ? Comme on sait déjà le nombre de minutes passées, on veut connaitre le nombre de secondes dans la minute en cours. On pourrait ôter à ce nombre de secondes total le nombre de minutes écoulées multiplié par 60. Ça revient à calculer le reste de la division par 60, c'est ce que fait la fonction "modulo", représentée en C par le symbole % : (MS / 1000) % 60 est le reste de (MS / 1000) divisé par 60, soit le nombre de secondes dans la minute en cours.

Exemple : suppose que MS/1000 vaut 620 secondes. 620/60 vaut 10 minutes, reste 20 secondes. On aurait pu calculer ce 20 en faisant 620 - 60 * (620/60), mais c'est plus rapide avec le %.

Code: [Select]
  Serial.println (MS % 1000);           // millièmesCe qui reste, c'est les millièmes de secondes : le reste de la division du nombre de millisecondes par 1000.

Dans mon exemple si MS valait 620250, j'avais bien (MS/1000) égal à 620. Il reste à calculer les 250 ms avec le modulo.

Je ne sais pas faire plus clair, j'espère que ça ira...

Lorsque le code tourne sur ton Arduino, la loop est exécutée en boucle (d'où son nom), donc tu vois passer les chiffres à chaque exécution de la loop, ça doit être très rapide. Si tu débranches l'Arduino, tu verras les dernières valeurs sur la console.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

dbrion06

Quote
Si tu débranches l'Arduino, tu verras les dernières valeurs sur la console.
C'est un chronomètre très ... rustique...

maxime676767

Merci beaucoup lesept vraiment tu m'as beaucoup aidé et j'ai réussi à comprendre le code grâce à toi :), je te souhaite une bonne journée et peut-être à une prochaine fois :)

Go Up