Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bug étrange dans programme interrupteur

    17 janvier 2018 à 13:30:05

    Bonjour,

    Je m’arrache les cheveux sur mon code depuis hier soir ; il s'agit d'un programme test pour les bouton pour apprendre a gérer les bouton pour motorisé une fraiseuse conventionnelle. 

    Le but est le suivant :

    Continu - Je reste appuyer sur un bouton et la led reste allumer. Je revanche elle s’éteint.

    DisContinu - J’appuie sur un autre bouton, qu’importe le temps, une autre led s’allume 50ms et s’éteint.

    Lock - J’appuie sur encore sur un autre bouton et encore une autre led reste allumer, j’appuie de nouveau elle s’éteint (comme le tuto « programme interrupteur »).

    Problème :

    Le moniteur me renvois systématiquement « Bouton test » et « rouge » alors que je n’appuie pas sur le BoutonLock. Du coup j’ai une latence de 200ms a chaque boucle du loop alors que je j’appuis sur le deuxième ou troisième bouton par exemple.

    Encore plus étrange, la led associée au bouton continu reste tout le temps allumée o_O

    Il me semble avoir fait comme dans le tuto « programme interrupteur ».

    Alors je ne comprends vraiment pas.

    Si jamais vous voyez la solution… 

    int pinBoutonContinu = 1;
    int pinBoutonDisContinu = 2;
    int pinBoutonLock=3;
    
    int pinLedContinu = 10;
    int pinLedDisContinu = 11;
    int pinLedLock = 12;
    
    boolean valeurBouton=0;
    boolean valeurTempo=0;
    
    void setup() 
    {
    
      pinMode(pinBoutonContinu,INPUT_PULLUP);
      pinMode(pinBoutonDisContinu,INPUT_PULLUP);
      pinMode(pinBoutonLock,INPUT_PULLUP);
      
      pinMode(pinLedContinu,OUTPUT);
      pinMode(pinLedDisContinu,OUTPUT);
      pinMode(pinLedLock,OUTPUT);
    
      digitalWrite(pinLedContinu,LOW);
      digitalWrite(pinLedDisContinu,LOW);
      digitalWrite(pinLedLock,LOW);
      Serial.begin(9600);
      
    }
    
    void loop() 
    {
    
    
        boutonUnCoup(pinBoutonDisContinu,pinLedDisContinu);
    
    
        boutonContinu(pinBoutonContinu,pinLedContinu);
    
        if(digitalRead(pinBoutonLock==0))
        {
          verouillage();
          Serial.println("bouton test");
        }
      
    }
    
    void boutonUnCoup(int bouton,int led)
    {
    
        if(digitalRead(bouton) == 0)
      {
        digitalWrite(led,1);
        delay(50);
        while(digitalRead(bouton) == 0)
         {
          digitalWrite(led,0);
         }
      }
    
      else 
      {
        digitalWrite(led,0);
      }
    }
    
    
    void boutonContinu(int bouton,int led)
    {
    
        if(digitalRead(bouton) == 0)
      {
        digitalWrite(led,1);
      }
    
      else 
      {
        digitalWrite(led,0);
      }
    }
    
    void verouillage()
    {
          if(valeurBouton == 1)
        {
          digitalWrite(pinLedLock,1);
        }
    
        else
        {
          digitalWrite(pinLedLock,0);
        }
    
       valeurTempo =digitalRead(pinBoutonLock);
    
        if(valeurTempo ==0)
        {
          if(valeurBouton ==1){ valeurBouton =0;}
          else{ valeurBouton =1;}
        }
        Serial.println("rouge");
        delay(100);
    }
    



    -
    Edité par Gantilool 17 janvier 2018 à 13:31:56

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 janvier 2018 à 16:26:24

      Bonjour,

      C'est pas grand chose et je pense que tout le problème n'est pas là mais dans un premier temps,

      cette ligne (ligne 39) :

      if(digitalRead(pinBoutonLock==0))

      ne devrait pas plutôt être :

      if(digitalRead(pinBoutonLock0)==0)

      Ensuite je te conseil de tester tes fonctions en les utilisant séparément avant des le regrouper, cela sera peut-être plus simple pour tester.

      Et pour vérifier l'état d'une pin, je ne sais pas si on peux comparer un digitalRead avec un 0, c'est pas plutôt un LOW ou HIGH ?

      -
      Edité par Anonyme 17 janvier 2018 à 16:30:18

      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2018 à 11:16:22

        Merci c'était ça !! 

        Comme quoi quand on a le nez dedans...

        En revanche je suis obligé de rajouter un delay(10); a la fin du code de la loop sans quoi la led 'continu' s’allume quand j'appuie sur le bouton 'lock'. 

        Je comprends pas vraiment pourquoi 

        -
        Edité par Gantilool 18 janvier 2018 à 11:16:42

        • Partager sur Facebook
        • Partager sur Twitter
          18 janvier 2018 à 12:39:43

          As tu essayé de renforcer les résistances de pull-up en rajoutant des résistances externes ?

          (les résistances interne de pull-up ne sont pas très puissante, donc il peu éventuellement y avoir des gitchs)

          • Partager sur Facebook
          • Partager sur Twitter
            18 janvier 2018 à 16:12:51

            A t'es souhaits lorrio... tu disais?

            il peu éventuellement y avoir des... quoi? Google trad. ne connais pas et je n'ai jamais entendu se terme:o

            Edit: Faute de frappe? sa ne serai pas glitch? C'est toujour la 1ere fois que j’entends se terme, on peux parler de rebond?

            -
            Edité par Need 18 janvier 2018 à 16:17:04

            • Partager sur Facebook
            • Partager sur Twitter
              18 janvier 2018 à 17:33:42

              All right, essayons des résistances pull up, un ordre d'idée pour commencer?
              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2018 à 18:49:44

                Une résistance de 4.7k, c'est pas trop mal pour l'arduino.

                Mais n'importe quelle valeur entre 1k et 10k devrait convenir aussi.

                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2018 à 17:50:55

                  Gantilool a écrit:

                  En revanche je suis obligé de rajouter un delay(10); a la fin du code de la loop sans quoi la led 'continu' s’allume quand j'appuie sur le bouton 'lock'. 

                  Je comprends pas vraiment pourquoi 

                  Peut-être que si tu n'utilisais pas la broche 1 qui sert de TX au port série (donc configuré en sortie par Serial.begin) pour ton bouton continu, ça fonctionnerait mieux...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 janvier 2018 à 19:51:52

                    Ah oui, bien vu !!!

                    C'est même une très mauvaise idée de cabler un bouton sur la pin TX... ça fait un joli court-circuit à chaque fois que tu appuis dessus.

                    Pauvre arduino, il n'a probablement pas aimé ce traitement de faveur...

                    Avec 9600 bauds du Serial.begin, il faut 1ms pour envoyer un caractère.

                    En ajoutant les 2 caractères \r et \n, il faut au total 13ms pour envoyer "bouton test".

                    Pendant ce temps, la pin va forcément changé plusieurs fois d'état.

                    Le delay(10) permet entre autre d'attendre la fin de l'émission et donc un retour de l'état HIGH stable avant de tester la pin ;)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bug étrange dans programme interrupteur

                    × 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