Problema su display 4 elementi a 7 segmenti

Ciao a tutti,
come partenza per un progetto che ho in mente ,vorrei iniziare per primo a visualizzare su un display 7 segmenti a 4 elementi il numero 1 7 1 7 .

http://www.brescianet.com/appunti/Elettronica/Arduino/corso/Esempio_7SEGMENTx4.htm

All’inizio ho voluto leggere i numeri 1717 pilotando ogni display con un delay di 1 secondo ottenendo il risultato sperato , poi ho provato leggerli in modo fisso. Per poter far questo ho pilotato ogni display con un delay di 5ms ma i segmenti A dei numeri [ 1 ] rimangono parzialmente accesi ,invece i segmenti dei numeri [ 7 ] sono accesi in modo regolare,vorrei capire il perché e dove sbaglio. Vi ringrazio in anticipo.
Guido

#define CLOCK_PIN 2         // pin 11  shift-register 74HC595
#define LATCH_PIN 3         // pin 12  shift-register 74HC595
#define DATA_PIN  4         // pin 14  shift-register 74HC595 
#define digit1    5         // alimento digit 1 migliaia
#define digit2    6         // alimento digit 2 centinaia
#define digit3    7         // alimento digit 3 decine
#define digit4    8         // alimento digit 4 unita
byte unita      = 7;        // carico il N° 7 nelle unita
byte decine     = 1;        // carico il N° 1 nelle decine
byte centinaia  = 7;        // carico il N° 7 nelle centinaia
byte migliaia   = 1;        // carico il N° 1 nelle migliaia
byte tabella[10] = {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};
//--------------------------------------------------------------------------------
void setup() {
  pinMode (digit1, OUTPUT);
  pinMode (digit2, OUTPUT);
  pinMode (digit3, OUTPUT);
  pinMode (digit4, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
  digitalWrite(CLOCK_PIN, LOW);
  digitalWrite (digit1, LOW);
  digitalWrite (digit2, LOW);
  digitalWrite (digit3, LOW);
  digitalWrite (digit4, LOW);
  unita     = 7;
  decine    = 1;
  centinaia = 7;
  migliaia  = 1;
}
//----------------------------------------------------------------------------------
void loop() {
  for (int i = 0; i < 4; i++) {

    switch (i) {
      case 0 :
        digitalWrite (digit4, LOW);
        digitalWrite (digit1, HIGH);
        digitalWrite(LATCH_PIN, LOW);
        shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, tabella[migliaia]);
        digitalWrite(LATCH_PIN, HIGH);
        break;
      case 1 :
        digitalWrite (digit1, LOW);
        digitalWrite (digit2, HIGH);
        digitalWrite(LATCH_PIN, LOW);
        shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, tabella[centinaia]);
        digitalWrite(LATCH_PIN, HIGH);
        break;
      case 2 :
        digitalWrite (digit2, LOW);
        digitalWrite (digit3, HIGH);
        digitalWrite(LATCH_PIN, LOW);
        shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, tabella[decine]);
        digitalWrite(LATCH_PIN, HIGH);
        break;
      case 3 :
        digitalWrite (digit3, LOW);
        digitalWrite (digit4, HIGH);
        digitalWrite(LATCH_PIN, LOW);
        shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, tabella[unita]);
        digitalWrite(LATCH_PIN, HIGH);
        break;
    }
    delay (5);
  }
}

devi "abbandonare" subito l idea di usare arduino per pilotare "DIRETTAMENTE" i 7 segmenti

ci va interposto il max 7219

cosi tieni "libera" la programmazione di arduino

altrimenti qualsiasi modifica/aggiunta che fai allo sketch devi sempre controllare che non disturba il pilotaggio display

Ciao elrospo
purtroppo non conosco max 7219, e se pilotassi ogni elemento con un transistor dedicato ? non cambia niente?
Guido

Stesso identico problema di: forum.arduino.cc/index.php?topic=457156.0

Grazie Claudio_F sempre preciso come sempre.
Guido

Guido_Laferrari:
Ciao elrospo
purtroppo non conosco max 7219, e se pilotassi ogni elemento con un transistor dedicato ? non cambia niente?
Guido

più o meno quasi tutti abbiamo fatto quello che stai facendo adesso,

arduino che pilota senza il max 7219 i 7 segmenti non tollera i delay piu di 5-10 millisecondi,

quindi significa che non puoi fare quasi niente con il driver usi solo 3 pin
piloti fino a 8 cifre puoi fare quello che vuoi
anche spegnere il display o variare l intensità luminosa

Concordo con @elrospo: fare multiplexing di display 7 segmenti "a mano" con Arduino è sicuramente didattico ed insegna parecchie cose, ma una volta fatto ti rendi anche conto che è una follia farlo in quel modo in un progetto più complesso.

Per quel che costa un 7219, poi... Però funziona solo con i display a catodo comune.

Ci sono comunque soluzioni alternative, cinesi ma che funzionano molto bene. Quello linkato a 72 cent spedito ha già pure il display!

Grazie a tutti per le tempestive risposte, vi chiedo gentilmente se avete delle dispense che tratta il driver in questione e qualche sketch come spunto per iniziare.
Buona serata a tutti
Guido