Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variation de chiffres

Sujet résolu
    12 janvier 2018 à 16:17:44

    Bonjour à tous !

    Je reviens vers vos compétences (les miennes sont malheureusement maigres pour mon projet). J'ai réalisé deux grands afficheurs 7 segments. Dessus je souhaite incrémenter de 1 en 1 des chiffres lorsque j'appuie sur un bouton poussoir. Sauf que quand j'applique mon code, les chiffres défilent et s'affichent de manière aléatoire... Est-ce que quelqu'un aurait une idée de mon erreur ? Si je me tourne vers vous c'est que je butte vraiment et sur ce projet ce n'est pas la première fois que j'en suis à cours d'idées...

    A savoir que dans mon exemple, je n'utilise pour l'instant que un seul bouton et que ces derniers sont reliés à un expander I2C.

    mcp1.pinMode(5, OUTPUT); 

     Cette ligne correspond à une LED.



    La photo des afficheurs est "ancienne", les chiffres sont en réalité tous à zéro.

    #include <Wire.h>
    #include "Adafruit_MCP23017.h"
    
    Adafruit_MCP23017 mcp1;
    
    int dataPin = 2;
    int latchPin = 3; 
    int clockPin = 4;
    
    boolean etat_bouton;    
    int memoire_plus = LOW;     
    int bouton_change = false; 
    
    //Alimentation chiffres de droite
    int dig9 = 13; 
    int dig8 = 12;
    int dig7 = 11;
    
    //Alimentation chiffres de gauche
    int dig6 = 10; 
    int dig5 = 9;
    int dig4 = 8;
    int dig3 = 7;
    int dig2 = 6;
    int dig1 = 5;
    
    const byte table[]=
    {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
    
    int var1;
    int var2;
    int var3;
    int var4;
    int var5;
    int var6;
    int var7;
    int var8;
    int var9;
    
    void setup() {
    
    mcp1.begin(0); 
    
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    
    pinMode(dig1, OUTPUT);
    pinMode(dig2, OUTPUT);
    pinMode(dig3, OUTPUT);
    pinMode(dig4, OUTPUT);
    pinMode(dig5, OUTPUT);
    pinMode(dig6, OUTPUT);
    pinMode(dig7, OUTPUT);
    pinMode(dig8, OUTPUT);
    pinMode(dig9, OUTPUT);
    
    mcp1.pinMode(0, INPUT);
    mcp1.pinMode(1, INPUT);
    mcp1.pinMode(2, INPUT);
    mcp1.pinMode(3, INPUT);
    mcp1.pinMode(4, INPUT);
    mcp1.pinMode(5, OUTPUT);
    
    }
    
    void loop() {
    
    
     /* A présent, pour incrémenter de 10 par 10 */
     etat_bouton = mcp1.digitalRead(0);
    
      if((etat_bouton != memoire_plus) && (etat_bouton == HIGH)){
    
      if (var2 < 9)
      {
      var2++; 
      }
    else  
      {
      if (var3 < 9)
        { 
        var3++;
        var2 = 0;
        var1 = 0; 
        }
      else
        { 
        if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
          {
          
          var5 = 0;
          var4++;     
          var3 = 0;
          var2 = 0;
          var1 = 0;
          }
        else {
          
          var5++;     
          var4 = 0;
          var3 = 0;
          var2 = 0;
          var1 = 0;
          } 
        }
     
     }
             
         bouton_change=true;
    }
        
      else bouton_change=false;
      memoire_plus = etat_bouton; //on enregistre l'état du bouton pour le tour suivant
    
    
    //Chiffres à afficher
    
    
    digitalWrite(dig1, 0);
    digitalWrite(dig2, 0);
    digitalWrite(dig3, 0);
    digitalWrite(dig4, 0);
    digitalWrite(dig5, 0);
    digitalWrite(dig6, 0);
    digitalWrite(dig7, 0);
    digitalWrite(dig8, 0);
    digitalWrite(dig9, 0);
    
    
    {
    
    //Afficheur de gauche
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var1]); 
    digitalWrite(latchPin, HIGH);
        
    digitalWrite(dig1, 1);
    delay(1);
    digitalWrite(dig1, 0);
     
    //Dizaine
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var2]); 
    digitalWrite(latchPin, HIGH);
        
    digitalWrite(dig2, 1);
    delay(1);
    digitalWrite(dig2, 0);
     
    //Centaine
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var3]); 
    digitalWrite(latchPin, HIGH);
    
    digitalWrite(dig3, 1);
    delay(1);
    digitalWrite(dig3, 0);
     
    //Millier
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var4]); 
    digitalWrite(latchPin, HIGH);
        
    digitalWrite(dig4, 1);
    delay(1);
    digitalWrite(dig4, 0);
    
    //Dizaine de millier
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var5]); 
    digitalWrite(latchPin, HIGH);
    
    digitalWrite(dig5, 1);
    delay(1);
    digitalWrite(dig5, 0);
    
    //Centaine de millier
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var6]); 
    digitalWrite(latchPin, HIGH);
    
    digitalWrite(dig6, 1);
    delay(1);
    digitalWrite(dig6, 0);
    
    //Afficheur de droite
    //Chiffre de droite
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var7]); 
    digitalWrite(latchPin, HIGH);
        
    digitalWrite(dig7, 1);
    delay(1);
    digitalWrite(dig7, 0);
    
    //Chiffre central
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var8]); 
    digitalWrite(latchPin, HIGH);
        
    digitalWrite(dig8, 1);
    delay(1);
    digitalWrite(dig8, 0);
    
    //Chiffre de gauche
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, table[var9]); 
    digitalWrite(latchPin, HIGH);
        
    digitalWrite(dig9, 1);
    delay(1);
    digitalWrite(dig9, 0);
    }
    
    }



    -
    Edité par MatthieuWilhelm 12 janvier 2018 à 16:21:11

    • Partager sur Facebook
    • Partager sur Twitter
      12 janvier 2018 à 21:14:56

      Tout d'abord, tu ne devrais jamais avoir à toucher à var1 étant donné que c'est le chiffre des unités et que tu fais un +10.

      Ensuite, ta logique de else if était bonne, tu aurais tout simplement du la continuer ;)

      Ce qui donne le code suivant :

      if ( var2 < 9 ) {
      
          var2++;
      
      } else if ( var3 < 9 ) {
      
          var2 = 0;
          var3++;
      
      } else if ( var4 < 9 ) {
      
          var2 = 0;
          var3 = 0;
          var4++;
      
      } else if ( var5 < 9 ) {
      
          var2 = 0;
          var3 = 0;
          var4 = 0;
          var5++;
      
      } else {
      
          var2 = 0;
          var3 = 0;
          var4 = 0;
          var5 = 0;
          var6++;
      
      }
      

      Mais pourquoi ne pas stoker ton nombre sous forme d'un unsigned long et faire des calculs mathématique de décomposition ?

      Cela te permettra de faire tout ce que tu veux dessus (+1, +2, +3, +10, +43) et autre, sans avoir à te soucier des digits indépendamment.

      Par exemple, prends ta calculatrice et fait ( ( 3478 * 98 ) + 7417 ), tu devrais trouver 348261

      Et maintenant, essaye le code suivant :

      unsigned long nbA;
      unsigned long nbB;
      unsigned long nbC;
      unsigned long total;
      
      nbA = 3478;
      nbB = 98;
      nbC = 7417;
      
      total = ( ( nbA * nbB ) + nbC );
      
      var1 = ( ( total / 1uL ) % 10 );
      var2 = ( ( total / 10uL ) % 10 );
      var3 = ( ( total / 100uL ) % 10 );
      var4 = ( ( total / 1000uL ) % 10 );
      var5 = ( ( total / 10000uL ) % 10 );
      var6 = ( ( total / 100000uL ) % 10 );
      
      // ICI: ton code pour afficher var1 à var8

      Bref, il te suffira de manipuler la variable "total" pour gérer ton nombre, tout simplement ;)


      -
      Edité par lorrio 12 janvier 2018 à 21:16:47

      • Partager sur Facebook
      • Partager sur Twitter
        12 janvier 2018 à 21:53:03

        Je t'ai envoyé un message privé.

        Ton code marche fantastiquement bien !!!!!!!!!! :-D

        • Partager sur Facebook
        • Partager sur Twitter

        Variation de chiffres

        × 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