Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] fonction millis()

Sujet résolu
    24 juin 2013 à 21:37:35

    bonjour,

    Étant un grand débutant en Arduino, j'ai quelques problèmes concernant la fonction millis(). (et oui c'est possible :euh:)

    je voudrais réaliser ce code avec la fonction millis() au lieu de delay() :

    const int led_1 = 2;
    int val=0;
    int sensorPin=0;
    
     void setup() 
    {
    Serial.begin(9600);
    pinMode(led_1, OUTPUT);
    digitalWrite(led_1, HIGH);
    }
    
    void loop() 
    {
     if(Serial.available())
      {
       lireVoieSerie();
      } 
    
    val=analogRead(sensorPin);
    Serial.println(val);
    
    
    }
    
    void lireVoieSerie(void)
    {
     char choseLue = Serial.read();
     
       if(choseLue == -1)
       {
         
       }
       else
       {
         if (choseLue=='a')
           {
             digitalWrite(led_1, LOW); 
             delay(100); 
             digitalWrite(led_1, HIGH);
             delay(100);
             digitalWrite(led_1, LOW); 
             delay(300); 
           }
       }
    }



    mais je n'y parviens malheureusement pas.

    J'aimerai donc quelques explications sur la façon avec laquelle procéder pour résoudre ce "problème".

    Merci de votre aide qui pourrait me permettre de me familiariser avec millis().

    :)

    -
    Edité par kashkawan 24 juin 2013 à 23:12:14

    • Partager sur Facebook
    • Partager sur Twitter
    "Kashkawan" means "it is foggy" in Algonquin.                                                                                                                                  | 你很好奇 |
      25 juin 2013 à 8:28:25

      Il te suffit de faire une boucle infinie qui attend que le temps soit écoulé.

      Exemple :

      void delayWithMillis(unsigned long t) {
      
          // Calcul du temps lorsque t millisecondes se seront écoulés
          unsigned long stopTime = millis() + t;
          
          // Attente active jusqu'à ce que stopTime soit atteind
          while ( millis() < stopTime ) { }
      
      }

      Petit exemple :

      J'appelle la fonction avec t = 50 et avec un processeur lancé depuis 2000 millisecondes.

      On a donc stopTime = 50 + 2000 = 2050.

      La première fois que la condition du while est testée, c'est 2000 < 2050 => vrai

      Donc le code entre dans le while (il n'y a rien à faire) puis revient tester la condition.

      Vu que très peu de temps s'est écoulé, c'est toujours 2000 < 2050 => vrai

      Après avoir fait ce test un millier ou un million (voir milliard) de fois, millis va finir par retourner 2001 car le temps s'écoule :)

      Pour le moment, 2001 est toujours inférieur à 2050.

      Mais au fur et à mesure que le temps s'écoule, millis augmente.

      Une fois arrivé à 2050, on a 2050 < 2050 => faux

      Donc le code quitte le while puis quitte la fonction.

      Et entre le début et la fin de la fonction, on a bien 50 ms qui se sont écoulés ;)



      -
      Edité par lorrio 25 juin 2013 à 8:28:40

      • Partager sur Facebook
      • Partager sur Twitter
        25 juin 2013 à 19:05:23

        void delayWithMillis(unsigned long t) //delay with millis
        {
         
            // Calcul du temps lorsque t millisecondes se seront écoulés
            unsigned long stopTime = millis() + t;
             
            // Attente active jusqu'à ce que stopTime soit atteind
            while ( millis() < stopTime ) 
            {
             capteur(); 
            }
         
        }
        void capteur(void)
        {
            val=analogRead(sensorPin);
            Serial.println(val);
        }

         j'ai rajouté une fonction "capteur" dans le while pour continuer à lire les données de "analogRead".

        Cependant n'y a t'il pas un moyen pour effectuer la fonction delayWithMillis() sans arreter le reste du programme ?




        • Partager sur Facebook
        • Partager sur Twitter
        "Kashkawan" means "it is foggy" in Algonquin.                                                                                                                                  | 你很好奇 |
          25 juin 2013 à 20:34:35

          Le role de la fonction delay est justement d'arrêter le programme pendant un certain temps ...

          Par contre, sur les micro-processeur, il y a ce qu'on appel des interruptions.

          Une interruption, c'est une fonction qui va s'exécuter en arrêtant le cour normal de l'exécution du programme.

          Par exemple, tu peux avoir ton programme qui tourne en tache de fond pour faire des analogues read en permanence ET une fonction d'interruption qui s'occupe de changer l'état d'une pin.

          Changer l'état d'une pin étant très court, la fonction d'interruption ne stopera le programme qu'un instant très court et celui-ci ne sera donc pas perturbé.

          Sur arduino, tu as aussi des timers.

          Un timer, on peut voir ça comme une boite noir capable de déclencher une interruptions toutes les X millis.

          Tu peux donc configurer ton time pour qu'il t'appelle ta fonction toutes les 100ms et dans cette fonction, tu change l'état de la led.

          Ainsi, tu verras ta led clignoté sans perturber le reste du programme.

          • Partager sur Facebook
          • Partager sur Twitter
            25 juin 2013 à 23:16:57

            ok, je m'etais mal exprimé dans le premier post, mais maintenant j'ai tout saisi :) !

            merci pour ton aide !

            -
            Edité par kashkawan 25 juin 2013 à 23:17:12

            • Partager sur Facebook
            • Partager sur Twitter
            "Kashkawan" means "it is foggy" in Algonquin.                                                                                                                                  | 你很好奇 |

            [Arduino] fonction millis()

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown