Go Down

Topic: Secuencial leds que se apague cada minuto por 20 segundos (Read 332 times) previous topic - next topic

Thefla

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

surbyte

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á.


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().
Saludos, Kike_GL

Thefla

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:
Code: [Select]

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

Kike_GL

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

Thefla

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

Perrary

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)

Kike_GL

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

Code: [Select]

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
   }
}
Saludos, Kike_GL

surbyte

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.

Thefla

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:
Code: [Select]


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.

RIG

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

Thefla

@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.

RIG

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:
Quote
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:
Code: [Select]
//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(),
Code: [Select]
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á:
Code: [Select]
  #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

Thefla

#13
May 23, 2019, 07:33 am Last Edit: May 24, 2019, 05:11 pm by surbyte Reason: No repitas lo que se lee arriba.
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.



RIG

Hola,
Quote
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

Quote
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
Code: [Select]
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
Code: [Select]
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

Go Up