Array di numeri con ciclo for che vengono stampanti ogni secondo con millis

Salve a tutti.
Prima di procedere all'apertura di questo topic, ho provato a cercare un po' di soluzioni nel forum, dato che è uno degli argomenti sul quale molti hanno perplessità, ma non ho trovato nulla di ciò che mi interessava nello specifico. Si tratta dell'uso di millis() ma in questo caso per stampare, ogni secondo, delle cifre contenute in un array e che vengono richiamate con un ciclo for.
Come potete notare nel codice sotto, attraverso un while, limito il loop della stampa nel seriale a sole 2 volte (int numerogiri).
Ciò che stavo provando a fare è stampare ogni singolo numero dell'array ogni secondo (quindi un numero ogni secondo e non tutti assieme in un secondo), però in questo caso con il delay. Ecco il codice:

int numeri[]={5,6,9,7,3,1};
int flag = 0;
int numerigiri = 2;

void setup(){
 Serial.begin(9600);

}

void loop(){
  
  while(flag < numerigiri){    
   for (int i = 0; i < 6; i++){
   Serial.println(numeri[i]);
   delay(1000);
   } flag++;
  } 
}

Il problema che è ormai noto a tutti è che il delay è bloccante, e quindi ho cercato di ovviare al problema utilizzando millis(), in questo modo:

int numeri[]={5,6,9,7,3,1};
int flag = 0;
int numerigiri = 2;


void setup(){
 Serial.begin(9600);
}

void loop(){ 
    
  while(flag < numerigiri){
    if (timer()){
    for (int i = 0; i < 6; i++){
   Serial.print(numeri[i]);
     } flag++;
    }
   } 
  }


int timer(){ 
  static long t, dt;
  int ret = 0; 
  dt = millis() - t;
  if(dt >= 1000){
    t = millis();
    ret =1;
  }
   return ret;
}
  


Il problema in questo caso è che, la stampa dei numeri avviene sì ogni secondo (o quasi data l'imprecisione temporale di millis), ma ovviamente così facendo mi vengono stampate tutte le cifre (5,6,9,7,3,1) in un colpo, mentre a me interessa che venga stampata una cifra singola per ogni secondo.

Ho provato ad inserire, la variabile int timer(), o meglio la condizione if che richiama la variabile timer anzichè fuori dal for, nel suo annidamento, subito prima di Serial.print(numeri[i]); ma ovviamente non funziona.

Quindi in sintesi, come potrei utilizzare millis in questo per far sì che venga stampato nel seriale un numero per volta ad intervallo di un secondo per ogni numero?
Grazie in anticipo.

Ciao, non vedo come usare la struttura "for" per fare quello che vuoi.
La prima cosa che mi viene in mente è la seguente:

int numeri[] = {5, 6, 9, 7, 3, 1};
int flag = 0;
unsigned long t, dt;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (flag < 6) {
    dt = millis() - t;
    if (dt >= 1000) {
      t = millis();
      Serial.print(numeri[flag]);
      flag++;
    }
  }
}

Ma sono sicuro che ce ne sono altri.
saluti.

Se non ho capito male lui vuole eseguire quel ciclo di print solo 2 volte (int numerigiri = 2;)

Questa è una delle tante possibili implementazioni:

int numeri[]={5,6,9,7,3,1};
int flag = 0;
int numerigiri = 2*(sizeof(numeri)/sizeof(int));

void setup(){
 Serial.begin(9600);
}

void loop() {
  static uint32_t printTime;
  if(millis() - printTime > 1000 && numerigiri) {
    numerigiri--;
    printTime = millis();
    Serial.println(numeri[flag]);
    flag = (++flag) % (sizeof(numeri)/sizeof(int));
  }
}

Se il tuo codice è più appropriato, ho dimenticato che doveva essere ripetuto un certo numero di volte. Ma non sarebbe più appropriato definire nel vostro codice printTime come static uint64_t equivalente al più conveniente unsigned long per operare con millis ()?
Saluti.

Grazie mille @cotestatnt , era proprio quello che cercavo.

Grazie anche @gonpezzi , anche la tua soluzione è valida solo che per integrare il numero specifico di cicli, si deve aggiungere un'altra condizione.