Partage
  • Partager sur Facebook
  • Partager sur Twitter

temporisation sans "delay" sur arduino ?

Sujet résolu
    15 janvier 2015 à 13:21:05

    Bonjour , je compte faire une temporisation pour mes pompes d'aquarium mais sans utiliser la fonction delay car j'ai besoin d'utiliser mon programme pour d'autres fonctions en même temps ; comment faire ?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      Staff 15 janvier 2015 à 13:38:48

      Il te faut utiliser la fonction millis pour qui te donne depuis combien de temps ta carte arduino est allumée.

      Voici un petit exemple pour faire clignoter une LED sans fonction delay : http://arduino.cc/en/Tutorial/BlinkWithoutDelay

      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2015 à 13:50:24

        Merci pour la réponse rapide , je vais essayer de retranscrire dans mon programme.
        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2015 à 14:16:12

          Ce programme ne correspond pas , je veux juste une tempo après avoir appuyé sur un contact , sur mon montage j'ai aussi un module RTC DS1307 , si c'est plus facile ?

          Merci

          • Partager sur Facebook
          • Partager sur Twitter
            Staff 19 janvier 2015 à 19:18:55

            Évidement que ce programme ne correspond pas, c'est juste pour te donner une idée de la technique à mettre en place.

            L'astuce, c'est de se baser sur la fonction millis pour réaliser les temporisations que tu souhaites.

            Imaginions que tu veux afficher un texte trois secondes après le relâchement d'un bouton, le code sera le suivant :

            // Numéro de la pin du bouton
            const int pinBtn = ...;
            
            // État d'activation de la tempo
            int tempoActive = 0;
            
            // Temps à l'activation de la tempo
            unsigned long tempoDepart = 0;
            
            
            
            void setup() {
            	Serial.begin(9600);
            	pinMode(pinBtn, INPUT);     
            }
            
            
            
            void loop() {
            	
            	// Si le bouton est enfoncé,
            	if ( digitalRead(pinBtn) == LOW ) {
            		
            		// Alors on active la temporisation
            		tempoActive = 1;
            		tempoDepart = millis();
            		
            	}
            	
            	// Si la temporisation est active,
            	if ( tempoActive ) {
            		
            		// Et si il s'est écoulé 3 secondes, 
            		if ( ( millis() - tempoDepart ) >= 3000 ) {
            			
            			// Alors on affiche un petit message
            			Serial.println("Hey, cela fait 3 secondes que tu as relaché le bouton!");
            			
            			// Et on désactive la temporisation pour ne pas afficher ce message une seconde fois
            			tempoActive = 0;
            			
            		}
            		
            	}
            	
            }



            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2015 à 8:17:27

              Merci beaucoup , c'est plus clair comme ça...
              • Partager sur Facebook
              • Partager sur Twitter
                22 janvier 2015 à 15:01:38

                Bonjour , j'ai fait mon programme , ça fonctionne bien la fonction (millis) par contre on est limité avec la valeur " unsigned long tempoDepart" ?

                cette valeur max est de 4 294 967 295 , ce qui fait en gros 50 jours, il faut faire un reset pour repartir à zéro ?

                Merci

                • Partager sur Facebook
                • Partager sur Twitter
                  Staff 22 janvier 2015 à 17:28:01

                  Au bout de 50 jours, il y a un overflow et cette valeur revient à 0.

                  Si tu te base uniquement sur des soustraction du genre ( millis() - tempoDepart ) >= x, cet overflow ne sera pas gênant ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 janvier 2015 à 7:55:39

                    Merci lorrio , si ça ne plante pas mon programme ça me va...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      Staff 23 janvier 2015 à 8:02:31

                      Non, ça ne plantera pas ton programme ;)

                      Le fait de faire une soustraction peut aussi faire un overflow qui viendra annuler le précédant donc ta temporisation marchera quand même ;)

                      ==========

                      Par contre, si tu fais un code sans soustraction, cela peut ne pas marcher.

                      Exemple de chose à ne pas faire :

                      int tempoActive = 0;
                      unsigne long tempoFin = 0;
                      
                      void setup() {
                          ...
                      }
                      
                      void loop() {
                      
                          if ( bouton == LOW ) {
                              tempoActive = 1;
                              tempoFin = millis() + 3000;
                          }
                      
                          if ( tempoActive == 1 && millis() >= tempoFin ) {
                              print(...);
                              tempoActive = 0;
                          }
                      
                      }
                      

                      Ce code marchera parfaitement temps que ta carte arduino ne fonctionne pas 50 jours.

                      Par contre, à la limite des 50 jours, tu risques d'avoir des bug de tempo (l'arduino n'attendra pas 3 secondes) puis ça remarchera normalement.

                      ==========

                      Si tu n'as pas d'autres questions, n'oublies pas de passer ton sujet en résolu.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 novembre 2017 à 14:09:04

                        votre code est très intéressant mais est ce qu'on peut utiliser millis()  pour le meme objectif hors du loop dans une procédure par exemple
                        • Partager sur Facebook
                        • Partager sur Twitter
                          Staff 4 novembre 2017 à 18:43:54

                          Oui, c'est possible.

                          Libre à toi d'utiliser millis partout où tu le souhaite, il n'y a aucune restriction ;)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 janvier 2018 à 1:59:18

                            bonjour , Merci beaucoup lorrio , votre code m'a beaucoup aide , mais je souhaite savoir comment faire pour que si j'appuis une deuxieme fois sur le bouton poussoir, la partie du code ne se répété pas indéfiniment , je ne suis un débutant sur arduino .
                            • Partager sur Facebook
                            • Partager sur Twitter
                              Staff 18 janvier 2018 à 8:28:39

                              Que veux tu dire par "si j'appuie une deuxième fois" ???

                              Après avoir actionné ton bouton une fois, il n'est plus jamais possible de le ré-actionner ??? (cela me parait étrange)

                              Ou bien souhaites tu un comportement du genre après l'avoir actionné, on ne peut pas le ré-actionner pendant 10 secondes ?

                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 janvier 2018 à 1:08:08 - Message modéré pour le motif suivant : Message complètement hors sujet


                                  4 juillet 2018 à 8:03:41

                                  Super merci pour le code complet je cherchais depuis longtemps. Merci pour le partage;)

                                  -
                                  Edité par DidierSee 4 juillet 2018 à 8:08:51

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 mai 2020 à 15:55:14

                                    j'ai un peu fait le fouinneur afin de remettre cette fonction dans un autre contexte et je viens de comprendre comment elle fonctionne :) merci!

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      Staff 18 mai 2020 à 8:14:49

                                      L'intention est bonne mais était-ce vraiment nécessaire de déterrer un sujet de 2015 pour ça ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      temporisation sans "delay" sur arduino ?

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      • Editeur
                                      • Markdown