Partage
  • Partager sur Facebook
  • Partager sur Twitter

Clignotement d'une led et bouton poussoir

Sujet résolu
    18 janvier 2018 à 20:45:48

    Bonsoir,

    Je me tourne vers vous au sujet d'un code concernant le clignotement d'une LED et sur lequel j'ai une petite difficulté.

    J'ai une LED et un bouton poussoir. La led clignote. Quand je presse et relâche le bouton poussoir cette dernière devient fixe. Cependant, lorsque je ré-appuie sur le bouton cette dernière se remet à clignoter ! Or, je souhaiterai quelle reste fixe, même si je ré-appuie sur le bouton. Que faire ? Par avance, merci pour éventuels suggestions.

    int bouton = 2;
    int led1 = 3;
    
    bool prevButtonState;
    bool ledBlinking;
    unsigned long prevMillis;
    
    void setup() {
    
    pinMode(bouton, INPUT);
    pinMode(led1, OUTPUT);
    
    }
    
    
    void loop () {
    
    
    //LED1
    
        bool buttonState = !bouton;
    
        if (!prevButtonState && buttonState)
        { 
            ledBlinking = !ledBlinking;
            prevMillis = millis() - 250; 
        }
        prevButtonState = buttonState;
    
        if (ledBlinking)
        {
            if ((millis() - prevMillis) >= 250)
            {
                prevMillis += 250;
                digitalWrite(led1, !digitalWrite(led1));
            }
        }
        else
    
            {
             digitalWrite(led1, HIGH);
     
             }
    
    }



    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2018 à 20:51:53

      Là, je suis septique sur le code.

      Que tu appui ou non, il se passera exactement la même chose puisqu'à aucun endroit tu ne lis l'état du bouton.

      Ligne 21 :

      bool buttonState = !bouton;

      Cela ne lit pas en bouton... tu devrais plutôt avoir :

      bool buttonState = !digitalRead(bouton);

      Après, ligne 35, je ne vois pas trop ce que tu espères faire avec un write de la valeur d'un write.

      A la limite, ce serait plutôt un write de la valeur d'un read ;)

      Ou alors, avoir une variable que tu changes d'état à chaque fois.

      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2018 à 21:32:02

        Merci pour ta réponse lorrio.

        Effectivement mon code fonctionne comme décrit ci-dessus avec

        bool buttonState = !digitalRead(bouton);
        Mais quand je ré-appuie sur le bouton, la LED se remet à clignoter de plus bel. Quand tu dis "variable" tu veux dire quoi exactement ?

        -
        Edité par MatthieuWilhelm 18 janvier 2018 à 21:32:51

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2018 à 19:46:17

          Une variable, c'est une zone mémoire du processeur.

          Dans ton cas, buttonState est une variable de type bool, qui peut acceuillir 0 ou 1.

          Mais tu as aussi prevButtonState, ledBlinking et prevMillis qui sont des variables.

          Dans ton code, tu mets :

              if (!prevButtonState && buttonState)
              {
                  ledBlinking = !ledBlinking;
                  prevMillis = millis() - 250;
              }

          Ce qui revient à changer l'état de ledBlinking à chaque fois que tu relâches le bouton.

          Donc au premier relachement, le clignotement s’arrête.

          Puis au second relâchement, il repart.

          Et au troisième, il s'arrête à nouveau.

          Si tu veux que le clignotement s'arrête purement et simplement sans jamais redémarrer, ce n'est pas un changement d'état que tu devrais faire mais une mise à 0.

          Le code devient alors :

              if (!prevButtonState && buttonState)
              {
                  ledBlinking = 0; // Et bam, blink=0 ! ça s'arrête de clignoté pour de bon.
                  prevMillis = millis() - 250;
              }



          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2018 à 22:04:54

            Merci pour ta réponse lorrio mais ça ne fonctionne malheureusement pas. En mettant ledblinking = 0; il ne clignote plus du tout, il reste fixe en continu... La LED doit clignoter et devenir fixe après avoir appuyé et relâché le bouton, or là ce n'est pas le cas...

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2018 à 23:40:15

              Si tu veux que la led clignote au démarrage du programme, ne devrais tu pas l'initialiser à true au niveau de la déclaration ou dans la fonction setup ? Les variables non initialisées ont une valeur indéfinie, ce qui signifie qu'elles pourraient avoir n'importe quelle valeur au démarrage.

              D'ailleurs, tu devrais aussi initialiser les 2 autres variables, prevMillis et prevButtonState, avant d'utiliser leur valeur dans des if (même si ça n'a pas trop de conséquence sur le fonctionnement de ton programme).

              Au cas où tu le demanderais, l'initialisation correspondrait à ça:

              bool prevButtonState = false;
              bool ledBlinking = true;
              unsigned long prevMillis = 0;

              ou, dans setup():

              void setup() {
                pinMode(bouton, INPUT);
                pinMode(led1, OUTPUT);
              
                prevButtonState = false;
                ledBlinking = true;
                prevMillis = 0;
               
              }




              -
              Edité par alexisdm 20 janvier 2018 à 23:44:16

              • Partager sur Facebook
              • Partager sur Twitter
                21 janvier 2018 à 0:18:40

                En fait, j'ai trouvé mon erreur... Vous avez tous les deux raisons. Merci à vous ! Voici le code comme il se présente chez moi et ça fonctionne:

                //LED1
                 
                    bool buttonState = digitalRead(bouton);
                 
                    if (!prevButtonState && buttonState)
                    {
                        ledBlinking = 0;
                        prevMillis = millis() - 0;
                    }
                    prevButtonState = buttonState;
                 
                    if (ledBlinking)
                    {
                        if ((millis() - prevMillis) >= 250)
                        {
                            prevMillis += 250;
                            digitalWrite(led1, !digitalWrite(led1));
                        }
                    }
                    else
                 
                        {
                         digitalWrite(led1, HIGH);
                         !buttonState;
                  
                         }
                 
                }

                -
                Edité par MatthieuWilhelm 21 janvier 2018 à 0:35:45

                • Partager sur Facebook
                • Partager sur Twitter

                Clignotement d'une led et bouton poussoir

                × 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