IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Chronomètre millis


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Chronomètre millis
    Bonjour à tous,

    Je souhaite, que lorsque un événement se passe, un chronométre se déclenche et quand ce même événement se renouvel le chronomètre s’arrète

    Le probleme dans mon programme, c'est que je ne sais pas comment arrêter le chrono
    Le "stop =millis();" ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    const int  buttonPin = 9;     // crée un identifiant pour la broche utilisée avec le bouton poussoir
    int buttonState = 0;         //Variable pour l'état actuel du bouton poussoir
    int compteur = 0;
     
    unsigned long MS; 
    unsigned long start;
    int bouton = A0;
     
    void setup() {
      // met la broche en entrée
    pinMode(buttonPin, INPUT);
    pinMode (bouton, INPUT);
    Serial.begin(9600);
    }
     
     
    void loop() {
      compteur=0;
      // lit l'état actuel du bouton poussoir et le mémorise dans la variable
      buttonState = digitalRead(buttonPin);
     
     
        if (buttonState == HIGH) {
    {
      {
        start=millis();
      }
     
      MS = millis()-start;
      /*
      centitot1 = (MS % 1000) / 10 ;        // centieme to display
       secotot1 = (MS / 1000) % 60 ;         // second to display
       minutot1 = (MS / 1000) / 60 ;         // minute to display
       */
      Serial.print ((MS / 1000) / 60);      // minutes
      Serial.print ("' ");
      Serial.print ((MS / 1000) % 60);      // secondes
      Serial.print ("'' ");
      Serial.println (MS % 1000);           // millièmes
    }
     
    }
        compteur=compteur+1;
          }
        if (compteur = 2){
    stop =millis();
     
        }
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonjour

    et non classique

    Mais cela ne veut pas dire que ton code fonctionnera car il y a quelques bizarreries :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if (buttonState == HIGH) {
    {
      {
        start=millis();
      }
    cette série d'accolades ouvrantes et fermantes plus loin, est assez étrange Il faudrait revoir tout ça.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    C'est vrai qu'il y avait 2 accolades en trop
    Mais je pense que mon plus gros problème est la fin du chronomètre
    Je le lance avec "start=millis();" mais je ne sais pas comment le faire s’arrêter

    PS: je tiens à dire que je n'ai toujours pas essayé ce programme avec une carte arduino car je suis lycéen et je ne peut en utiliser une seulement au lycée

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Si tu lis la documentation sur la fonction millis()
    Returns the number of milliseconds passed since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.
    La fonction millis retourne le temps écoulé depuis le démarrage du programme contenu dans l'Arduino. En d'autres termes, tu ne peux pas "démarrer" ou "arrêter" la fonction millis(). La seule façon de faire et c'est ce que tu as fait, c'est de faire une différence entre un moment t0 et un moment t1 pour déterminer la durée écoulée t1-t0.

    En quoi consiste ton projet ? A compter le nombre d'appuis sur le bouton ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Mon projet consiste à connaître le temps écoulé entre 2 pression sur un bouton poussoir
    Ducoup si on ne peut pas arrêter la fonction Millis, je ne sais pas comment connaître la valeur de Millis quand "compteur == 2" (quand j'appuie une seconde fois sur le bouton poussoir)

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Si tu peux... je t'ai donné une piste dans mon précédent message. Comment mesures-tu le temps écoulé ?

  7. #7
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    La fonction millis débordant au bout de 50 jours, il faut faire attention et prendre des précautions en faisant tn - tn-1

    (On pense souvent que son projet sera éteint très souvent comme un PC mais pensez au micro qui sont dans votre frigo, machine à laver, la télé ou même votre téléphone portable que tout le monde recharge avant que la batterie ne soit complètement épuisée. Pour certains appareils on parle de plusieurs années sous tension...
    Un de mes projets industriels, sauf coupure de courant, est en fonction depuis 12 ans à l'heure où j'écris)


    Une autre solution est de démarrer un Timer quand on appui sur le bouton et qu'il s'arrête lorsqu'on appui à nouveau dessus. Quand le timer est bien configuré tu peux savoir très précisément (inférieur à la micro seconde) à quel rythme le timer s'incremente.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    A défaut de ne pas savoir utiliser "timer", j'ai trouvé quelque chose sur le net pour millis


    enregistrer une valeur dans une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    millisAtStart = millis();

    Et lorsque l'action se termine, on peut à nouveau consulter millis et faire une soustraction pour en déduire le temps écoulé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    millisAtStop = millis();
    timeElapsedMs = ( millisAtStop - millisAtStart ); // Temps écoulé en ms

  9. #9
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Mars 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Mars 2019
    Messages : 11
    Points : 18
    Points
    18
    Par défaut mais que fait la millis()
    Et non on ne peut pas arrêter cette sacré fonction millis() qui n'est pas un chrono, comme dit dans un commentaire plus haut. On ne peut que mesurer le temps qui s'est écoulé entre deux mesures de la valeur de millis, qui démarre à 0 à la mise sous tension de la carte, et qui repart à zéro en boucle chaque 2^32 millisecondes (soit 49.7 jours). Et comme dit plus haut, il faut bien gérer cette particularité. Il y a des tutos en nombre, si besoin de plus de conseils.

  10. #10
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par Mathieugalère Voir le message
    A défaut de ne pas savoir utiliser "timer", j'ai trouvé quelque chose sur le net pour millis
    c'est ça. Reste à l'appliquer à ton problème. Fais un petit algorithme avant de faire le programme.

    Citation Envoyé par Vincent PETIT
    La fonction millis débordant au bout de 50 jours, il faut faire attention et prendre des précautions en faisant tn - tn-1
    pour un tp au lycée, je pense que l'on peut utiliser cette fonction sans se poser trop de question

  11. #11
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    @auteur
    Oui en effet
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour à tous

    Citation Envoyé par Vincent PETIT Voir le message
    La fonction millis débordant au bout de 50 jours, il faut faire attention et prendre des précautions en faisant tn - tn-1
    D'un autre côté si le résultat est stocké dans une variable du même type (entier 32 bits non signé), la soustraction fera un rollover dans l'autre sens et retombera sur ses pattes. Le point plus problématique c'est de mesurer une durée supérieure aux 50 jours...

    Delias

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Etats
    Je pense utiliser la fonction millis mais je ne sais pas comment lui dire de se lancer quand j'appuis sur le bouton et de s'arrêter quand je rappuis sur le bouton.
    J'ai pensé à une boucle while mais le bouton est dans 2 états différents (quand j'appuis "HIGH" et quand je relache "LOW").

  14. #14
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mathieugalère
    Citation Envoyé par Mathieugalère Voir le message
    je ne sais pas comment lui dire de se lancer quand j'appuis sur le bouton et de s'arrêter quand je rappuis sur le bouton.
    Je pense que tu "confuse ", la fonction millis n'est pas un truc que tu peux démarrer et arrêter, mais une horloge en millisecondes (compteur) interne à l'Arduino qui tourne à l'allumage de l'Arduino sur environ 50 jours.
    La fonction millis() permet de saisir dans une variable , la valeur du en millisecondes depuis l'allumage de l'Arduino.

    Déclarer les variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned long millisBoutonON = millis();
    unsigned long millisBoutonOff = 0;
    dans le programme quand le bouton == ON
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    millisBoutonON = millis();                                               // On met la valeur actuelle du compteur dans la variable millisBoutonON
    dans le programme quand le bouton == OFF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    millisBoutonFF = millis() - millisBoutonON;                      // On met (la valeur actuelle du compteur - millisBoutonON) dans la variable millisBoutonOFF se qui donne le temps entre le ON et le OFF
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Comme ça ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    const int  butonPin = 9;
    int boutonState = 0;
     
    unsigned long millisBoutonON = millis();
    unsigned long millisBoutonOff = 0;
     
    void setup() {
    pinMode(butonPin, INPUT);
    Serial.begin(9600);
    }
     
    void loop() {
     
    boutonState = digitalRead(butonPin);
     
    boutonState == HIGH;
    millisBoutonON = millis(); 
     
    boutonState == LOW;
    millisBoutonOff = millis() - millisBoutonON;
    }

  16. #16
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonsoir Mathieugalère
    Citation Envoyé par Mathieugalère Voir le message
    Comme ça ?
    Tu as compris, en partie, mais c'est pas aussi simple (ça se saurait)

    Voici le code, c'est pas une merveille mais ça explique. Le bouton doit donner un GND sur la patte butonPin du fait que l'initialisation de cette entrée, pinMode(butonPin, INPUT_PULLUP), met une résistance de polarisation contre le +5V et, ainsi, évite de mettre une résistance extérieur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    const int  butonPin = 9;
    int boutonState = 0;
    bool chronoStatus;                       // Pour mémoriser si on est en On ou Pff
     
    unsigned long millisBoutonON = millis();
    unsigned long millisBoutonOff = 0;
     
    void setup() {
    	pinMode(butonPin, INPUT_PULLUP);             // Résistance interne contre VCC
    	                                             // De ce fait, le bouton doit donner un GND
    	Serial.begin(9600);
    	chronoStatus = true;
    }
     
    void loop() {
     
    	boutonState = digitalRead(butonPin);
    	delay(100);                                  // Pour couvrir les rebonds
     
    	if (boutonState == LOW && chronoStatus == false) // Si bouton pressé et chrono arrêté cela veut dire demarrer le chrono
    	{
    		millisBoutonON = millis();
    		Serial.println("Chrono ON");
    		chronoStatus = true;
    	}
     
    	if (boutonState == HIGH && chronoStatus == true) // Si bouton relâché et chrono en marche cela veut dire arreter le chrono
    	{
    		millisBoutonOff = millis() - millisBoutonON;
    		Serial.println("Chrono OFF = " + String(millisBoutonOff));
    		chronoStatus = false;
    	}
    }
    Laisser presser le bouton, attendre, relâcher, et le temps s'affiche en millisecondes.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut C'est bon
    Merci beaucoup
    Ce programme fonctionne parfaitement
    Je voulais avoir quelques précision
    A quoi sert d'initialiser millisBoutonOff et On avec "unsigned long" ?

  18. #18
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mathieugalère
    Citation Envoyé par Mathieugalère Voir le message
    A quoi sert d'initialiser millisBoutonOff et On avec "unsigned long" ?
    Dans le système binaire, pour dire qu'une valeur est positive ou négative (signée ou signed) on utilise le bit de poids fort (MSB). Dans le cas d'une variable de type long (cas de millis()), il y a 32 bits, numérotée de droite à gauche de 0 à 31.
    Ainsi, dans le cas de la déclaration long valeurMillis (de -2 147 483 647 à +2 147 483 647, donc une valeur signée, lors de l'incrémentation de millis(), arrivé à la moitié+1, donc avec le bit 31 à 1, la valeur valeurMillis devient négative ce qui devient très génant si l'on veut chronométrer.
    En faisant unsigned long valeurMillis; (de 0 à +4 294 967 295) le programme n'utilises pas ce bit donc on ne signe pas la variable donc c'est positif.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

Discussions similaires

  1. [C++ Builder 6] Timer de précision pour chronomètre
    Par doudoustephane dans le forum C++Builder
    Réponses: 9
    Dernier message: 27/09/2005, 10h45
  2. Comment faire un chronomètre en Delphi ou ASM ?
    Par PoOky dans le forum Langage
    Réponses: 8
    Dernier message: 15/06/2005, 20h49
  3. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  4. [MFC] Boîte de dialogue chronométrée
    Par mdriesbach dans le forum MFC
    Réponses: 5
    Dernier message: 18/02/2003, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo