Partage
  • Partager sur Facebook
  • Partager sur Twitter

programme arduino extinction led

Sujet résolu
    6 janvier 2017 à 16:07:21

    Bonjour à tous,

    voilà, j'ai un petit problème que je n'arrive pas à résoudre.

    En effet, lors de l'appui d'un BP je dois allumer une led N°1.là, ok ,j'y arrive ;).

    Mais je dois , lorsque je lâche le BP, éteindre la led N°1 et  allumer aussi une led N°2 pendant 2000ms et l'éteindre ensuite. Un nouveau cycle ne recommencera que si j' appuie de nouveau sur le BP.

    Est ce que quelqu'un a une solution car je galère vraiment( j'ai essaye avec la condition 'WHILE', cela ne marche pas.J'ai essayé avec avec la fonction 'millis', idem....

    Merci de vos réponses car là,....je sèche...;)

    • Partager sur Facebook
    • Partager sur Twitter
      6 janvier 2017 à 22:32:31

      Pourtant, avec des while et des delay, tu peux t'en sortir ;)

      Ton programme pourrait être :

      loop {
      
          while ( BP relaché ) { ne rien faire (on attend que quelqu'un enfonce le boutant) }
      
          allumer led 1 ();
      
          while ( BP enfoncé ) { ne rien faire (on attend que quelqu'un relache le bouton) }
      
          éteindre led 1 ();
          allumer led 2 ();
      
          delay 2 secondes;
      
          éteindre led 2 ();
      
      }



      • Partager sur Facebook
      • Partager sur Twitter
        6 janvier 2017 à 22:44:44

        Oui mais si on rappuie sur le bouton pendant l'attente de 2 secondes, ça ne devrait pas relancer le cycle au début (allumage de led1, etc) ?

        • Partager sur Facebook
        • Partager sur Twitter
          7 janvier 2017 à 11:39:10

          Pendant un delay, l'arduino ne fait rien d'autre donc il ne testera pas l'état du bouton.

          Une fois le delay de 2 secondes terminé, le programme suis son court, donc il va éteindre la LED 2 puis recommencer au début du loop et c'est donc à ce moment là qu'il va tester l'état du bouton dans le while.

          • Partager sur Facebook
          • Partager sur Twitter
            7 janvier 2017 à 13:52:30

            Non mais ça j'ai bien compris que c'est ce qui résulte de ton programme, mais est-ce le comportement voulu ?

            Et si on a appuyé le bouton pendant le délai de 2 secondes et qu'on le relacke pas avant l'extinctionde la led 2, c'est normal que la led 1 se rallume de suite ?

            -
            Edité par michelbillaud 7 janvier 2017 à 13:54:50

            • Partager sur Facebook
            • Partager sur Twitter
              7 janvier 2017 à 16:18:03

              Le problème initial (que ça ne marche pas avec while) pourrait venir des rebonds du bouton.
              • Partager sur Facebook
              • Partager sur Twitter
                7 janvier 2017 à 16:38:35

                On ne peut pas dire, tant qu'on ne voit pas le code.

                Parce que "ça marche pas avec while()", ça ne veut dit rien du tout.

                • Partager sur Facebook
                • Partager sur Twitter
                  7 janvier 2017 à 17:37:17

                  Au contraire, on peut tout dire tant que l'OP ne restreint pas le problème en donnant plus de détails (ce qui peut ne jamais arriver).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 janvier 2017 à 17:48:02

                    Est-ce que les fils du while() sont bien branchés ?

                    -
                    Edité par michelbillaud 7 janvier 2017 à 17:49:16

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 janvier 2017 à 16:41:00

                      bonjour,

                      merci pour ces infos.je vais essayer ça.

                      en fait c'est quand j'appuie sur bp, led 1 s'allume et quand je relache bp, led1 s'éteint et led2  s'allume pendant 2 secondes puis s'éteint.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 janvier 2017 à 9:11:43

                        Bonjour,

                        envoie une photo de ton montage

                        et ton code

                        sinon on risque de taper en touche

                        @+

                        • Partager sur Facebook
                        • Partager sur Twitter
                        http://sinclair.recreatedzxspectrum.com/index.php
                          9 janvier 2017 à 13:21:09

                          bonjour,

                          voici mon code, il n'y a que la led2 qui reste allumé, rien ne se passe quand j'appui sur bp.

                          Merci.

                          const int led2=A5;

                          const int led1 =A4;

                          const int bp=A2;

                          int etatbp=0;

                          void setup() {

                              pinMode(bp, INPUT);

                              pinMode(led1, OUTPUT);

                              pinMode(led2, OUTPUT);

                          }

                          void loop() {

                               etatbp=digitalRead(bp);

                              while ( etatbp==HIGH ){ 

                              digitalWrite(led1,HIGH);

                              }

                              while ( etatbp==LOW){ 

                              digitalWrite(led1,LOW);

                              digitalWrite(led2,HIGH);

                              delay(2000);

                              digitalWrite(led2,LOW);

                              }

                              }

                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 janvier 2017 à 16:43:00

                            etatbp = digitalRead(bp);
                            while ( etatbp == HIGH ){ 
                                digitalWrite(led1,HIGH);
                            }

                            Ce bout de code va lire l'état du bouton et placer la valeur dans la variable etatbp.

                            Ensuite, ce programme va tester en boucle l'état de la variable et allumer la LED si la valeur est HIGH.

                            Le problème, c'est que la condition de ta boucle se fait sur une variable qui n'est mise à jour qu'avant la boucle.

                            Donc peu importe si tu appuis ou non sur le bouton pendant la boucle, la variable ne change pas...

                            Il te faut rafraichir la valeur de ta variable dans la boucle si tu veux que ça marche.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 janvier 2017 à 17:17:42

                              En d'autres termes, l'action "attendre que l'entrée du bouton passe à LOW" s'écrit

                              do {
                                etat_bouton = digitalRead(entree_bouton);
                              } while (etat_bouton == HIGH);
                              


                              qu'est ce que je disais, les fils du while étaient mal branchés

                              -
                              Edité par michelbillaud 9 janvier 2017 à 17:20:29

                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 janvier 2017 à 19:41:35

                                bonsoir, merci pour ces infos précieuses.

                                Donc si j'ai bien compris:

                                void loop() {

                                    do{ 

                                  etatbp=digitalRead(bp);

                                     digitalWrite(led1,HIGH);

                                    }

                                    while ( etatbp==HIGH );

                                 do{

                                   etatbp=digitalRead(bp);  

                                    digitalWrite(led1,LOW);

                                    digitalWrite(led2,HIGH);

                                    delay(2000);

                                    digitalWrite(led2,LOW);

                                   }

                                    while ( etatbp==LOW);

                                    }

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  9 janvier 2017 à 19:46:17

                                  Ton code est illisible...

                                  Il te faut utiliser les balises code pour l'insérer !

                                  Pour cela, tu peux utiliser le petit bouton en forme de </> au dessus de l'éditeur de texte.

                                  ----------

                                  Mais à regarder rapidement, j'ai bien peur que ton code n'est fonctionne pas comme tu l'espèrerais.

                                  En effet, mettre un delay(2000) à l'intérieur d'un do/while qui attend le changement d'état d'un bouton, ça me parait étrange.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 janvier 2017 à 20:07:36

                                    hé, oui, c'est cela le problème.

                                    Je dois faire une action sur une led( l'allumer pendant 2sec puis l'éteindre ) quand le bp est relaché.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 janvier 2017 à 20:12:26

                                      En quoi l'attente devrais être dans le while ?

                                      Ton code doit être en 4 parties, tout simplement :

                                      1/ Attendre que le bouton soit relaché (boucle do/while)

                                      2/ Allumer la LED (digitalWrite)

                                      3/ Attendre 2 secondes (delay)

                                      4/ Éteindre la LED (digitalWrite)

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        9 janvier 2017 à 20:18:45

                                        donc plutôt comme çà?:
                                        [code]
                                        const int led2=A5;
                                        const int led1 =A4;
                                        const int bp=A2;
                                        int etatbp=0;
                                        void setup() {
                                            pinMode(bp, INPUT);
                                            pinMode(led1, OUTPUT);
                                            pinMode(led2, OUTPUT);
                                        }
                                        void loop() {
                                            do{ 
                                          etatbp=digitalRead(bp);
                                            }
                                            while ( etatbp==HIGH );
                                            digitalWrite(led1,HIGH);
                                         do{
                                           etatbp=digitalRead(bp);  
                                           }
                                            while ( etatbp==LOW);
                                            digitalWrite(led1,LOW);
                                            digitalWrite(led2,HIGH);
                                            delay(2000);
                                            digitalWrite(led2,LOW);
                                            }
                                        [/code]
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          9 janvier 2017 à 20:38:33

                                          • merci d'utiliser les balises de code. Là, c'est pénible à lire.
                                          • tu devrais tester ton programme, au lieu de nous demander de le faire.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 janvier 2017 à 20:43:16

                                            ok, désolé pour la lecture.je ferai plus attention la prochaine fois.

                                            Merci pour votre aide.je testerai le code demain.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 janvier 2017 à 20:50:50

                                              Tu peux quand même corriger ton message, pour que le code soit lisible.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                10 janvier 2017 à 8:44:40

                                                ok,le voici, est-ce que la lecture est correcte?

                                                const int led2=A5;
                                                const int led1 =A4;
                                                const int bp=A2;
                                                int etatbp=0;
                                                void setup() {
                                                   
                                                    pinMode(bp, INPUT);
                                                    pinMode(led1, OUTPUT);
                                                    pinMode(led2, OUTPUT);
                                                
                                                }
                                                 
                                                void loop() {
                                                    do{ 
                                                  etatbp=digitalRead(bp);
                                                    }
                                                    while ( etatbp==HIGH );
                                                    digitalWrite(led1,HIGH);
                                                 do{
                                                   etatbp=digitalRead(bp);  
                                                
                                                   }
                                                    while ( etatbp==LOW);
                                                    
                                                    digitalWrite(led1,LOW);
                                                    digitalWrite(led2,HIGH);
                                                    delay(2000);
                                                    digitalWrite(led2,LOW);
                                                    }
                                                  

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  10 janvier 2017 à 8:57:34

                                                  Oui, la lecture est plus correct avec le bouton </> ;)

                                                  Par contre, l'indentation pique les yeux...

                                                  Quand au code en lui même, il devrait fonctionné si le bouton ne fait pas de rebonds.

                                                  Sinon, il faudrait ajouter un petit delay après le premier do/while.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 janvier 2017 à 9:19:34

                                                    Attention : un code bien indenté et aéré (et commenté) est BEAUCOUP plus facile à relire.

                                                    Et on a besoin de le relire, énormément, PENDANT la mise au point. C'est pas un truc à faire après pour faire joli. Faut être sympa avec celui qui doit faire la mise au point, surtout quand c'est soi-même.

                                                    Avant :

                                                       do{
                                                      etatbp=digitalRead(bp);
                                                        }
                                                        while ( etatbp==HIGH );
                                                        digitalWrite(led1,HIGH);
                                                     do{
                                                       etatbp=digitalRead(bp); 
                                                     
                                                       }
                                                        while ( etatbp==LOW);
                                                     

                                                    Après

                                                       do {                           // attendre appui
                                                         etatbp = digitalRead(bp);
                                                       } while (etatbp == HIGH );
                                                    
                                                       digitalWrite(led1,HIGH);       // allumer led1
                                                    
                                                       do {                           // attendre relachement
                                                         etatbp = digitalRead(bp); 
                                                       } while (etatbp == LOW);
                                                     



                                                    -
                                                    Edité par michelbillaud 10 janvier 2017 à 9:24:19

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 janvier 2017 à 12:58:13

                                                      j'ai rajouté un delais comme vous me l'aviez conseillé, et cela fonctionne!!!!:)

                                                      Merci pour toutes vos remarques constructives!!

                                                      voici mon code final:

                                                      const int led=A5;
                                                      const int neg=A4;
                                                      const int pos =A3;
                                                      const int bp=A2;
                                                      int etatbp=0;
                                                      void setup() {
                                                         
                                                          pinMode(bp, INPUT);
                                                          pinMode(pos, OUTPUT);
                                                          pinMode(neg, OUTPUT);
                                                          pinMode(led,OUTPUT);
                                                      }
                                                       
                                                      void loop() {
                                                          do{ 
                                                        etatbp=digitalRead(bp);
                                                          }
                                                          while ( etatbp==LOW );
                                                          delay(150);
                                                          digitalWrite(pos,HIGH);
                                                          digitalWrite(led,HIGH);
                                                       do{
                                                         etatbp=digitalRead(bp);  
                                                      
                                                         }
                                                          while ( etatbp==HIGH);
                                                          
                                                          digitalWrite(pos,LOW);
                                                          digitalWrite(led,LOW);
                                                          digitalWrite(neg,HIGH);
                                                          delay(2000);
                                                          digitalWrite(neg,LOW);
                                                          }
                                                        



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      programme arduino extinction 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