Partage
  • Partager sur Facebook
  • Partager sur Twitter

plusieurs led

Sujet résolu
    27 août 2019 à 11:03:22

    Bonjour

    j'ai un arduino uno (je commence a peine) et je voudrais savoir si il y a possibilité de faire par exemple

    LED1= 1 seconde allumé 1 seconde éteinte 1 seconde allumé 1 seconde éteinte puis éteint pendant 10 seconde

    LED2=2 seconde allumé 1 seconde éteinte 2 seconde allumé 1 seconde éteinte puis éteinte pendant 20 seconde*

    j'ai essayer avec la fonction delay() mais le problème étant que la LED2 est affecter par les 14 seconde de la LED 1

    Merci de vos réponses

    • Partager sur Facebook
    • Partager sur Twitter
      27 août 2019 à 14:45:25

      Bonjour,

      Oui, c'est possible en utilisant la fonction millis() et des variables pour gérer l'état des leds et le dernier temps de changement d'état de chaque led:

      https://eskimon.fr/tuto-arduino-202-introduire-le-temps#fonction-millis

      • Partager sur Facebook
      • Partager sur Twitter
        27 août 2019 à 15:05:39

        Merci je vais essayer cela tout de suite

        • Partager sur Facebook
        • Partager sur Twitter
          28 août 2019 à 17:02:08

          Bonjour

          après avoir mi le code si dessous les 2 LED ne suivent pas du tout le temps d'allumage et le temps eteint pouvez vous me dire pourquoi ?

          Merci

          j'en profite pour le UP

          long temps; // variable qui stocke la mesure du temps
          boolean etat_led1 =0;
          boolean etat_led2 =0;
          
          void setup()
          {
          
              pinMode(1, OUTPUT);
              pinMode(2, OUTPUT);
              // par défaut la LED sera éteinte
          
          
              // on initialise le temps
              temps = millis();
          }
          
          void loop(){
            if ((millis()%1000==0))
            {
                      etat_led1 = !etat_led1; // on inverse l'état de la LED
                      digitalWrite(1, etat_led1); // on allume ou éteint
           
             if ((millis()%2000==0))
                             etat_led2 = !etat_led2; // on inverse l'état de la LED
                      digitalWrite(2, etat_led2); // on allume ou éteint
             
              if ((millis()%2000==0))
                      etat_led1 = !etat_led1; // on inverse l'état de la LED
                      digitalWrite(1, etat_led1); // on allume ou éteint
          
              if ((millis()%3000==0))
                     etat_led2 = !etat_led2; // on inverse l'état de la LED
                      digitalWrite(2, etat_led2); // on allume ou éteint
          }
          

          -
          Edité par ThibaultPieri 29 août 2019 à 11:39:10

          • Partager sur Facebook
          • Partager sur Twitter
            29 août 2019 à 12:25:53

            Bonjour,

            Il ne faut pas faire une opération égale à 0 dans ton if. Il y a peut de chance que tu tombes directement sur le modulo 0.

            Les conditions sont aussi mal montées. 

            De plus, comme le temps pour le changement d'état de tes LEDs n'est pas le même entre le On et le Off, je pense qu'il faut que tu testes d'abord l'état de la Led (surtout pour la Led 2)

            • Partager sur Facebook
            • Partager sur Twitter

            Que ta route soit parsemée de jasmin.

            https://triskey.fr

              29 août 2019 à 19:05:23

              Merci mais comme je peux faire en sorte de verifier l'état de me led et par quoi je peux changer l'oprération ?

              Triskey a écrit:

              Bonjour,

              Il ne faut pas faire une opération égale à 0 dans ton if. Il y a peut de chance que tu tombes directement sur le modulo 0.

              Les conditions sont aussi mal montées. 

              De plus, comme le temps pour le changement d'état de tes LEDs n'est pas le même entre le On et le Off, je pense qu'il faut que tu testes d'abord l'état de la Led (surtout pour la Led 2)



              -
              Edité par ThibaultPieri 30 août 2019 à 10:37:02

              • Partager sur Facebook
              • Partager sur Twitter
                5 septembre 2019 à 9:40:43

                Je met de côté l'histoire des 10 secondes de la Led1 et des 20 secondes de la Led2 qui sont contradictoires avec l'instruction d'avant dans ton code.

                Je vois le message mais je suis au travail. Je ne peux pas te proposer de code, mais voici les pistes à explorer. Comme tu es débutant, ça t'aidera à progresser, plus qu'un bête copier coller.

                Pour connaître l'état de la Led, il faut l'interroger. Led1 et Led2 sont des boolean. Donc ils doivent avoir comme valeur soit True, soit False. Pour commencer, leur déclaration devrait être :

                boolean etat_led1 = false;
                boolean etat_led2 =false;

                Donc si tu veux afficher l'état, tu peux faire Serial.print(ta_variable); . Si tu veux déclencher une action quand la variable est true variable, tu fais if (etat_led1)... 

                Comme ta boucle loop() met un temps non défini à s'exécuter, tu ne peux pas savoir quand vont s’exécuter les fonctions ou les conditions. Donc quand tu testes le temps, il y a une chance sur mille que tu tombes sur l'instant zéro. Hors le modulo (%) sert à trouver le reste de la division. Et là, tu testes que le reste soit à zéro. Comme tu déclare une variable temps, à ta place je l'utiliserais. J'en créerai même une seconde pour gérer le temps de chaque led.

                Comme tu es débutant, il est certainement plus simple d'avoir deux blocs if distincts

                Au final, le loop devrait être du genre pour led1

                Si millis moins temps1 est supérieur à une seconde et que etat_led1 est false alors etat_led1 est changé en true et je met à jour temps1 avec la valeur courante de millis
                Sinon si millis moins temps1 est supérieur à une seconde et que etat_led1 est true alors etat_led1 est changé en false et je met à jour temps1 avec la valeur courante de millis
                Sinon je met simplement à jour la variable temps1

                Pour Led2, c'est la même chose en changeant le temps pour l'allumage. 

                Après si c'est bien monté, tu peux jouer sur les temps comme tu veux. Mais gère les Led dans deux conditions différentes, ce sera plus facile.

                • Partager sur Facebook
                • Partager sur Twitter

                Que ta route soit parsemée de jasmin.

                https://triskey.fr

                  7 septembre 2019 à 11:25:11

                  Merci beaucoup

                  -
                  Edité par ThibaultPieri 7 septembre 2019 à 11:25:25

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 septembre 2019 à 19:09:33

                    Pour compléter sur la gestion du temps, on peut voir chaque Led comme un objet  qui gère les actions qu'il a besoin d'effectuer

                    • son constructeur fait un pinMode(...)
                    • une méthode, appelons-la loop(), faiut ce qu'elle doit faire dans le loop du programme

                    Le programme principal ressemblerait à ceci (avec deux types de LEDs, puisqu'elle n'ont pas le même comportement)

                    // code non testé. Use at your own risks.
                    
                    LedType1 led1(1);
                    LedType2 led2(2);
                    
                    void setup() {
                      ...
                    }
                    
                    void loop() {
                       led1.loop();
                       led2.loop();
                       ..
                    }
                    

                    Chaque LED s'occupe de son initialisation, mémorise son état et le moment où elle doit en changer

                    class LedType1 
                       int pin;
                       unsigned long prochain_changement;
                       int etat_actuel; 
                       // les états successifs
                       // 0 : allumé une seconde
                       // 1 : éteint une seconde
                       // 2 : allumé une seconde
                       // 3 : éteint
                       
                    public:
                       LedType1(int p) {
                          pin = p;
                          pinMode(pin, OUTPUT);
                          etat_actuel = -1;
                          prochain_changement = 0;
                       }
                    
                       void loop() {
                          unsigned long temps_actuel = millis();
                          if (temps_actuel >= prochain_changement && etat_actuel != 3) {
                               etat += 1; 
                               if (etat_actuel == 0 || etat_actuel == 2)  
                                   digitalWrite(pin, HIGH);  
                               else  
                                   digitalWrite(pin, LOW);
                               prochain_changement = temps_actuel + 1000;  // 1 seconde
                          }
                       }
                    };
                    

                     et bien sûr, on peut utiliser l'héritage pour des classes qui ont "presque" le même comportement.

                    -
                    Edité par michelbillaud 8 septembre 2019 à 11:04:27

                    • Partager sur Facebook
                    • Partager sur Twitter

                    plusieurs led

                    × 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