IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Utiliser 2 afficheurs 7 segments pour afficher des grands nombres


Sujet :

Arduino

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Utiliser 2 afficheurs 7 segments pour afficher des grands nombres
    Hello tout le monde !

    Je suis nouveau ici parce que je souhaite me tourner vers vos connaissances. Je débute en Arduino et je bute sur un programme que j'ai modifié/développé.

    Il s'agit d'un afficheur 4 digits / 7 segments sur lequel j'incrémente des chiffres de 10 en 10 ou de 100 en 100 grâce à deux boutons. Tout fonctionne jusqu'à ce que j'ajoute un autre afficheur 4 digits / 7 segments pour grossir mon chiffre (passer des milliers au dizaine de milliers).

    Sauf que quand j'arrive à 1000, mon 5ème digit affiche le même chiffre que le 4ème au lieu de rester à zéro et passer à 1 quand je passe les 9900 ! En gros, je passe directement des centaines au dizaine de milliers.

    Que dois-je modifier dans mon programme ? En sachant que mon câblage est juste. C'est vraiment sur la programmation que je bute.

    Merci d'avance !!!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    int bp2 = 11;    //Bouton 2 pour incrémenter de 10
    int bp3 = 12;  //Bouton 3 pour incrémenter de 100
     
    int var1 = 0;
    int var2 = 0;
    int var3 = 0;
    int var4 = 0;
    int var5 = 0;
     
     
    boolean etat_bouton;    
    int memoire_plus2 = LOW;     
    int bouton_changeP2 = false; 
    int memoire_plus3 = LOW;
    int bouton_changeP3 = false;
     
    int dataPin = 8;
    int latchPin = 9; 
    int clockPin = 10; 
     
    const byte table[]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
    ,0x39,0x5e,0x79,0x71,0x00};
     
    int dig1 = 7;
    int dig2 = 6;
    int dig3 = 5;
    int dig4 = 4;
    int dig5 = 3;
     
    void setup() {
     
      Serial.begin(9600); 
      pinMode(bp2, INPUT);
      pinMode(bp3, INPUT);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
     
      pinMode(dig1, OUTPUT);
      pinMode(dig2, OUTPUT);
      pinMode(dig3, OUTPUT);
      pinMode(dig4, OUTPUT);
      pinMode(dig5, OUTPUT);
    }
     
    void loop(){ 
      /* Incrémentation de 100 */
     etat_bouton = digitalRead(bp2);
     
      if((etat_bouton != memoire_plus2) && (etat_bouton == HIGH))
      {
        //on incrémente la variable qui indique quelle partie du programme devra être exécutée (affiche le résultat sur les afficheurs)
        if (var2 != 10){
         var2++; 
        }
        if (var2 == 10){
         var3 += 1;
         var2 = 0;
         var1 = 0; 
        }
     
       if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
      {
     
         var5 = 0;
         var4 += 1;     
         var3 = 0;
         var2 = 0;
         var1 = 0;
     
      }
     
         bouton_changeP2=true;
     
         }
      else bouton_changeP2=false;
      memoire_plus2 = etat_bouton; //on enregistre l'état du bouton pour le tour suivant
     
     /* Incrémentation de 10 */
     
     
     etat_bouton = digitalRead(bp3);
     
      if((etat_bouton != memoire_plus3) && (etat_bouton == HIGH))
      {
        //on incrémente la variable qui indique quelle partie du programme devra être exécutée (affiche le résultat sur les afficheurs).
     
        if (var3 != 10){
         var3++; 
        }
         if(var3 == 10){
         var1 = 0;
         var2++; 
        }
        if (var3 == 10){
         var5 = 0;
         var4 += 1;
         var3 = 0;
         var2 = 0;
         var1 = 0; 
     
             }
         bouton_changeP3=true;
      }
      else bouton_changeP3=false;
      memoire_plus3 = etat_bouton; //on enregistre l'état du bouton pour le tour suivant
     
     
     
     //Unité (Digits le plus à droite correspondant au "Digit4")
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var1]); 
        digitalWrite(latchPin, HIGH);
     
         //On lui dit sur quelle afficheur il doit afficher notre valeur
             //L'état fonctionne comme une fonction NO, si la value est à 1, le Digit est éteint et inverssement
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 0);
      //Et on laisse un petit delay avant de passer au suivant (pas trop grand afin de permettre un multiplexage "fluide")
        delay(5);
     
    //Dizaine
        digitalWrite(latchPin, LOW);
     
        shiftOut(dataPin, clockPin, MSBFIRST, table[var2]); 
     
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 0);
          digitalWrite(dig4, 1);
          delay(5);
     
    //Centaine
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var3]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 0);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);
     
    //Millier
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var4]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 0);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);
     
    //Dizaine de milliers
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var5]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 0);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);
     
    }

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour Ochey54,

    On est pas loin apparemment et géographiquement parlant

    J'ai pratiqué un peu Arduino et délaissé depuis...
    Mais je dirais qu'avec quelques commentaires en plus ça aiderait quand même ...

    4 digits / 7 segments et 5 variables ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int var1 = 0;
    int var2 = 0;
    int var3 = 0;
    int var4 = 0;
    int var5 = 0;
    ...
    int dig1 = 7;
    int dig2 = 6;
    int dig3 = 5;
    int dig4 = 4;
    int dig5 = 3;
    ...
    Et ceci (17 valeurs) représente quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const byte table[]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
    ,0x39,0x5e,0x79,0x71,0x00};

    Maintenant autre remarque
    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0
    pour moi prête à confusion et sans me soucier de la priorité de l'opérateur || par rapport à &&
    je dirais qu'avec des () en plus ça serait préférable ... ce genre quoi ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (var3 == 9 && var2 != 0) || (var3 == 9 && var1 != 0)

    voili voilou ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour Ochey

    Il faut dire merci à quel modérateur pour avoir mis la balise code et fait l'indentation du code?
    Ochey l'indentation du code telle que présenté ici c'est important, hier soir ton code était bien plus difficile à lire.

    Ton code est en cours de construction, tu ne gères pas encore les dizaines de millier, (il n'y a encore aucune ligne var5 = quelquechose;, uniquement var5 = 0;) donc ma première impression c'est simplement que le branchement des afficheurs de millier et dizaine de millier est inversé.

    Par contre ton algorithme de comptage est alambiqué. Pense à comment on t'a appris à compter dans tes premières années d'école.

    Yttman a de bonnes réponses à quelques exceptions. Quelques commentaires de la part de Ochey aurait pu aider:
    Citation Envoyé par vttman Voir le message
    4 digits / 7 segments et 5 variables ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int var1 = 0;
    int var2 = 0;
    int var3 = 0;
    int var4 = 0;
    int var5 = 0;
    ...
    int dig1 = 7;
    int dig2 = 6;
    int dig3 = 5;
    int dig4 = 4;
    int dig5 = 3;
    ...
    int var1..5 c'est le comptage des 5 chiffres, int dig1..5 c'est des constantes pour indiquer le pin de sortie de contrôle des 7seg. Une bizarrerie, à mon avis, de l’environnement Arduino car on devrait utiliser des const ou des def, mais les exemple Arduino sont construit avec des variables pour l'instant on laisse en état.

    Citation Envoyé par vttman Voir le message
    Et ceci (17 valeurs) représente quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const byte table[]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
    ,0x39,0x5e,0x79,0x71,0x00};
    C'est la table de mappage pour les afficheurs 7 seg, avec les chiffres hexa (A, b, C, d, E, F) et avec un état éteint en 17ème position. C'est bon, il n'y a rien à changer.

    Bonne journée

    Delias

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bonjour à Vttman et Delias,

    Merci à tous les deux de m'avoir répondu ! Pour l'oubli des balises, désolé. En effet, je ne suis absolument pas famillier avec les forums, d'où certains oublis.


    Delias, quand tu dis: " tu ne gères pas encore les dizaines de millier, (il n'y a encore aucune ligne var5 = quelquechose;, uniquement var5 = 0" je ne comprends pas car j'ai en fin de code j'ai stipulé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Dizaine de milliers
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var5]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 0);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);

    Ainsi que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
      {
     
         var5 = 0;
         var4 += 1;     
         var3 = 0;
         var2 = 0;
         var1 = 0;
     
      }
    En mettant mon "var5" à 0, j'affiche "0" sur mon afficheur. Il est bien reconnu. C'est juste qu'il passe à 1 quand je passe des centaines (990) à 1000. Au lieu de passer à 1 lorsque je dépasse les milliers.


    Pour illustrer mon code, je viens de réaliser cette photo qui montre bien que quand je suis à mille (afficheur de droite), l'afficheur de gauche affiche directement 1...


    Nom : afficheur_00000.jpg
Affichages : 5254
Taille : 1,74 Mo

  5. #5
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    1) Ceci reste toujours "illisible" pour moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
    ...

    2) +1 avec Delias pour var5 qui affiche la dizaine de millier

    Voici ce qui concerne var5 dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
      {
     
         var5 = 0;
    ...
    Plus bas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       if (var3 == 10){
         var5 = 0;
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       shiftOut(dataPin, clockPin, MSBFIRST, table[var5]);
    Ainsi a aucun moment var5 ne changera de valeur et restera à 0 ... donc en contradiction avec l'affichage ...
    => Certainement donc un problème de cablage.
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour

    Moi j'avais compris que la suite de nombre était la suivante (en incrémentation de centaines):
    - 00800
    - 00900
    - 10000
    - 10100
    mais apparemment c'est:
    - 00800
    - 00900
    - 11000
    - 11100

    Est-ce que par hasard si tu doubles la ligne N° 169 cela fonctionne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        shiftOut(dataPin, clockPin, MSBFIRST, table[var5]); 
        shiftOut(dataPin, clockPin, MSBFIRST, table[var5]);
    Si c'est cela, c'est bien un problème de câblage, mais pas une inversion, comme quoi joindre le schéma d'un montage c'est utile.
    [Edit] En fait c'est une non adéquation entre le code et le circuit externe. Le même circuit externe demande un autre code, mais ce code avec un autre circuit externe fonctionnera également.

    Delias

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Vttman :

    Effectivement, j'ai oublié de préciser qu'entre temps j'ai changé le code, à la ligne 66 et ligne 97, de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         var5 += 1;
         var4 += 1;     
         var3 = 0;
         var2 = 0;
         var1 = 0;
    Ce qui en résulte l'image de ma photo.

    Car en laissant var5 à 0, mon afficheur n'affiche même plus les milliers. Il monte à 900 et revient à 100...

    Sinon pour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
    ...
    Je voulais signifier à l'Arduino que si j’atteins la valeur de 900 et bien: var4, var3, var2 et var1 affichent respectivement cette valeur "1000" pour continuer sur les milliers.


    Delias:

    C'est exactement cela mon problème, en incrémentant mes valeurs, l'afficheur me met les chiffres de la façon que tu m'as exposé:

    - 00800
    - 00900
    - 11000
    - 11100

    J'ai doublé la ligne de code comme tu me l'as demandé et ça n'a rien changé.

    Merci encore à tous les deux, surtout pour votre patience.

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Salut,
    Je n'ai pas regardé le code en détail mais j'ai une question :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         if(var3 == 10){
         var1 = 0;
         var2++; 
        }
        if (var3 == 10){
         var5 = 0;
         var4 += 1;
         var3 = 0;
         var2 = 0;
         var1 = 0;

    Pour moi lorsque var3 == 10 tu entres dans les deux if et tu fais var2++; suivie d'un var2 = 0;
    C'est normal ?

    ps: sans le schéma électronique/électrique associé, ton programme est difficile à debugguer.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #9
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Moi aussi, je me perd un peu dans le code
    Je te propose de remplacer et tester ceci, même si c'est faux
    (on ne sait jamais)
    ça sera déjà plus clair non ?


    pour le bouton +10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    if (var2 < 9)
    	{
    	var2++; 
    	}
    else	
    	{
    	if (var3 < 9)
    		{ 
    		var3++;
    		var2 = 0;
    		var1 = 0; 
    		}
    	else
    		{ 
    		if (var4 < 9)
    			{
    			var4++;     
    			var3 = 0;
    			var2 = 0;
    			var1 = 0;
    			}
    		else {
    			var5++;     
    			var4 = 0;
    			var3 = 0;
    			var2 = 0;
    			var1 = 0;
    			}	
    		}
    	}		
     }
    et ceci pour le bouton +100

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    if (var3 < 9)
    		{ 
    		var3++;
    		var2 = 0;
    		var1 = 0; 
    		}
    	else
    		{ 
    		if (var4 < 9)
    			{
    			var4++;     
    			var3 = 0;
    			var2 = 0;
    			var1 = 0;
    			}
    		else {
    			var5++;     
    			var4 = 0;
    			var3 = 0;
    			var2 = 0;
    			var1 = 0;
    			}	
    		}
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 377
    Points
    20 377
    Par défaut
    Citation Envoyé par ochey54 Voir le message
    Il s'agit d'un afficheur 4 digits / 7 segments sur lequel j'incrémente des chiffres de 10 en 10 ou de 100 en 100 grâce à deux boutons.
    Il faudrait préciser 4 digits : est ce que c'est 2x2x2x2 soit 2^4 possibilités et combinaisons de valeurs ?
    Si 4 digits c'est 4 en binaire soit la valeur max alors 1111 en base 2 ça donne 16 en base décimale

    Peut-être que c'est un problème de format de variable, sur combien d'octets est codé un integer avec Arduino ?

    if(var3 == 9 && var2 != 0 || var3 == 9 && var1 != 0)
    il est préférable d'utiliser des masques logiques bit à bit avec l'opérateur And ou au besoin le est exclusif XOR c'est selon...

    https://en.wikipedia.org/wiki/Bitwise_operation
    https://en.wikipedia.org/wiki/Mask_(computing)

    Voir aussi si les champs de bits seraient appropriés
    https://en.wikipedia.org/wiki/Bit_field

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir Ochey

    Avec le programme initial, la suite de nombre c'est quoi?
    Parce que quand tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         var5 += 1;
         var4 += 1;
         var3 = 0;
         var2 = 0;
         var1 = 0;
    C'est normal de passer de 00900 à 11000.

    Et puis le code de comptage c'est pourtant pas compliqué (j'ai simplifié les boutons, mais pour eux le code initial doit rester):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    if (bouton_pressé_dizaine){
    {
        var2++;
    }
    if (bouton_pressé_centaine){
    {
        var3++;
    }
    if (var1 >= 10)
    {
        var1 = 0;
        var2++;
    }
    if (var2 >= 10)
    {
        var2 = 0;
        var3++;
    }
    if (var3 >= 10)
    {
        var3 = 0;
        var4++;
    }
    if (var4 >= 10)
    {
        var4 = 0;
        var5++;
    }
    if (var5 >= 10)
    {
        var5 = 0;
        // roll-over, le compteur retourne à 0
    }
    l'utilisation de >= au lieu de = permet au programme de ne pas exploser si il y a double incrémentations (exemple: affichage de 00990 et l'utilisateur presse les deux boutons.)

    Delias

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Vincent PETIT:

    En gros, je dis que si var3 à une valeur de 10 et bien var 2 peu augmenter (11, 12, 13, etc.). Jusqu'à 1000 (d'où mon var 2 à 0 dans la deuxième parties de if).

    Vttman:

    Je viens de tester ton code et je ne peux pas aller au-delà de 900, ça revient automatiquement à 100......

    Delias:

    Je viens aussi de tester ton code et ça ne fonctionne pas.

    Mat.M:

    Comment le préciser à Arduino ?

    Je viens de réaliser un schéma sous Fritzing mais le rendu est peu clair. En sachant que l'afficheur que je possède sous Fritzing n'est pas le même que j'aie en réalité. Le mien n'a pas de ":" entre chaque digit.

    Du coup j'en ai dessiné un autre un peu plus dégagé qui reflète mes branchements. Je vous ajoute quand même celui de Fritzing.

    Nom : Schéma Afficheur.jpg
Affichages : 7121
Taille : 229,0 KoNom : AFFICHEUR FRITZ.jpg
Affichages : 5602
Taille : 455,2 Ko

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir

    Doubler la ligne avec le 1er code indiqué, Donc sans la modif var5++;, cela donne quoi? Car le schéma corrobore l’intuition que j'ai eu à ce moment là. Cela devrait compter au moins proprement jusqu'à 9900

    Delias

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bonsoir Delias,


    Non ça ne change absolument pas. Je dirai même que maintenant c’en est totalement incroyable. J'ai essayé tout ce que vous m'avez dit. J'ai modifié tant que j'ai pu mon code et non, rien à y faire. Je comprends pas.

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir Ochey

    Ne pars pas défaitiste Il y a probablement plusieurs erreurs dans ton code, d'où l’impossibilité de résoudre en une seule fois, tu dois le reprendre pas par pas:
    En premier fait déjà marcher correctement l'affichage. Pour cela reprends ton premier code et supprime (ou commente) tout ce qui est relatif aux boutons et au comptage et initialise les var à 1,2,3,4 et 5.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    int bp2 = 11;    //Bouton 2 pour incrémenter de 10
    int bp3 = 12;  //Bouton 3 pour incrémenter de 100
     
    int var1 = 1;
    int var2 = 2;
    int var3 = 3;
    int var4 = 4;
    int var5 = 5;
     
     
    boolean etat_bouton;    
    int memoire_plus2 = LOW;     
    int bouton_changeP2 = false; 
    int memoire_plus3 = LOW;
    int bouton_changeP3 = false;
     
    int dataPin = 8;
    int latchPin = 9; 
    int clockPin = 10; 
     
    const byte table[]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
    ,0x39,0x5e,0x79,0x71,0x00};
     
    int dig1 = 7;
    int dig2 = 6;
    int dig3 = 5;
    int dig4 = 4;
    int dig5 = 3;
     
    void setup() {
     
      Serial.begin(9600); 
      pinMode(bp2, INPUT);
      pinMode(bp3, INPUT);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
     
      pinMode(dig1, OUTPUT);
      pinMode(dig2, OUTPUT);
      pinMode(dig3, OUTPUT);
      pinMode(dig4, OUTPUT);
      pinMode(dig5, OUTPUT);
    }
     
    void loop(){ 
     //Unité (Digits le plus à droite correspondant au "Digit4")
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var1]); 
        digitalWrite(latchPin, HIGH);
     
         //On lui dit sur quelle afficheur il doit afficher notre valeur
             //L'état fonctionne comme une fonction NO, si la value est à 1, le Digit est éteint et inverssement
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 0);
      //Et on laisse un petit delay avant de passer au suivant (pas trop grand afin de permettre un multiplexage "fluide")
        delay(5);
     
    //Dizaine
        digitalWrite(latchPin, LOW);
     
        shiftOut(dataPin, clockPin, MSBFIRST, table[var2]); 
     
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 0);
          digitalWrite(dig4, 1);
          delay(5);
     
    //Centaine
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var3]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 0);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);
     
    //Millier
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var4]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 1);
          digitalWrite(dig1, 0);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);
     
    //Dizaine de milliers
     
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, table[var5]); 
        digitalWrite(latchPin, HIGH);
     
          digitalWrite(dig5, 0);
          digitalWrite(dig1, 1);
          digitalWrite(dig2, 1);
          digitalWrite(dig3, 1);
          digitalWrite(dig4, 1);
          delay(5);
     
    }
    Et normalement, si mon analyse est correcte (ce que je ne suis qu'à moitié sur) tu obtiendras 44321 au lieu de 54321.
    Il y a également des améliorations à apporter dans cette partie du code.
    Résous donc déjà cette partie, et une fois l'affichage correct, tu pourras passer au comptage.

    Bonne nuit

    Delias

  16. #16
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Lorsqu'on debug, il faut à un moment arrêter de chercher ce qui ne fonctionne pas mais chercher plutôt ce qui fonctionne.
    Élague ton programme, retire tout ce qui ne sert pas pour garder que l'essentiel et le basique puis repart de là.


    Essaye ce code (attention, je n'ai pas de Arduino donc je n'ai pas compilé mais j'ai simplifié la partie qui pose probablement problème)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    unsigned int i, compteur;
     
    boolean etat_bouton;    
     
    int dataPin = 8;
    int latchPin = 9; 
    int clockPin = 10; 
     
    const byte table[]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
    ,0x39,0x5e,0x79,0x71,0x00};
     
    int dig1 = 7;
    int dig2 = 6;
    int dig3 = 5;
    int dig4 = 4;
    int dig5 = 3;
     
    void setup() {
     
      Serial.begin(9600); 
      pinMode(11, INPUT);
      pinMode(12, INPUT);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
     
      pinMode(dig1, OUTPUT);
      pinMode(dig2, OUTPUT);
      pinMode(dig3, OUTPUT);
      pinMode(dig4, OUTPUT);
      pinMode(dig5, OUTPUT);
     
      i = 0;
      compteur = 0;
    }
     
    void loop()
    { 
     	/* Incrémentation de 100 */
     	etat_bouton = digitalRead(11);
     
     	if(etat_bouton == HIGH)
     		compteur += 100;
     
    	/* Incrémentation de 10 */
     	etat_bouton = digitalRead(12);
     
      	if(etat_bouton == HIGH)
    		compteur += 10;
     
    	/* Anti overflow */ 
    	if(compteur >= 20000)
    		compteur = 0;
     
    	i = compteur; 
     
     //Unité
    	digitalWrite(latchPin, LOW);
    	shiftOut(dataPin, clockPin, MSBFIRST, table[(int)i%10]); // le % permet d'avoir que l'unité
    	digitalWrite(latchPin, HIGH);
    	digitalWrite(dig5, 1), digitalWrite(dig1, 1), digitalWrite(dig2, 1), digitalWrite(dig3, 1), digitalWrite(dig4, 0);
    	delay(5);
    	i /= 10; // on divise par 10 donc l'unité dégage et c'est la dizaine qui prend sa place et plus bas on recommence.
     
    //Dizaine
    	digitalWrite(latchPin, LOW);
     	shiftOut(dataPin, clockPin, MSBFIRST, table[(int)i%10]); 
    	digitalWrite(latchPin, HIGH);
    	digitalWrite(dig5, 1), digitalWrite(dig1, 1), digitalWrite(dig2, 1), digitalWrite(dig3, 0), digitalWrite(dig4, 1);
    	delay(5);
    	i /= 10;
     
    //Centaine
    	digitalWrite(latchPin, LOW);
    	shiftOut(dataPin, clockPin, MSBFIRST, table[(int)i%10]); 
    	digitalWrite(latchPin, HIGH);
    	digitalWrite(dig5, 1), digitalWrite(dig1, 1), digitalWrite(dig2, 0), digitalWrite(dig3, 1), digitalWrite(dig4, 1);
    	delay(5);
    	i /= 10;
     
    //Millier
    	digitalWrite(latchPin, LOW);
    	shiftOut(dataPin, clockPin, MSBFIRST, table[(int)i%10]); 
    	digitalWrite(latchPin, HIGH);
    	digitalWrite(dig5, 1), digitalWrite(dig1, 0), digitalWrite(dig2, 1), digitalWrite(dig3, 1), digitalWrite(dig4, 1);
    	delay(5);
    	i /= 10;
     
    //Dizaine de milliers
    	digitalWrite(latchPin, LOW);
    	shiftOut(dataPin, clockPin, MSBFIRST, table[(int)i%10]); 
    	digitalWrite(latchPin, HIGH);
    	digitalWrite(dig5, 0), digitalWrite(dig1, 1), digitalWrite(dig2, 1), digitalWrite(dig3, 1), digitalWrite(dig4, 1);
    	delay(5);
    	i = 0;
     
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  17. #17
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    bonjour,

    Personnellement, je n'ai pas regardé le code car trop compliqué et le nom des variables mal choisies. A mon avis, il faut repartir sur quelque chose de sain plutôt que d'essayer de le déboguer. Une fois que le nouveau script sera au point on pourra comparer les deux versions.

    pour moi c'est "juste" une liaison série donc 3 sorties sont nécessaires : clock, latch et data.
    1- Avant tout, écris un code pour seulement un afficheur et un 74HC595 et regarde si tu vas de 0000 à 9999.
    2- Puis essaye avec tes deux afficheurs, et 2 sorties de données, une pour chaque registre (ne relie pas les 595 entre eux).
    Je me demande aussi si ta table de mappage est juste.
    3- Dernière étape : une sortie de données et les registres reliés entre eux.

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Vincent PETIT: Je viens de tester ton code et malheureusement il ne fonctionne pas. Quand j'appuie sur une touche, le digit affiche une valeur complètement folle.

    Delias: En appliquant ton code, j'obtiens cette valeur: 55321. A partir de là, je peux peut-être reprendre mon code à zéro en tenant compte de tes conseils cités plus haut.

    Auteur: je vais essayer d'appliquer ce que tu m'as conseillé.

    Merci à tous les trois !

  19. #19
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Citation Envoyé par ochey54 Voir le message
    Vincent PETIT: Je viens de tester ton code et malheureusement il ne fonctionne pas. Quand j'appuie sur une touche, le digit affiche une valeur complètement folle.
    Tous les digits ?

    Tu peux ajouter un délai quelque part car je me rends compte que je n'ai mis aucune tempo et le compteur doit aller tellement vite que c'est sur qu'on y verra rien a part un truc bizarre ?
    Ajoute un delay(500); (si ça fait 500ms ? je suppose) en dessous de i = compteur; par exemple et dit moi ce que ça fait stp.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Vincent PETIT: J'ai effectué le changement tel que tu me l'as demandé, en appliquant un delay de 0,5 secondes, mais ça ne change rien du tout... J'ai beau le placer ailleurs, le problème perdure.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utiliser Ajax et PHP SQL pour afficher des images BDD
    Par kaspar Knox dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/02/2016, 18h48
  2. Stratégie pour afficher un grand nombre de données
    Par oneagaindoguys dans le forum Général Java
    Réponses: 50
    Dernier message: 09/12/2010, 10h22
  3. [Lazarus] Quel composant doit-on utiliser pour afficher des thumbnails ?
    Par limax dans le forum Lazarus
    Réponses: 1
    Dernier message: 28/02/2010, 10h51
  4. lire et utiliser les donnees d'un fichier texte pour afficher des courbes
    Par messaoudi2009 dans le forum Général Java
    Réponses: 1
    Dernier message: 29/04/2009, 21h00
  5. Type PostgreSQL pour stocker des grands nombres
    Par K-Kaï dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/06/2006, 20h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo