Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mettre en place un timer pour arduino

    26 mars 2015 à 18:21:25

    Bonjour à tous,

    Je suis actuellement dans un projet de term STI2D qui a comme vocation l'utilisation de l'arduino pour compter le nombre de répétitions sur un banc de musculation. Le problème est que j'ai besoin du temps, pour mesurer la durée de l'effort du sportif et surtout une comparaison de temps entre un envoie de variable de l'arduino et une action faite sur celle-ci (l'activation de l'entrée à 1, etc...).

    Par exemple, si le temps entre l'envoi de cette variable et l'activation d'un capteur est plus long que 5 min, on remet tous a zero. Voici mon programme pour l'instant :

    Désolé du mélange anglais-français mais il y a beaucoup de code récupéré^^

    #include <SPI.h>
    #include <Ethernet.h>
    
    boolean reading = false;
    
    byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xCC, 0x0E };
    IPAddress ip(169, 254, 41, 47);
    byte masque[] = {255, 255, 0, 0};
    int inter ;
    int inter2;
    int nombre = 0;
    int interbis = 0;
    int interbis2 = 0;
    int mouvement = 0;
    String SerieString;
    int serie;
    
    
    
    EthernetServer server(80);
    
    void setup()
    {
        Ethernet.begin(mac, ip);  // initialize Ethernet device
        pinMode(A0, INPUT);
        pinMode(2, INPUT);
        pinMode(3,INPUT);
        server.begin();           // start to listen for clients
        Serial.begin(9600);
        
    }
    
    void loop()
    {
      EthernetClient client = server.available();  // try to get client
      inter = digitalRead(2);
      inter2 = digitalRead(3);
             if ( inter == 1 && interbis == 0)
                {
                   nombre = nombre + 1;
                }
               delay(100);
               interbis = inter;
                  if ( nombre == 8 && inter2 == 1 && interbis2 == 0)
                    {
                      mouvement = mouvement + 1;
                    }
                    delay(100);
                    interbis2 = inter2;
                    if ( nombre == 9)
                    {
                      nombre = 0;
                    }
              
                      
        if (client) {  // got client?
            boolean currentLineIsBlank = true;
            String buffer = "";
            while (client.connected()) {
                if (client.available()) {
                  char c = client.read(); // read 1 byte (character) from client
                    Serial.print(c);
                    buffer+=c;
               
               
                  // client data available to read
                    // last line of client request is blank and ends with \n
                    // respond to client only after last line received
                    if (c == '\n' && currentLineIsBlank) {
                        // send a standard http response header 
                        client.println("HTTP/1.1 200 OK");
                        client.println("Content-Type: text/html");
                        client.println();
                        // send web page
                        client.println(inter);
                        client.println(nombre);
                        client.println("Le nombre de mouvements est:" );
                        client.println("_");
                        client.println(mouvement);
                        client.println("_");
                        client.println(serie);
                        Serial.print(serie);
                        if(serie == 10)
                          {
                            client.println("Tu as demander 10");
                          }
                        
                        break;
                    }
                    // every line of text received from the client ends with \r\n
                    if (c == '\n') {
                        // last character on line of received text
                        // starting new line with next character read
                        currentLineIsBlank = true;
                        buffer= "";
                    } 
                    else if (c != '\r') {
                        // a text character was received from client
                        if ( buffer.indexOf("S=") >0){ // si « S= » apparaît dans la requete alors le nombre retourné est supérieur à 0 donc la fonction s’exécute.
                        int SeriePosition = buffer.indexOf("S=");// position de la chaine « S= » dans la requête
                        SerieString = buffer.substring(SeriePosition+2, SeriePosition+4); // récupère la valeurs en chaîne de caractère.
                        serie = SerieString.toInt(); // transforme la chaîne de caractère en valeurs numérique utilisable.
                    
                    }
                         else {
                        currentLineIsBlank = false;
                         }
                         
                    }
                } // end if (client.available())
            } // end while (client.connected())
            delay(1);      // give the web browser time to receive the data
            client.stop(); // close the connection
        } // end if (client)
      }
    
    
    
      
    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2015 à 8:08:43

      Sur arduino, tu as la fonction millis qui te retourne le nombre de millis seconde depuis l'allumage de la carte.

      Du coup, lorsque ton action commence, il te suffit d'enregistrer le cette valeur dans une variable :

      millisAtStart = millis();

      Et lorsque ton action se termine, tu peux à nouveau consulter millis et faire une soustraction pour en déduire le temps écoulé :

      millisAtStop = millis();
      timeElapsedMs = ( millisAtStop - millisAtStart ); // Temps écoulé en ms

       Note: toutes ces variables doivent être en unsigned long.

      -
      Edité par lorrio 27 mars 2015 à 8:09:26

      • Partager sur Facebook
      • Partager sur Twitter
        27 mars 2015 à 10:17:28

        Désolé mais je ne vois où je peux mettre cette fonction car si je la met au moment où je fais ma requête, elle s'arrête de suite 

        Merci encore de votre aide

        -
        Edité par quentinlenglet01 27 mars 2015 à 10:28:23

        • Partager sur Facebook
        • Partager sur Twitter
          27 mars 2015 à 10:48:32

          là, c'est moi qui ne te comprend pas... comment un simple appel à la fonction millis peut-il arrêter toute ta requête ???
          • Partager sur Facebook
          • Partager sur Twitter
            27 mars 2015 à 10:54:15

            Désolé, il est vrai que j'explique assez mal mais ce que je veux faire c'est démarrer le compteur quand la requête finis et si la valeur ne bouge pas pendant tant de seconde on remet tout à zero.
            • Partager sur Facebook
            • Partager sur Twitter
              27 mars 2015 à 11:12:34

              Et ou est le problème ?

              A la fin de ta requête, tu mets cette ligne : millisAtStart = millis();

              Puis libre à toi de vérifier à différents autre endroit comment évolue ta fonction ainsi que le retour de la function millis pour voir si oui ou non tu dois remettre tout à zero.

              • Partager sur Facebook
              • Partager sur Twitter

              Mettre en place un timer pour arduino

              × 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