Problemen d'affichage sur un afficheur 4digits 7 segments et shiftregister 74hc595n

Bonjour,

Je suis encore en apprentissage d’aurduino ( tout seul, pas simple !!! ).
J’ai trouvé la bibliothèque shiftregister et j’essaye de le mettre à la sauce de ce que je veux.

J’arrive à afficher les chiffres mais ils s’affichent sur les 4 digits en même temps et je n’arrive pas à séparer l’affichage. J’ai mis un potentiomètre et je voudrais afficher la valeur en temps réel. J’ai réussi à le faire sans le shiftregister mais là, j’avoue, je cale …
Je ne sais pas à quel moment on gère l’affichage par digit ni comment on le fait…
Voici mon code :

/*
    4 Digitl 7 segment display PCB board with (4) 74HC595 shift register ICs
    Arduino Tutorial - www.Ardumotive.com
    Dev: Michalis Vasilakis // Date: 23/1/2018 // Ver:1.0
*/
#include <ShiftRegister74HC595.h>
// créé un objet shift register (nombre de shift registers, data pin, clock pin, latch pin)
ShiftRegister74HC595<1> sr ( 13, 11, 12);

const int PIN_POTENTIO = A0;
const int d1 = 4;
const int d2 = 5;
const int d3 = 6;
const int d4 = 7;

int mesure, digit1, digit2, digit3, digit4;

uint8_t  numberB[] = {B00111111, //0
                      B00000110, //1
                      B01011011, //2
                      B01001111, //3
                      B01100110, //4
                      B01101101, //5
                      B01111101, //6
                      B00000111, //7
                      B01111111, //8
                      B01101111, //9
                      B10000000 //dp
                     };

void setup() {
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  pinMode(PIN_POTENTIO, INPUT);
  Serial.begin(9600);
}

void loop() {
  //lecture de A0
  mesure = analogRead(PIN_POTENTIO);
  Serial.println(mesure);
  digit4 = mesure % 10 ;
  digit3 = (mesure / 10) % 10 ;
  digit2 = (mesure / 100) % 10 ;
  digit1 = (mesure / 1000) % 10 ;

  //Send them to 7 segment displays
  for (int i = 0; i < 11; i++) {
    uint8_t numberToPrint[] = {numberB[i]};
    sr.setAll(numberToPrint);
    delay(1000);
  }

  //  Reset them for next read
  digit1 = 0;
  digit2 = 0;
  digit3 = 0;
  digit4 = 0;
  delay(1000); // Read and print every 1 sec
}

Voilà, je vous remercie pour l’aide que vous allez m’apporter et je sais que vous allez réussir à m’expliquer pourquoi je suis un noob !!! :laughing:
Merci à tous

Bonjour,

Apparemment tu as mélangé les exemples de deux librairies différentes.
Tu déclares un seul afficheur ici
ShiftRegister74HC595<1> sr ( 13, 11, 12);
Si tu as 4 digits il faut en déclarer 4
ShiftRegister74HC595<4> sr ( 13, 11, 12);

Ensuite ton utilisation de setAll() est très douteuse.

Bonjour,

Essaie-ça

uint8_t bytes[4];

for ( uint8_t i = 0; i < 4; i++ )
{
  uint8_t chiffre = mesure % 10;
  bytes[i] = mesure == 0 ? 0 : numberB[ chiffre ];
  mesure /= 10;
}

sr.setAll( bytes );
  • Si l’ordre des chiffres est inversé (ex: [321 ] au lieu de [ 123]), tu peux changer
    bytes[i]
    en
    bytes[ 3 - i ]

  • Si tu veux afficher les zéros devant le nombre (ex: [0123] au lieu de [ 123]), tu peux changer
    bytes[i] = mesure == 0 ? 0 : numberB[ chiffre ];
    en
    bytes[i] = numberB[ chiffre ];

Je vais essayer tout cela ce soir et je vous tiens au courant !!!
merci pour vos réponses

Alors j’ai testé la solution de guix mais il n’y a que le dernier chiffre qui s’affiche sur les 4 digits, si mon potentiometre indique 0123, les 4 digits affichent 3…
merci pour la réponse et merci pour votre aide

As-tu fais la modification suggérée par kamill ?

oui j’ai fait la modif mais ça ne change rien…

Tu as un lien ou une référence de ton afficheur?
C’est peut être un afficheur multiplexé.

Alors pour la réf :


Si la photo ne passe pas, c’est 5641AS.

Le 5641AS est un afficheur multiplexé. Il faudrait savoir comment il est piloté par les 74HC595. Mais en tout cas il faudra gérer le multiplexage.
Une chose est sure c’est que la bibliothèque que tu utilises n’est pas adaptée. Elle est faite pour piloter des afficheurs non multiplexés commandés par 4 74HC595.

Ah OK, ceci explique cela… Je n’arrive pas à trouver un bon tuto pour m’en servir… :sob:

Utilise cette librairie : GitHub - bridystone/SevSegShift: Seven segment display controller library for Arduino

Utiliser la bonne bibliothèque, c’est nécessaire.
Chercher un tuto qui explique le principe des afficheurs multiplexés, c’est mieux.