Secuencial leds que se apague cada minuto por 20 segundos

Saludos a toda la comunidad. Estoy empezando en Arduino y me piden una secuencial de 5 led que cada minuto se apaguen y en 20 segundos vuelva la secuencia y asi nuevamente el ciclo. La secuencial de los 5 leds casi lo tengo hecha en codigo, pero no se como hacer para que despues de un minuto secuenciando se apague por solo 20 segundos y vuelva el ciclo. Como seria el codigo para hacer eso o que comando me faltaria para hacer lo ultimo , Voy usar el Arduino Mega 2560 . Muchas gracias

Entiendo que seas nuevo, entiendo que para ti sea un proyecto pero todo foro tiene normas.
Las normas explican como conducirse por este foro y también donde postear.
Este no es el sitio para esta consulta.
El sitio correcto es Software.
Ahora moveré tu hilo y te pido que leas las : Normas del foro

Y estos son los dos hilos que debiste leer en esta sección que te guiarían para postear o no acá.

Luego en el IDE carga: Archivo > Ejemplos > 02.Digital > Blink Without Delay y juega un poco con el.

Tambien puedes estudiar sobre millis().

Kike_GL:
Luego en el IDE carga: Archivo > Ejemplos > 02.Digital > Blink Without Delay y juega un poco con el.

Tambien puedes estudiar sobre millis().

Abri el ejemplo y la verdad que no entendi casi nada de todo el codigo. El codigo para lo que quiero lo tengo en esta forma:

void setup() {

 pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
 digitalWrite(LED_BUILTIN, HIGH);   
 delay(1000);                       
 digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);

a esto le adicione lo mismo para 5 leds para asi tener la secuencial. Ahora lo que quiero es que esa secuencial se apague al minuto y por 20 segundos nada mas y vuelva a iniciarse nuevamente. Que lineas faltaria ahi.
Desde Ya Muchas gracias por su respuesta

Si te hubieras dado la molestia de revisar el enlace que te puse podrias haber probado los ejemplos.

Kike_GL:
Si te hubieras dado la molestia de revisar el enlace que te puse podrias haber probado los ejemplos.

Si revise el uso de ese comando pero no le atino ...ahi deje mi codigo como esta. Y las lineas que necesitaria . Gracias

Thefla, la función millis() de la que Kike te dijo de usar, lo que hace es devolverte la cantidad de mili segundos que transcurrieron desde que se inicializo el arduino. Si jugas con un par de variables igualandolas a millis(), podes buscar que la diferencia entre las dos variables sea igual a los 20 segundos que necesitas (en tu caso necesitarías que sea igual a 20000 milisegundos)

Tu código debe estar entre las lleves code asi:

unsigned long t13;
void setup(){
   pinMode(13, OUTPUT);
}
void loop(){
   if (millis() - t13 > 500){                    //Pregunta ya pasaron 500 ms
      digitalWrite(13, !digitalRead(13));  //Conmuta LED
      t13 = millis();                               //Toma el tiempo
   }
}

Van 3 códigos en los que posteas como si el mundo te importara NADA. Bueno ahora lee las normas del foro y cuando sepas como se debe postear, me envias un privado con un código usando etiquetas.
Mientras este hilo será bloqueado porque no respetas las normas del foro a pesar de las advertencias.

Las disculpas del caso. Busque sobre como usarlo milles en lo que quiero pero sin exito. Para resumir el tema en cuestion es que tengo una secuencial de 5 leds y quiero que esa secuencial se apague despues de 60 segundos por un lapso de 20 segundos y siga asi el proceso. Sera programado en Arduino Mega 2560 . Quisiera me ayudaran a que le falta agregar o la modificacion del codigo, que es este:

void setup() {
 
 pinMode(13, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
}

void loop() {
 digitalWrite(13, HIGH);   
 delay(50);                       
 digitalWrite(13, LOW);    
 delay(50); 
 
 digitalWrite(12, HIGH);   
 delay(50);                       
 digitalWrite(12, LOW);    
 delay(50);
 
 digitalWrite(11, HIGH);   
 delay(50);                       
 digitalWrite(11, LOW);    
 delay(50);

 digitalWrite(10, HIGH);   
 delay(50);                       
 digitalWrite(10, LOW);    
 delay(50);  

 digitalWrite(9, HIGH);   
 delay(50);                       
 digitalWrite(9, LOW);    
 delay(50); 
}

Muchas gracias por su atencion.

Thefla:
Si revise el uso de ese comando pero no le atino ...ahi deje mi código como esta. Y las lineas que necesitaría . Gracias

@Kike_GL te dijo que usaras millis() y el problema es que ni siquiera lo has intentado, en ninguno de los códigos que subiste veo esa función, si no que puros delay, así nunca funcionara, todo parece que lo único que quieres es hagan tu trabajo sin esforzarte, incluso ni siquiera trataste de incluir lo que lo que pides, no veo la pausa despues de 60 segundos ni la pausa de 20 solo veo la secuencia de leds...
Demuestra que has intentado usar la función millis() y sube el código y te aseguro que recibirás ayuda, por lo menos de mi parte

RIG:
@Kike_GL te dijo que usaras millis() y el problema es que ni siquiera lo has intentado, en ninguno de los códigos que subiste veo esa función, si no que puros delay, así nunca funcionara, todo parece que lo único que quieres es hagan tu trabajo sin esforzarte, incluso ni siquiera trataste de incluir lo que lo que pides, no veo la pausa despues de 60 segundos ni la pausa de 20 solo veo la secuencia de leds...
Demuestra que has intentado usar la función millis() y sube el código y te aseguro que recibirás ayuda, por lo menos de mi parte

Para empezar dije que recien estaba aprendiendo Arduino, osea soy un novato, a base de tutoriales y videos he logrado hacer la secuencial con el codigo, y asi como lo vez es logico que es una compilacion de un novato, a pesar de eso ya estoy casi por aplicarle el for para que no se vea tan novato ni largo el codigo pero estoy en eso...aun asi igual tendre mi secuencial faltando lo otro. Si bien Kike y Perrary me dieron y explicaron algo sobre millis y yo tratando de entender ese comando para aplicar a lo que yo quiero , estoy en la luna trataron de ayudarme en algo aun asi no logre captar ni porque me puse a leer lo que trataba el comando. Al menos talvez con ejemplos con datos que queria talvez hubieso entendido algo de millis. Los 60 y 20 segundos no los he puesto porque no se como, en donde y con que ponerlos y es la razon por la que estoy posteando. Ahora me dices que te demuestre que he intentado usar millis cuando en realidad no lo entiendo . No voy a poner el comando millis con cosas y cosas por poner. No voy a ser eso. Al menos con los datos me hubiesen podidos poner como va millis y entenderlo y asi con eso ya puedo jugar con ese tiempo. darle mas tiempo a la secuencia y que menos tiempo apagado. etc. Ahora e infringido algunas reglas he pagado por ellas con el Sr. Moderador y estoy siendo lo mas conciso con ellas, ahora que tu me digas que supones o creas que quiero que me hagan el trabajo sin que yo me esfuerze, creeme que estas equivocado. Lo tomare como un comentario sin un fin.
Gracias por la atencion.

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

Vaya creo que si al comienzo no entendia lo de millis aqui si lo llevaste a su maxima expresion y con varias variantes que ya hasta m duele la cabeza. Justo te iba decir vi un video donde ese serialbegin lo usaban si querian sacar el mensaje por pantalla ( o me equivoco). Y en el segundo codigo donde pones como variantes tiempo1 y tiempo2 y lo aplicas mas adelante se pone tal cual con el codigo o se pone un valor? Y antes de hacer mas preguntas lo bueno es que ya me diste ejemplo en que trabajar y tratar de entender no solo millis si no otras cosas. Las probare en el simulador y saber como funcionan. Desde ya muchas gracias. Alguna cosa que no entienda te lo hare saber.

Hola,

serialbegin lo usaban si querian sacar el mensaje por pantalla

El serial.begin() es para iniciar la comunicación serial, y el Serial.print() es para imprimir en pantalla, y te sirve para enviar mensajes al monitor o como en este caso para saber que esta sucediendo a cada momento en el programa

en el segundo codigo donde pones como variantes tiempo1 y tiempo2 y lo aplicas mas adelante se pone tal cual con el codigo o se pone un valor?

las variables tiempo y tiempo 2, (puedes ponerles el nombre que desees), se usan para almacenar el valor de millis(), es decir, diciéndolo de alguna manera, tomas una captura del valor de millis(), y de ahí empiezas a comparar con el tiempo transcurrido.
Por ejemplo,en el caso del segundo codigo, enciendes el arduino y millis() empieza a contar, y si te fijas dentro del setup puse una inea que dice tiempo=millis(); justo ahi se captura el valor de millis(), y después en el loop se hace la comparación en la linea que dice if (millis()- tiempo <= 60000) poniendolo en castellano dice, si millis menos tiempo es menor o igual a 60000, ejecutas la secuencia, por lo tanto todo lo que esté dentro de ese if, se ejecutara hasta que el resultado de la resta de un valor mayor a 60 mil milisegundos
Saludos y sigo al pendiente

Thefla que es millis(), es un cronometro que da valores en milisegundos que arranca cuando el arduino se energiza.
Asi que imagina que alimentas tu Arduino y este cronometro empieza de 0 milisegundos en adelante.

Ahora supon que pasaron 3.5 segundos o sea 3500 mseg.. si tomaras el valor de millis() en ese momento la variable que siemper debe ser del tipo unsigned long diría 3500.

Ahora vamos a pensar que algo que debes controlar debe hacerlo 1 seguno o 1000 milisegundos despúes. Entonces cuando llegues a 4500 tu vas a resolver eso cómo?

previamente una variable que llamaré inicio se cargó con milis() y dijimos que tomó el valor de 3500.

algo asi en código

unsigned long inicio; // no hace falta poner a 0 porque luego le asignaremos millis();

en tu setup() luego de hacer lo que debes pones.

void setup() {
  Serial.begin(9600);
  Serial.println("Inicio programa con millis(), muestro cada 1000 mseg");
  inicio = millis();   // supongamos que el valor que toma inicio es el que te dije 3500
}

ahora en el loop queremos que cada 1 seg o 1000 mseg coloquemos un cartel que diga algo

void loop() {
    if (millis() - inicio >= 1000) {
         Serial.print("han pasado : ");
         Serial.println(inicio)
         inicio = millis();    // vuelvo a cargar inicio con millis() 
    }
}

Deberías tener una salida tal que cada 1000 mseg obtengas impresiones espaciadas por este valor.