Display 7 segmenti 4 cifre

Salve a tutti. Ho in mente di progettare una sveglia con un display a 7 segmenti a 4 cifre (ne ho uno a catodo comune). Mi sono informato su internet e ho trovato la libreria SevSeg.h. Ho provato a fare un semplice test e funziona se nel "sevseg.setNumber()" scrivo un numero qualsiasi, ma se per esempio attraverso un ciclo for gli faccio scrivere la variabile che si incrementa con un certo delay, sul display che visualizza la cifra meno significativa visualizzo solo alcuni numeri, ma negli altri 3 display riesco a visualizzare tutti i numeri. E' come se al primo display non gli piacciano alcuni numeri e osservando meglio ho notato che inizia a contare da 1 e poi visualizzo 3, 7 e di nuovo 1.

Ciò che vedo è questo: 1, 3, 7, 11, 13, 17, 21, 23, 27, 31...

Non so se mi sono spiegato bene. Scusate il disturbo e grazie mille a chi sarà disponibile.

P.S. Ho controllato la seriale ed e riesco a vedere tutti i numeri (1,2,3,4,5,...) . Inoltre quando inizio a visualizzare, ad esempio il numero 32, mi si accende prima il 3 e poi il 2.

  for(int i=0;i<6000;i++){
    sevseg.setNumber(i);
    sevseg.refreshDisplay();
    Serial.println(i);
    delay(500);
  }

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ok grazie per l'avviso.

Ciao,
ti riferisci a questa libreria?
Se si, gli esempi forniti con la libreria funzionano correttamente?

In generale è sempre meglio:

  • fornire il riferimento corretto alla libreria utilizzata
  • fornire il codice completo del programma che non funziona (per verificare la corretta configurazione)
  • fornire uno schema dei collegamenti hardware (per verificare se ci sono errori di collegamento)

Solo così, chi conosce quel tipo di hardware, riesce a darti una mano.

Federico

i display 7 seg vogliono il suo driver max 7219 e simili,
i motivi sono:

  1. liberi risorse di arduino
  2. i display hanno luminosità uniforme
  3. regoli o spegni la luminosità via software

meglio imparare da subito a usare la libreria ledcontrol poi è tutto un divertimento

Salve e grazie per le risposte e consigli.

La libreria utilizzata è questa.

Ho seguito questo esempio

Seguendo l'esempio linkato (il primo riguardante il display a 4 cifre) con gli stessi collegamenti, funziona tutto perfettamente (il mio display è un 5461AS).

Ecco lo sketch completo

#include <SevSeg.h>
SevSeg sevseg; 
//unsigned long new_ms;
//int sec=1000;
//unsigned long old_ms=0;

void setup(){
  new_ms=millis();
  byte numDigits = 4; //Numero di cifre del display
  byte digitPins[] = {10, 11, 12, 13};//connessione pin display (d4,d3,d2,d1)
  byte segmentPins[] = {2,3,4,5,6,7,8,9}; //connessione segmenti (a,b,c,d,e,f,g,dp)
Serial.begin(9600);
  bool resistorsOnSegments = true; 
  bool updateWithDelaysIn = true;
  byte hardwareConfig = COMMON_CATHODE; 
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setBrightness(90);
}

void loop(){
  
  for(int i=0;i<6000;i++){
    sevseg.setNumber(i);
    sevseg.refreshDisplay();
    Serial.println(i);
    delay(500);
  }

}

P.S. Ho come driver un 74hc595, ma onestamente non ho capito molto come usarlo.

AnYmUs:
Salve e grazie per le risposte e consigli.

Purtroppo non ho quel modulo, (ne ho uno con driver interno), quindi non riesco a testarlo.

Nel codice non vedo errori, ma visto che noto una sequenza logica nei numeri che hai postato

1, 3, 7, 11, 13, 17, 21, 23, 27, 31, ...
1, +2, +4, +4, +2, +4, +4, +2, +4, +4, ...

non è che la delay non va accordo con quella libreria?

Prova cosi, ho eliminato la delay e usato millis per aggiornare ogni mezzo secondo:

#include <SevSeg.h>
SevSeg sevseg;

int counter = 0;
long last_refresh = 0;

void setup() {
  Serial.begin(9600);
  byte numDigits = 4; //Numero di cifre del display
  byte digitPins[] = {10, 11, 12, 13};//connessione pin display (d4,d3,d2,d1)
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; //connessione segmenti (a,b,c,d,e,f,g,dp)
  bool resistorsOnSegments = true;
  byte hardwareConfig = COMMON_CATHODE;
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setBrightness(90);
}

void loop() {
   long curr_refresh = millis();  
   if ((curr_refresh - last_refresh) >= 500) {
       sevseg.setNumber(counter);
       sevseg.refreshDisplay();
       Serial.println(counter);
       counter++;
       if (counter > 6000) {
           counter = 0;
       }
      last_refresh = curr_refresh;
  }
}

spero d'aver scritto correttamente :confused:

Federico

Federico66:
Purtroppo non ho quel modulo, (ne ho uno con driver interno), quindi non riesco a testarlo ....

Grazie per la risposta. Il problema riguardo al delay devo rileggere. Comunque ho provato il tuo sketch e mi da lo stesso problema (ma ho capito meglio l'utilizzo del millis), ciò che vedo è questo: 2,6, 0, 14, 18, 22, 26 poi salta al 20 e successivamente salta al 34... Continua con uno scarto di 4. Ho trovato su internet alcuni tutorial che dove utilizzano il 74HC595 con il tipo di display che ho io, proverò a cercare di capire come funziona l'integrato. Se poi vi viene in mente qualche suggerimento.

>AnYmUs: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia :wink:

Guglielmo

P.S.: ho troncato io il tuo QUOTE qua sopra.

AnYmUs:
Grazie per la risposta. Il problema riguardo al delay devo rileggere. Comunque ho provato il tuo sketch e mi da lo stesso problema (ma ho capito meglio l'utilizzo del millis), ciò che vedo è questo: 2,6, 0, 14, 18, 22, 26 poi salta al 20 e successivamente salta al 34... Continua con uno scarto di 4.

Mi spiace, ma a questo punto non so più come aiutarti :frowning:
se non altro, hai imparato uno degli usi della funzione millis() :slight_smile:

AnYmUs:
Ho trovato su internet alcuni tutorial che dove utilizzano il 74HC595 con il tipo di display che ho io, proverò a cercare di capire come funziona l'integrato.

Se vuoi approfondire l'uso dello Shift Register (es. 74HC595), ti consiglio questo articolo e poi quelli relativi a quello che credo sia il tuo display, questo e questo.

Personalmente li ho trovati molto utili, perchè non facendo uso di librerie, capisci veramente come funziona.

Federico

ciao, mi intrometto:

il 74HC595 è uno shift register

la libreria che usi comanda i pin direttamente e non attraverso uno shift register

quindi non ho capito come hai fatto lo schema, ti spiace postarlo, come ti è già stato chiesto?

Ducembarr:
quindi non ho capito come hai fatto lo schema, ti spiace postarlo, come ti è già stato chiesto?

Già fatto, post #5 :wink:

AnYmUs:
Ho seguito questo esempio
Seguendo l'esempio linkato (il primo riguardante il display a 4 cifre) con gli stessi collegamenti, funziona tutto perfettamente (il mio display è un 5461AS).

Federico

scusa, ma io non vedo ne uno schema (solo foto e grafiche) ne un 595 in quel link

quindi rinnovo la mia domanda all'autore:

che schema hai usato per collegare uno shift register ad un arduino non programmato per usare uno shift register?

Ducembarr:
scusa, ma io non vedo ne uno schema (solo foto e grafiche) ne un 595 in quel link
quindi rinnovo la mia domanda all'autore:
che schema hai usato per collegare uno shift register ad un arduino non programmato per usare uno shift register?

Scusa se insisto, ma lo schema c'è ed è questo

Non vedi un 595, perchè non lo sta usando, ma sta pensando di provarlo.

Federico

Federico66:
Scusa se insisto, ma lo schema c'è ed è questo

Fede, perdona, ma questa volta do ragione a Ducembarr ...
... sarà che io odio Fritzing :smiley: , ma quello anche per me NON è uno schema, quello è come montare e collegare le cose e, personalmente, se uno mi presenta una schema così, mi rifiuto di guardarlo ... uno "schema" è uno "schema" e ... Fritzing ha anche una funzione per produrlo :wink:

Guglielmo

P.S.: ... ti assicuro, senza alcuna polemica, in amiciza e con la massima stima :slight_smile:

insisti pure, non mi rompo, dato che so esattamente dove voglio arrivare, ma avrei preferito che rispondesse l'autore, perché il problema è suo

cosa ti garantisce che l'autore stia usando esattamente quello schema?

se fosse quello sarebbe sbagliato il programma, dato che non corrisponderebbero i segmenti con le uscite

se guardi il programma scritto in quella pagina infatti l'ordine dei pin nell'array dei segmenti non è quello che ha usato l'autore

forse, ma solo forse, essendo sbagliati i pin, le cifre escono tutte incasinate, il passo di 4 in 4 potrebbe essere una coincidenza, ma non si spiega perché il riporto delle decine sia ritardato

esiste una possibilità, ma spetta all'autore la verifica: sulla seriale i numeri escono correttamente (e questo la ha già controllato), ma anche con una cadenza superiore alla cadenza con la quale cambiano le cifre visualizzate?

comunque che l'autore si metta a posto tra piedini e connessioni, poi si vede

EDIT:
io sono meno "schizzinoso" di GPB01, una cosa come quella la leggo, ma se chiedo lo schema, voglio lo schema effettivamente utilizzato, non una rappresentazione grafica di cosa si doveva fare, se la differenza tra le due non è chiara non è un problema mio (e ritenetevi fortunati che oggi scrivo io e non SalvorHardin, che è molto più caustico di me su queste cose)

gpb01:
Fede, perdona, ma questa volta do ragione a Ducembarr ...

Non gioco ad aver ragione :slight_smile:

...ma per le mie conoscenze, e immagino quelle dell'op, Fritzing va benissimo, e avevo inteso che lui (Ducembarr ) proprio non l'avesse visto.

gpb01:
P.S.: ... ti assicuro, senza alcuna polemica, in amiciza e con la massima stima :slight_smile:

Figurati, sai bene che non vedo e non faccio polemica :wink:

Federico

Ducembarr:
insisti pure, non mi rompo, dato che so esattamente dove voglio arrivare, ma avrei preferito che rispondesse l'autore, perché il problema è suo
cosa ti garantisce che l'autore stia usando esattamente quello schema?

Hai ragione :frowning:
io mi sono fidato del fatto che avendo l'OP "ripetuto" schema (collegamenti) e programma dell'articolo, e avendo affermato che funziona, il problema non fosse li!

[OT]
Purtroppo la mia esperienza con Arduino (elettronica) è recente (al contrario del programmare), e quindi i miei limiti sono evidenti. Cerco di imparare anche cercando di aiutare, ma spesso non riesco a centrare quello che potrebbe essere il problema, specie se hardware, e non hai idea di quanto mi dia fastidio! :frowning:

Federico

io e mio fratello scriviamo da poco, ma leggiamo da un po'

se ti puo' consolare le "nostre" di cappelle sono nascoste dal semplice fatto che non le abbiamo scritte...

comunque non ti buttare giù, quando hai cominciato a scrivere qui "hai fatto il botto"

mi ricordo che Massimo mi ha detto, intorno a aprile: "qui c'è uno nuovo coi controfiocchi" e si riferiva a te

[OT]

Ducembarr:
comunque non ti buttare giù, quando hai cominciato a scrivere qui "hai fatto il botto"
mi ricordo che Massimo mi ha detto, intorno a aprile: "qui c'è uno nuovo coi controfiocchi" e si riferiva a te

uau, ma siete sicuri? ::slight_smile:
per curiosità, a cosa si riferiva in particolare?

Federico

PS
Forse però stiamo sporcando troppo il thread.