Secuencial leds que se apague cada minuto por 20 segundos

Bien, bien, tranquilo, no te lo dije para molestarte, si te dieras una vuelta por todos los post del foro verías que hay muchísimos que solo piden y no ponen nada de su parte, en pocas palabras quieren todo peladito y en la boca.
Bueno dejemos eso atras, hice 3 codigos para que veas algunas formas que se puede hacer.
En el primer código creo que me apresure un poco cuando dije:

así nunca funcionara,

ja, si funciono con delay()! aunque debo decirte, si vas comenzando lo primero que debes quitar de tu cabeza son los delay((), lo vamos a usar en este codigo solo para hacer la secuencia ya que si después quieres agregar un botón, un sensor, o lo que sea, ahora si, no va a funcionar adecuadamente, por lo que lo hice solo como ejemplo, repito olvida los delay:

 //USANDO PURO DELAY()
byte contador=0;

void setup() {
 
 pinMode(13, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 //Serial.begin(9600);
}

void loop() {
   
   
   while(contador<=120){     // esto equivale al minuto
    for(byte i=9; i<14; i++){     //esto equivale a la secuencia que tienes en tu codigo
    digitalWrite(i, HIGH);
    delay(50);                       
    digitalWrite(i, LOW);
    delay(50);
     }
   
   contador++; 
     }

   for(byte i=9; i<14; i++){ //apgamos todos los led durante los 20 segundos
   digitalWrite(i, LOW);
    }

   delay(20000);    //esperamos los 20 segundos
   contador=0;
}

Mira que cambie toda la secuencia que tenias con los led a un for () para evitar escribir tantas lineas

En el siguiente codigo, aplico el millis() de la forma mas sencilla para que te des una idea de como funciona, tampoco es un buen código ya que combina delay con millis(),

unsigned long tiempo, tiempo2;

void setup() { //DELAY() COMBINADO CON MILLIS()
   pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
 tiempo=millis();    //la variable tiempo se iguala a millis()
Serial.begin(9600);
}

void loop() {
 
   if(millis()-tiempo <= 60000UL){   //Se empieza a comparar millis menos tiempo y  ejecuta la secuencia durante un minuto
    
    Serial.println("estamos dentro del minuto");    
    for(byte i=9; i<14; i++){
        digitalWrite(i, HIGH);
        delay(50);                       
        digitalWrite(i, LOW);
        delay(50);
        Serial.println(String("led") + i);
    }
     tiempo2=millis();    // empieza el contador para los 20 segundos
 }

 else {
   
    Serial.println("salimos del minuto");
    for(byte i=9; i<14; i++){
        digitalWrite(i, LOW);	
    }
     if(millis()-tiempo2 >= 20000UL){     // cuando se cumplen los 20 segundos salimos de aqui y se repite la secuencia   
       tiempo=millis();
       Serial.println("salimos de los 20 segundos");
   }
}

}

Ahora en este ultimo código no hay ningun delay(), se hace uso de un arreglo y una funcion, es el mejor de los 3, así que si deseas agregar algún botón o cualquier otra cosa no debería haber ningún problema, aquí está:

  #define  EncendidoUnMinuto 1
  #define  Apagado20Segundos 2


  const byte leds[5]={9,10,11,12,13};    // asignamos todos los pines de los led en un arreglo
  byte contador=0;
  unsigned long tiempo;
  unsigned long unMinuto;
  unsigned long veinteSegundos;
  byte estado=EncendidoUnMinuto;
  byte suma=0;

  void setup() {

   pinMode(13, OUTPUT);
   pinMode(12, OUTPUT);
   pinMode(11, OUTPUT);
   pinMode(10, OUTPUT);
   pinMode(9, OUTPUT);
   Serial.begin(9600);
   unMinuto=millis();
 }

 void loop() {
  

   switch (estado) {    

    case EncendidoUnMinuto:
    secuencia();    // llamamos a la funcion de la secuencia de los led
    if(millis()-unMinuto >= 60000UL ){   //cuando se cumple un minuto salimos de la secuencia y esperamos los 20 segundos
      estado=Apagado20Segundos;
      veinteSegundos=millis();
      Serial.println("se cumplio un minuto");
    }

    break;

    case Apagado20Segundos:   // Esperamos 20 segundos con todo apagado

    for(int i=0; i<5; i++){
      digitalWrite(leds[i], LOW); apagamos todos los led
    }
    if(millis()-veinteSegundos>=20000UL){    // aqui se esperan los 20 segundos
     estado=EncendidoUnMinuto;
     Serial.println("se cumplieron los 20 seg");
     unMinuto=millis();
   }                            
   break;


  }            


}

//SECUENCIA DE LED
void secuencia(){    

  if(millis()-tiempo >= 50UL){    // Esto se repite cada 50 milisegundos
    digitalWrite(leds[contador], !digitalRead(leds[contador])); //Cambia el estado del led cada 50 milisegundos
    Serial.print(String("el pin de el led es el: ")+ leds[contador] + String(" y está: "));
    Serial.println(digitalRead(leds[contador]) ?"encendido" :"apagado");
    suma++;
    tiempo=millis();       
  }
  if(suma==2){  // esto es para que cambie de led cada dos ciclos del millis()
    contador++;
    suma=0;
  }

  if(contador==5)  // para que regrese al primer led
  contador=0;

}

Igual se puede mejorar, pero para ejemplos son mas que suficiente, pruebalos, los 3 deben funcionar, si quieres puedes quitar todos los serial.print(), solo los usé para probar el funcionamiento sin conectar los led, analizalos y pregunta lo que no tengas claro.
En conclusion los delay(), solo debes dejarlos para el blink o cuando realmente quieres que se detenga la ejecución de tu codigo
Saludos