Timer 2 digit 7 seg, tempo ON leds troppo veloce

Salve a tutti,
sto provando a realizzare un semplice timer da 99 a 00 utilizzando 2x 7 segmenti display.

Ho trovato vari esempi e quello che piu si avvicina alla mia idea e' questo codice.
Pero' i segmenti restano accessi una frazione di secondo e non si vedono bene, mentre io vorrei che rimanessero sempre accesi scalando il numero. Penso che il problema sia nella libreria ma non trovo nessun valore da modificare per allungare i tempi di ON dei led:

//Library
#include "SevenSeg.h"

SevenSeg disp (10,9,8,7,6,11,12); //Defines the segments A-G: SevenSeg(A, B, C, D, E, F, G);
const int numOfDigits =2;       //number of 7 segments
int digitPins [numOfDigits]={3,4};  //CC(or CA) pins of segment

const int buzzer = 2; //buzzer - arduino pin 2

//Variables
int timer=40; //Count donw from e.g. 99
int flag;

void setup() {
  
  Serial.begin(9600);
  //Defines the number of digits to be "numOfDigits" and the digit pins to be the elements of the array "digitPins"
  disp.setDigitPins ( numOfDigits , digitPins );
  //Only for common cathode 7segments
  disp.setCommonCathode();
  //Control brightness (values 0-100);
  disp.setDutyCycle(100);
  
}

void loop(){
  //Counting down...
  if (timer!=0){
    timer--;
    disp.write(timer);
    delay(1000); // 1 sec. delay
  }
  else{
    disp.write("00");
    tone(buzzer,600); //play tone
    delay(1000);
    disp.write("");
    noTone(buzzer);
    delay(1000);
  }

}

lo schema e' molto semplice collegando i Pin da 10,9,8,7,6,11,12 ai 7 segmenti. pin 3 e 4 ai comune dei 2 display e il pin 2 al buzzer.

Qualche aiuto?
Grazie
Giovanni

Non ho mai usato la libreria sevenseg, da quanto leggo o si continua a fare il refresh "a mano", e quindi usare delay nel loop è vietato, o si usa un timer per attivare il refresh automatico sotto interrupt.

Questo dovrebbe mostrare il tempo correttamente:

......
unsigned long  tSec;

void setup() 
{
        ......
        timer = 40;
        tSec = millis();
}

void loop()
{
        if ((millis() - tSec) >= 1000)  // una volta al secondo
        {
                tSec += 1000;
                if (timer > 0) { timer--; }
        }

        disp.write(timer);  // aggiorna ad ogni giro
}

Nel timer per la magnetoterapia di Nuova Elettronica ho fatto così, pilotando i display senza alcuna libreria:
Timer con multiplexer

Claudio_FF:
Non ho mai usato la libreria sevenseg, da quanto leggo o si continua a fare il refresh "a mano", e quindi usare delay nel loop è vietato, o si usa un timer per attivare il refresh automatico sotto interrupt.

Questo dovrebbe mostrare il tempo correttamente:

......

unsigned long  tSec;

void setup()
{
        ......
        timer = 40;
        tSec = millis();
}

void loop()
{
        if ((millis() - tSec) >= 1000)  // una volta al secondo
        {
                tSec += 1000;
                if (timer > 0) { timer--; }
        }

disp.write(timer);  // aggiorna ad ogni giro
}

Grazie mille dell'aiuto, pero' modificando il codice come da tuo suggerimento, ora funziona solo la digit delle unita'. La visualizzazione e' perfetta, ma mancano le decine, che rimane sempre spento.

Nanni1972:
pero' modificando il codice come da tuo suggerimento, ora funziona solo la digit delle unita'

Mi sono limitato a rendere non bloccante il loop per vedere se il problema era quello, ma davo per scontato che la write facesse da sola quello che serve (multiplexare i digit). Se non è così tocca studiare per bene la libreria.

Claudio_FF:
Mi sono limitato a rendere non bloccante il loop per vedere se il problema era quello, ma davo per scontato che la write facesse da sola quello che serve (multiplexare i digit). Se non è così tocca studiare per bene la libreria.

IN effetti prima lo faceva. ho notato che se lascio la parte riguardante il buzzer cioe' questa:

 else{
    disp.write("00");
    tone(buzzer,600); //play tone
    delay(1000);
    disp.write("");
    noTone(buzzer);
    delay(1000);
  }

funzionano tutte e due le cifre, ma va velocissimo e non riesco a rallentare il countdown a 1 al secondo

Puoi anche valutare di fare il multiplex a mano senza usare la libreria... ogni 16ms cambi la cifra accesa e sei a posto (va da sè che anche in questo caso i delay sono vietati).

Infatti gli avevo suggerito il mio timer per la magnetoterapia, che può studiare per imparare come fare tutto senza usare una libreria. Le librerie a volte sono comode, ma:

  1. A volte hanno molti parametri, perciò studiare tutte le possibilità può essere più difficile che fare tutto da soli
  2. Usandole si perde un'occasione per imparare a realizzare ciò che la libreria fa.