Delay && SevSeg

Sto provando a giocare con un display 7 segmenti e la libreria SevSeg.

Le connessioni sono corrette: anodo comune con res su pin 12.
(dico che va bene, perche' incollando codice nel loop() non ho problemi)

Se visualizzo una singola cifra va bene:

sevseg.setNumber(2, 0); 
sevseg.refreshDisplay();

Se visualizzo due cifre , diciamo che "va bene" (potete immaginare l'output)

sevseg.setNumber(2, 0); 
sevseg.refreshDisplay();
sevseg.setNumber(3, 0); 
sevseg.refreshDisplay();

Se provo a introdurre un delay(), tra le due visualizzazioni, viene fuori un "casino" : vengono accesi singolarmente i led e non si capisce nulla.
Immagino che abbia a che fare con il fatto che delay() e' un codice "bloccante" e anche il developer, in un issue, dice "non usare delay", ma non riesco comunque a comprendere la problematica.

Inoltre: questa e' la libreria migliore ? Perche' nella doc viene dichiarato:"Shift registers and similar devices are NOT supported."

  1. come pensi che possiamo dire qualcosa se ci dai 6 righe di un codice che ha almeno un centinaio.
    tento comunque una soluzione:
  2. I display a 7 segmenti a piú cifre vengono normalmente pilotati in multiplexing. Accendendo gli segmenti delle diverse cifre per breve tempo. se interponi delle pause non hai una tale frequenza da vedere tutti i segmenti accesi.
    Ciao Uwe

Non conosco la libreria SevSeg, ma esaminando l'esempio più semplice si deduce che il multiplexing dei display è affidato alla funzione sevseg.refreshDisplay() che accende i segmenti di una cifra per volta.

È chiaramente evidenziato nell'esempio che la funzione deve essere richiamata AD OGNI CICLO DEL void loop(). Se tu ritardi l'esecuzione del loop() in qualunque modo (istruzione delay, o anche un loop() molto lungo) viene ritardato anche il refresh della cifra che in quel momento dovrebbe essere accesa.

Ripeto che le mie sono solo supposizioni, dal momento che non conosco e non uso quella libreria.

Ciao,
P.

uwefed:

  1. come pensi che possiamo dire qualcosa se ci dai 6 righe di un codice che ha almeno un centinaio.
    tento comunque una soluzione:

Veramente, il core dello sketch e' proprio 4 righe (ho dato per scontato il setup() e le varie dichiarazioni di variabli avendo affermato prima che tutto funziona con il codice esempio.

uwefed:
2) I display a 7 segmenti a piú cifre vengono normalmente pilotati in multiplexing. Accendendo gli segmenti delle diverse cifre per breve tempo. se interponi delle pause non hai una tale frequenza da vedere tutti i segmenti accesi.

Si, intuivo una cosa del genere: io parlavo di singola cifra ma, immagino, che essendo anch'essa formata da piu' led, il concetto non cambi!
Grazie.

pgiagno:
Non conosco la libreria SevSeg, ma esaminando l'esempio più semplice si deduce che il multiplexing dei display è affidato alla funzione sevseg.refreshDisplay() che accende i segmenti di una cifra per volta.
È chiaramente evidenziato nell'esempio che la funzione deve essere richiamata AD OGNI CICLO DEL void loop()...

Ok, infatti la chiamo dopo ogni setNumber() e, probabilmente, l'errore e' proprio qui!
Mi conviene fare le cose a manina, senza librerie e poi decidere piu' avanti se usarla o meno.
Grazie