Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficheur 7 segments et potentiomètre

Sujet résolu
    7 mai 2013 à 23:55:17

    Bonjour, bonsoir à tous, je suis actuellement en train de suivre le tuto arduino et j'arrive bientôt à terme, je viens de finir la partie 4 sur les grandeurs analogiques et je me suis dit que j'allait combiner le potentiomètre avec l'afficheur 7 segments pour pouvoir obtenir une échelle proportionnelle de -1 à 10, c'est à dire que l'afficheur affiche un zéro clignotant pour la plus basse valeur, puis les 10 chiffres et enfin un 9 clignotant, j'ai fait mes branchements et mon programme et le problème arrive de suite :

    En faite le tout marche très bien à l'exception de l'affichage du 9 clignotant. Voilà mon code (un peu long désolé '^^) : 

    const int a = 7;
    const int b = 8;
    const int c = 9;
    const int d = 10;
    const int e = 11;
    const int f = 12;
    const int g = 13;    
    const int potar = 1; 
    
    int donnees_potar;
    int nombre;
    int etat_led;
    long temps_led;
    
    void setup()
    {
       pinMode(a, OUTPUT);
       pinMode(b, OUTPUT);
       pinMode(c, OUTPUT);
       pinMode(d, OUTPUT);
       pinMode(e, OUTPUT);
       pinMode(f, OUTPUT);
       pinMode(g, OUTPUT);
    }
    
    void loop()
    {
      donnees_potar = analogRead(potar);
      nombre = ((donnees_potar * 11) / 1024);
      affichage(nombre);
    }
    
    int affichage(int param1)
    {
      
        if(param1 == 0)
        {
         
          if((millis() - temps_led) > 500)
            {
              etat_led = !etat_led;  
              digitalWrite(a, etat_led);
              digitalWrite(b, etat_led);
              digitalWrite(c, etat_led);
              digitalWrite(d, etat_led);
              digitalWrite(e, etat_led);
              digitalWrite(f, etat_led);
              temps_led = millis();
            }
       }
      
       if(param1 == 1)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, LOW);
         digitalWrite(e, LOW);
         digitalWrite(f, LOW);
         digitalWrite(g, HIGH);
       } 
       if(param1 == 2)
       {
         digitalWrite(a, HIGH);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, HIGH);
         digitalWrite(e, HIGH);
         digitalWrite(f, HIGH);
         digitalWrite(g, HIGH);
       } 
       if(param1 == 3)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, LOW);
         digitalWrite(c, HIGH);
         digitalWrite(d, LOW);
         digitalWrite(e, LOW);
         digitalWrite(f, HIGH);
         digitalWrite(g, LOW);
       }
       if(param1 == 4)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, LOW);
         digitalWrite(e, HIGH);
         digitalWrite(f, HIGH);
         digitalWrite(g, LOW);
       } 
       if(param1 == 5)
       {
         digitalWrite(a, HIGH);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, HIGH);
         digitalWrite(e, HIGH);
         digitalWrite(f, LOW);
         digitalWrite(g, LOW);
       } 
       if(param1 == 6)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, HIGH);
         digitalWrite(c, LOW);
         digitalWrite(d, LOW);
         digitalWrite(e, HIGH);
         digitalWrite(f, LOW);
         digitalWrite(g, LOW);
       } 
       if(param1 == 7)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, HIGH);
         digitalWrite(c, LOW);
         digitalWrite(d, LOW);
         digitalWrite(e, LOW);
         digitalWrite(f, LOW);
         digitalWrite(g, LOW);
       } 
       if(param1 == 8)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, HIGH);
         digitalWrite(e, HIGH);
         digitalWrite(f, HIGH);
         digitalWrite(g, HIGH);
       } 
       if(param1 == 9)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, LOW);
         digitalWrite(e, LOW);
         digitalWrite(f, LOW);
         digitalWrite(g, LOW);
       }
       if(param1 == 10)
       {
         digitalWrite(a, LOW);
         digitalWrite(b, LOW);
         digitalWrite(c, LOW);
         digitalWrite(d, LOW);
         digitalWrite(e, HIGH);
         digitalWrite(f, LOW);
         digitalWrite(g, LOW);
       }  
       if(param1 == 11)
       {
         if((millis() - temps_led) > 500)
            {
              etat_led = !etat_led;  
              digitalWrite(a, etat_led);
              digitalWrite(b, etat_led);
              digitalWrite(c, etat_led);
              digitalWrite(d, etat_led);
              digitalWrite(g, etat_led);
              digitalWrite(f, etat_led);
              temps_led = millis();
            }
       }
    }

    J'ai essayer de changer les valeurs des conditions pour l'affichage par des intervalles mais même problème.

    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2013 à 1:05:46

      Bonjour,

      à cause de cette ligne : nombre = ((donnees_potar * 11) / 1024);, nombre vas être égale à 11 seulement quand donnees_potar sera égale à 1024 (avec les int les virgules sont tronquées, si je ne me trompe pas...), le problème c'est que analogRead() ne renvoit qu'un nombre entre 0 et 1023 !

      Pour plus de précision, tu peut faire un map(donnees_potar, 0, 1023, 0, 11);.

      Après 2/3 trucs que j'ai remarqué sur ton code : pense à initialiser temps_led au début, et pour param1 = 0 et 11, actualise l'état de chaque segment.

      J’espère t'avoir été utile !

      -
      Edité par diode 8 mai 2013 à 1:06:46

      • Partager sur Facebook
      • Partager sur Twitter
      2b||!2b   sqrt(4b²)
        8 mai 2013 à 1:23:34

        Ok merci je ne savais pas ça, autrement tu entend quoi par réinitialiser l'état des segments ? Les remettre tous à 1 au début de la fonction affichage() ?

        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2013 à 2:38:13

          Met temps_led à 0 lors de l'initialisation, et dans tes if de affichage(), écrit un digitalWrite pour chaque segments, même si il ne doit pas changer d'état (lors des clignotements).

          • Partager sur Facebook
          • Partager sur Twitter
          2b||!2b   sqrt(4b²)
            8 mai 2013 à 13:49:09

            Ok, j'ai compris, mais j'ai réécris mon code en utilisant ce que tu m'as dit et maintenant mon problème ne se situe plus sur le 9 clignotant mais le zéro qui ne clignote plus quand le potentiomètre et au minimum :l

            • Partager sur Facebook
            • Partager sur Twitter
              8 mai 2013 à 19:42:12

              Dans ce cas, tente de faire map(donnees_potar, -1, 1024, -1, 12);

              Je ne te promet rien, mais ça devrait marcher.

              • Partager sur Facebook
              • Partager sur Twitter
              2b||!2b   sqrt(4b²)
                9 mai 2013 à 17:05:06

                Non, maintenant c'est revenu au niveau du 9 x)

                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2013 à 19:13:58

                  Hum...

                  Remet cette ligne : map(donnees_potar, 0, 1023, 0, 11); et envoie sur le port série nombre et donnees_potar, en mettant ton potar sur la position minimale et maximale, pour voir où ça coince ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  2b||!2b   sqrt(4b²)
                    10 mai 2013 à 12:04:26

                    Au max donnees_potar oscille entre 1018 et 1023 et de même pour nombre entre 10 et 11 et lorsque le potar est au minimum tout est à 0
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 mai 2013 à 12:23:20

                      Bon, cette fois, j'ai trouvé : map(donnees_potar, 0, 1024, 0, 12);

                      Si c'est pas ça, je ne voit vraiment pas quoi faire ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      2b||!2b   sqrt(4b²)
                        10 mai 2013 à 12:40:24

                        C'était bien ça, le problème est réglé :) D'un autre côté en fait quand on regarde bien le code c'est vrai que ça paraissait bizarre, il y avait 12 conditions et la fonction map() découpait les données en 12 entiers mais il manquait la valeur max, en tous cas merci beaucoup pour ton aide :)

                        -
                        Edité par BlepBloupBlop 10 mai 2013 à 12:45:59

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Afficheur 7 segments et potentiomètre

                        × 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