Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compter en binaire avec des leds

    30 janvier 2014 à 14:34:14

    Bonjour,

    je débute avec arduino et je voudrai réaliser un compteur avec 3 leds qui representent les bits pour compter jusqu'à 7 en binaire. Je voudrai utiliser un bouton poussoir pour passer de 0 à 1 à 2... 7 et à 7 on retourne à zéro. Voici mon code : 

    int LEDgreen = 9;
    int LEDyellow = 10;
    int LEDred = 11;
    int bouton = 2;
    int a;
    
    
    void setup() {                
      // initialize the digital pisn as an output.
      pinMode(LEDgreen, OUTPUT); 
      pinMode(LEDyellow, OUTPUT);     
      pinMode(LEDred, OUTPUT);    
      pinMode(bouton , INPUT); 
      
    }
    
    void loop() {
      
      int a;
      a = a++;
      int value = digitalRead(bouton);
      /*
        if (value == HIGH)
        {
          a=a+1;
        }
       */ 
        
        if(a== 0)
        {
      digitalWrite(LEDred, LOW);   // 0
      digitalWrite(LEDyellow, LOW);   // set the LED on
      digitalWrite(LEDgreen, LOW);   // set the LED on
      
        }
      
      if (a == 1)
        {
      digitalWrite(LEDred, LOW);   // 1
      digitalWrite(LEDyellow, LOW);   // set the LED on
      digitalWrite(LEDgreen, HIGH);   // set the LED on
        
        }
      
        if (a == 2)
        {
      digitalWrite(LEDred, LOW);   // 1
      digitalWrite(LEDyellow, HIGH);   // set the LED on
      digitalWrite(LEDgreen, LOW);   // set the LED on
        }
        
         if (a == 3)
        {
      digitalWrite(LEDred, LOW);   // 1
      digitalWrite(LEDyellow, HIGH);   // set the LED on
      digitalWrite(LEDgreen, HIGH);   // set the LED on
        }
        
         if (a == 4)
        {
      digitalWrite(LEDred, HIGH);   // 1
      digitalWrite(LEDyellow, LOW);   // set the LED on
      digitalWrite(LEDgreen, LOW);   // set the LED on
        }
      
       if (a == 5)
        {
      digitalWrite(LEDred, HIGH);   // 1
      digitalWrite(LEDyellow, LOW);   // set the LED on
      digitalWrite(LEDgreen, HIGH);   // set the LED on
        }
         if (a == 6)
        {
      digitalWrite(LEDred, HIGH);   // 1
      digitalWrite(LEDyellow, HIGH);   // set the LED on
      digitalWrite(LEDgreen, LOW);   // set the LED on
        }
          if (a == 7)
        {
      digitalWrite(LEDred, HIGH);   // 1
      digitalWrite(LEDyellow, HIGH);   // set the LED on
      digitalWrite(LEDgreen, HIGH);   // set the LED on
        }
        
     if (a > 7)
        {
          a=0;
        }
      
      
    
     
    }

    Quand j'appuie sur le bouton, il me met un 1 sur les leds et quand je le relache il retourne à 0.

    Avez vous un solution  ????

    Merci ;)

    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2014 à 15:35:43

      T'arrive à voir quoi que ce soit avec ce code ? Parce que là tout ce qui va se passer c'est un clignotement hyper rapide de tes LEDs et c'est tout non ? Ta lecture de bouton n'est jamais utilisé (en tout cas avec le code que tu donnes) donc j'ai du mal à croire que ca ai une quelconque influence.

      Pour l'utilisation des boutons je te conseille de relire le tuto (sur ce site ou ici : http://eskimon.fr/96-arduino-204-un-simple-bouton). Plus particulièrement essaie de comprendre le mécanisme permettant de détecter un changement d'état (qui te permettra d'incrémenter ton compteur 'a')

      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        30 janvier 2014 à 20:12:28

        Eskimon a proposé la solution concernant le bouton.

        Moi, je te propose une amélioration de ton code que tu pourras faire si tu le souhaites.

        =====

        Il faut savoir que tous les composants interne d'un processeur se pilotent en faisant des accès lecture/écriture dans des variables bien précise.

        Pour simplifier la tache, arduino a développé plein de fonctions assez utile mais parfois inadapté au contexte...

        Dans ton cas, digitalWrite est clairement pas adapté (même si cela peut te paraitre étrange).

        Sur l'arduino, on retrouve 3 ports :

        - le port B qui controle les pins 8 à 13

        - le port C qui controle les pins ANx

        - le port D qui controle les pins 0 à 7

        Là ou ça devient intéressant, ces que l'état de chaque port se controle avec un unsigned char.

        Sur cet unsigned char, on retrouve 8 bits : un pour chaque pin.

        Là ou ça devient génial pour toi, c'est que :

        - changer cet unsigned char permet de changer 8 pins d'un coup !

        - vu que 1 bit = 1 pin ; c'est déjà du binaire !

        Donc si tu veux faire un compteur 8 bits, je te propose de mettre 8 leds sur le port D (pins 0 à 7) et de tester le code suivant :

        void setup() {
        
             /*
                 PORTD est une variable spéciale qui contrôle l'état des pins D (pins 0 à 7)
                 Ecrire un 0 passe la pin en LOW
                 Ecrire un 0 passe la pin en HIGH
            */
            PORTD = 0; // Avec ça, je mets des 0 partout donc en une ligne, je passe les pins 0 à 7 à LOW
        
            /*
                DDRD est une variable spéciale qui contrôle la direction des pins D (pins 0 à 7)
                Ecrire un 1 passe la pin en OUTPUT
                Ecrire un 0 passe la pin en INPUT
            */
            DDRD = 255; // Avec je mets des 1 partout donc en une ligne, je passe les pins 0 à 7 en OUTPUT
        
        }
        
        void loop() {
            
            /*
                Rappel : PORTD controle le port D ; un bit par pin donc c'est du binaire
            */
            PORTD++; // Avec ça, en une ligne, j'incrémente le compteur 8 bits affiché !!!
        
            delay(100); // Avec ça, je fais une petite pause de 100ms avant de re-incrémenter
        
        }

        Si on supprime les commentaires, cela fait moins de 10 lignes !!! (je te laisse imaginer le nombre de ligne que ça t'aurais pris sans cette astuce

        void setup() {
            PORTD = 0; // Avec ça, je mets des 0 partout donc en une ligne, je passe les pins 0 à 7 à LOW
            DDRD = 255; // Avec je mets des 1 partout donc en une ligne, je passe les pins 0 à 7 en OUTPUT
        }
        
        void loop() {
            PORTD++; // Avec ça, en une ligne, j'incrémente le compteur 8 bits affiché !!!
            delay(100); // Avec ça, je fais une petite pause de 100ms avant de re-incrémenter
        }

         Tu veux du 16 bits ??? Pas de problèmes, rajoutes 8 leds sur les pins 8 à 13 et tests ceci :

        void setup() {
            PORTD = 0;
            PORTB = 0;
            DDRD = 255;
            DDRB = 255;
        }
        
        void loop() {
            PORTD++;
            if ( PORTD == 0 ) {
                PORTB++;
            }
            delay(20);
        }

         24 bits, c'est aussi possible, je te laisse adapter pour utiliser aussi le port C, le code fera moins de 20 lignes ;)

        -
        Edité par lorrio 30 janvier 2014 à 20:22:09

        • Partager sur Facebook
        • Partager sur Twitter
          30 janvier 2014 à 22:12:18

          C'est marrant je relisais justement la partie du tuto à paraitre sur les ports cet aprem' :D

          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

          Compter en binaire avec des leds

          × 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