Implementar funcion en una cuenta atras...

Pues eso..tengo un proyecto en arduino mega el cual es un temporizador con cuenta atras...pero no se como poder ponerle a cada cierto tiempo una funcion distinta..por ejemplo cuando falten 3 minutos que los leds conectados cambien de color (se enciendan leds de distinto color) y que a falta de 1 minuto haga lo mismo von otro color y active un motor??se podria hacer??

Hola yeyo_gato.

Tienes dos lineas de trabajo:

  • Poner temporizacion escalonada, es decir pongo el temporizador a: (T - 3min), y cuando temporice, hago la maniobra de los leds y coloco otra vez el temporizador a 1 min, nuevamente cuando temporice cambio los leds y activo el motor.

  • Supervisar el temporizador y cuando llegue al valor (T - 3min) ejecuto la fase 1, y cuando llegue al valor (T -1min) ejecuto la fase 2.

Evidentemente si yo tuviese que elegir entre ambas elegiria la primera, porque la segunda obliga a estar supervisando constantemente el temporizador.

La implementacion del código se haría con la función millis(), comparando milisegundos actuales con milisegundos buscados.
Si posteas un código, podremos comentarlo

Si pones tu codigo es mas facil ayudarte. Dices que tienes un temporizador con cuenta atras, ¿Lo tienes hecho o es solo una idea?

Yo por ejemplo un temporizador cuenta atras lo haria asi: Al principio cargo en una variable el valor del comienzo de la cuenta atras en milisegundos que quiera...

inicio=600000 (10 minutos, 600 segundos, 600000 milisegundos)

Luego en el loop modifico una variable de esta manera:

cuentaatras=inicio-millis

De esta manera ya tendre el temporizador cuenta atras que quieres.

Luego solo hace falta que te preguntes si es menor al tiempo que tu quieres. Por ejemplo si cuentraatras es menor que 180000 milisegudos (3 minutos). Si lo es tendras que hacer ahi lo que quieras para ese momento.

Tambien le agregaria una variable boolean para que se haga esa pregunta solo hasta que la respuesta se positiva, de lo contrario la seguiria repitiendo constantemente puesto que la cuenta atras a a partir de ese momento siempre sera menor que los 3 minutos en este caso.

Por ejemplo:

long inicio=600000;
boolean bandera=true;

void setup {
}

void loop { 
     cuentaatras=inicio-millis;
     if (bandera==true){
           if (cuentaatras<180000){
               LO QUE QUIERAS HACER;
               bandera=false
          }
     }
}

@cas6678

Tu código:

long inicio=600000;
boolean bandera=true;

void setup {
}

void loop {
     cuentaatras=inicio-millis;
     if (bandera==true){
           if (cuentaatras<180000){
               LO QUE QUIERAS HACER;
               bandera=false
          }
     }
}

Este código NO funciona. Te explico

  • millis es una función: millis() y no una variable (por cierto no está definida)
  • cuentaatras no va a tomar correctamente el tiempo porque el valor inicio que deberias declarar como unsigned long es menor que millis().
    Esta es una pequeña rectificacion de tu ejemplo (no la que yo haría):
#define tres_minutos  180000UL   // Tres minutos en milisegundos
#define inicio 600000UL          // Esto ahorra 4 bytes de SRAM
//long inicio=600000;              // ¿ para que gastar memoria ?
boolean bandera=true;

void setup {
}

void loop {
{
	if(((millis()-inicio) <= tres_minutos) && (bandera))
	{
		// aqui lo que quieras hacer
		bandera=false;
    }
}

Creo que no es bueno entrar a contestar sin ver primero el código de quien pregunta, y sin cerciorarse de la validez del código propio.
Se trata de ayudar y enseñar, no de confunir.

En cuanto llegue a casa pongo el codigo...
Y si lo tengo hecho y actualmente funcionando...tengo que aclarar que es una cuenta atras pero la cual yo le meto el tiempo que quiera a traves del matrix 4x4.
Supongo que sera igual a una cuenta atras de tiempo x..

A ver @Alfaville no es la primera vez que tengo un cruce contigo asi que ya me estas tocando un poco la moral * (edicion solicitada). Esta mañana comence a contestar a un hilo que no tenia respuesta. Al querer enviar el sistema me aviso que durante mi redaccion habia una respuesta, la tuya, la lei y a pesar de tener mi opinion (que es que pretendes ser interesante pero me da la sensacion que lo que has dicho es de poca utilidad para el que comienza de cero) SIN HACER NINGUN COMENTARIO A TU RESPUESTA publique la mia.

Este código NO funciona. Te explico

El codigo lo hice sin probar, directamente sobre el editor del foro, y lo puse asi para evitar que alguien me pusiese que debia poner tag. Me importa poco el codigo, lo que quiero transmitir es la idea, si tu quieres MI IDEA, que es lo que entiendo le puede ayudar a quien pregunto, no a ti.

Te agradeceria que no me explicaras nada porque no me es necesario, ni te lo pedi ni lo quiero.

  • millis es una función: millis() y no una variable (por cierto no está definida)

Quien ha dicho que millis sea una variable? Para que me explicas algo que nadie te ha pedido y encima mal? No esta definida? Que quieres definir? Millis? Me parece que tienes un problema.

  • cuentaatras no va a tomar correctamente el tiempo porque el valor inicio que deberias declarar como unsigned long es menor que millis().

Bienvenido nuevamente a la semana del unsigned con el mismo cliente estrella!!!. Repito que mi intencion, te guste o no, es intentar explicar lo que YO HARIA. Si meto mas conceptos a mi entender desvirtuo lo que quiero explicar. El concepto de lo que quiero explicar es el mismo con UNSIGNED LONG o LONG y por eso pongo LONG.

cuentaatras no va a tomar correctamente el valor porque el valor de inicio es menor que millis? A ver en que parte me perdi. Si inicio vale 600000 y millis empezara desde 0 en forma ascendente, siendo cuentaatras = inicio-millis, cuentaatras no empezar a descender desde 600000 al mismo tiempo que millis aumenta???

Esta es una pequeña rectificacion de tu ejemplo (no la que yo haría):

Nadie te ha pedido que rectifiques mi ejemplo, y menos si no lo harias. Lucete y muestra lo que harias tu solito que hasta ahora no lo has hecho sino solo intentar enmerdar lo de los demas.

Fantastico has puesto las dos condiciones en un solo IF usando &&. Te agradezco mucho, yo no sabia hacerlo hasta que te lo vi, o quizas piense y siga pensando que de la manera en que lo he puesto, muestro sin tocarle los "huesos" a nadie a traves de aplicar los TAB y los diferentes IF el CONCEPTO de lo que hago. Se que tu lo haras mejor, adelante, hazlo.

Y sobre los comentarios sobre mi codigo del tipo, "para que gastar memoria", creo que sobran. Si tienes capacidad demuestrala y crea, no vayas modificando las cosas de los demas que han tenido el detalle de hacer lo que tu no haces.

Creo que no es bueno entrar a contestar sin ver primero el código de quien pregunta, y sin cerciorarse de la validez del código propio.
Se trata de ayudar y enseñar, no de confunir.

Deja que la gente opine sobre si determinada respuesta les ha ayudado, enseñado o los ha confundido, preferiria ese feedback a tu opinion.

Hay un boton de karma con el que la gente puede valorar libremente. Aprovecho para decirte que teniendo el triple de mensajes que yo tienes el mismo karma. Sacas alguna conclusion?

Creo que los moderadores deberian llamar la atencion sobre estas actuaciones. Desgastan innecesariamente no solo a los que pueden hacer algo si no a la mayoria de personas que leen. Un foro que podria ser util se convierte en cansino porque se llena mas que con sabiduria con gente que quiere parecer sabia.

@Alfaville, no te pienso contestar mas, asi que hazme el favor de ignorarme en tus respuestas.

Te ignoro

os pongo el codigo de mi proyecto. si quereis saber de que es decirlo y os lo explico...

void search(){
 cls();
 digitalWrite(REDLED, LOW); 
 digitalWrite(GREENLED, LOW);   
 //SETUP INITIAL TIME 
 int minutos = GAMEMINUTES-1;
 unsigned long iTime=millis(); //  initialTime in millisec 
 unsigned long aTime;
 //var='o';

 //Starting Game Code
 while(1){  // this is the important code, is a little messy but works good.

   //If you fail disarm. 
   if(endGame){
     endSplash();
   }

   //Code for led blinking
   timeCalcVar=(millis()- iTime)%1000;
   if(timeCalcVar >= 0 && timeCalcVar <= 50)
   {
     digitalWrite(GREENLED, HIGH);  
   }
   if(timeCalcVar >= 90 && timeCalcVar <= 130)
   {    
     digitalWrite(GREENLED, LOW);  
   }

   lcd.setCursor(3,0);
   lcd.print(TIEMPO_DE_JUEGO);
   aTime=millis()- iTime;
   lcd.setCursor(3,1);

   //PRINT TIME ON LCD

   printTime(minutos, aTime);

   //###########################CHECKINGS##################

   //Check If Game End
   if(minutos-aTime/60000==0 && 59-((aTime/1000)%60)==0)
   {
     endSplash();
   }
   //Serial.println(keypad.getKey());
   //USED IN PASSWORD GAME 
   if('d' == keypad.getKey() && passwordEnable){
     lcd.clear();
     lcd.setCursor(2, 0);
     lcd.print(ACTIVANDO_ZONA_1);
     delay(1000);//a little delay to think in the password
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print(INTRODUCIR_CODIGO);

     setCodeTime();// we need to set the comparation variable first it writes on enteredText[]

     //then compare :D

     if(comparePassword()){
       destroy();
     }        
     lcd.clear();
     lcd.setCursor(3,0);
     lcd.print(CODIGO_ERRONEO);
     if(soundEnable)tone(tonepin,errorTone,200);
     delay(500);
     cls();
   }
   //Check If Is Activating
   while(defuseando && !passwordEnable)
   {
     digitalWrite(GREENLED, LOW);
     lcd.clear();
     lcd.setCursor(2,0);
     lcd.print(ACTIVANDO_ZONA);
     lcd.setCursor(0,1);
     unsigned int percent=0;
     unsigned long xTime=millis(); //start disabling time
     while(defuseando)
     {
       keypad.getKey();
       timeCalcVar = (millis()- xTime)%1000;

       if( timeCalcVar >= 0 && timeCalcVar <= 40)
       {
         digitalWrite(REDLED, HIGH);  
         if(soundEnable)tone(tonepin,tonoAlarma1,200);
       }
       if(timeCalcVar >= 480 && timeCalcVar <= 520)
       {
         if(soundEnable)tone(tonepin,tonoAlarma2,200);
         digitalWrite(REDLED, LOW);
       }

       unsigned long seconds= millis() - xTime;
       percent = (seconds)/(ACTIVATESECONDS*10);
       drawPorcent(percent);

       if(percent >= 100)
       {
         digitalWrite(GREENLED, LOW);
         destroy();// jump to the next gamemode
       }
     }
     cls();
     digitalWrite(REDLED, LOW);  

   }
 }
}

void destroy(){
 lcd.clear();
 lcd.setCursor(3,0);
 lcd.print(activando modo);
 delay(1000);
 int minutos=BOMBMINUTES-1;
 unsigned long iTime=millis();
 unsigned long aTime;
 int largoTono = 50;

 //MAIN LOOP
 while(1){

   //If you fail disarm. 
   if(endGame){
     explodeSplash();
   }

   //Led Blink

   timeCalcVar=(millis()- iTime)%1000;
   if(timeCalcVar >= 0 && timeCalcVar <= 40)
   {
     digitalWrite(REDLED, HIGH);  
     if(soundEnable)tone(tonepin,tonoActivada,largoTono);
   }
   if(timeCalcVar >= 180 && timeCalcVar <= 220){
     digitalWrite(REDLED, LOW);  
   }
   //Sound 
   aTime= millis()- iTime;
   timeCalcVar=(millis()- iTime)%1000;
   if(timeCalcVar >= 245 && timeCalcVar <= 255 && minutos-aTime/60000<2 && soundEnable)tone(tonepin,tonoActivada,largoTono);
   if(timeCalcVar >= 495 && timeCalcVar <= 510 && minutos-aTime/60000<4 && soundEnable)tone(tonepin,tonoActivada,largoTono);
   if(timeCalcVar >= 745 && timeCalcVar <= 760 && minutos-aTime/60000<2 && soundEnable)tone(tonepin,tonoActivada,largoTono);
   if( minutos-aTime/60000==0 && 59-((aTime/1000)%60) < 10)largoTono = 300;

   lcd.setCursor(1,0);
   lcd.print(FIN DE JUEGO_EN);
   //Passed Time

   lcd.setCursor(3,1);

   ////////HERE ARE THE TWO OPTIONS THAT ENDS THE GAME///////////

   if(minutos-aTime/60000==0 && 59-((aTime/1000)%60)==0)// Check if game ends
   {
     explodeSplash();
   }
   //print time

   printTime(minutos, aTime);

   //// SECOND OPTION: YOU PRESS DISARMING BUTTON  

   //IF IS A PASSWORD GAME 

   if('d' == keypad.getKey() && passwordEnable){

     lcd.clear();
     lcd.setCursor(1,0);
     lcd.print(DESACTIVANDO_BASE);
     delay(1000);//a little delay to think in the password

     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(INTRODUCIR_CODIGO);

     setCodeTime();// we need to set the compare variable first

     //then compare :D

     if(comparePassword()){
       disarmedSplash();
     }        
     lcd.clear();
     lcd.setCursor(3,0);
     lcd.print(CODIGO_ERRONEO);
     if(soundEnable)tone(tonepin,errorTone,200);
     delay(500);
     cls();
   }

   if(defuseando && !passwordEnable)// disarming bomb
   {
     lcd.clear();
     digitalWrite(REDLED, LOW);  
     lcd.setCursor(3,0);
     lcd.print(BASE EQUIPO 2 DESACTIVADA);
     lcd.setCursor(0,1);
     unsigned int percent=0;
     unsigned long xTime=millis();
     while(defuseando)
     {
       keypad.getKey();
       //check if game time runs out during the disabling
       aTime= millis()- iTime;
       if((minutos-aTime/60000==0 && 59-((aTime/1000)%60)==0) || minutos-aTime/60000>4000000000){ 
         endGame = true;
       }
       timeCalcVar=(millis()- xTime)%1000;
       if(timeCalcVar>= 0 && timeCalcVar <= 20)
       {
         digitalWrite(GREENLED, HIGH);  
         if(soundEnable)tone(tonepin,tonoAlarma1,200);
       }
       if(timeCalcVar >= 480 && timeCalcVar <= 500)
       {
         if(soundEnable)tone(tonepin,tonoAlarma2,200);
         digitalWrite(GREENLED, LOW);  
       }
       unsigned long seconds=(millis()- xTime);
       percent= seconds/(ACTIVATESECONDS*10);
       drawPorcent(percent);  

       //BOMB DISARMED GAME OVER
       if(percent >= 100)
       {
         disarmedSplash();   
       }
     }
     digitalWrite(REDLED, LOW); 
     digitalWrite(GREENLED, LOW);
     cls();
   }
 }
}

void endSplash(){
 lcd.clear();
 while(1){
   lcd.print(FIN_DE_JUEGO);
   lcd.setCursor(0,1);
   lcd.print(EQUIPO 1 GANA);  

   for(int i = 1000; i>200; i--){
     if(soundEnable)tone(tonepin,i);
     delay(5);
   }
   noTone(tonepin);
   delay(5000);
   cls();
   menuPrincipal();
 } 

}

Les voy a pedir a ambos (Alfaville y cas6678) que mantengan la calma.

Este es solo un trozo de código ¿ no ?.

Comenta pues cual es su función.

es un modo de juego....
yo practico airsoft.. y este es un modo en el cual podemos desactivar al enemigo para que no salgan de su base al igual que ellos a nosotros...
lleva su cuenta atras y su codigo y gana el que al finalizar el tiempo tenga abierta su base. ese solo es el codigo de ese modo de juego que es el cual le quiero implementar eso tanto el cambio de color como el motor al finalizar el tiempo

Bueno hay dos buenas explicaciones yeyo_gato que te deberían orientar perfectamente para resolver tu problema.

Llevo semanas liado y no doy con la tecla....la cuestion es que los codigos de ejemplo que me han pasado serian para el caso de hacer un temporizador desde 0.. Pero en mi caso ya tengo el programa solo que en ese programa el cual esta arriba, modificarlo y meterle esas dos funciones...

Tu quieres que el código de cuenta atras funcione en esa parte de código que has posteado solamente?
Porque no pones todo el código, si supera 9k caracteres, adjúntalo porque ya veo que solo la rutina search es bastante larga.

La cosa es que el codigo que puse mas arriba tiene la cuenta atras...me lo he releido 40 mil veces y no termino de ver donde colocarlo o como ....no quiero que me hagan el codigo ni nada de eso...solo el consejo de como ponerlo y donde.....lo demas lo quiero hacer yo asi aprendo...

Bueno pero dime como hago yo para probar tu código si me faltan todas las variables involucradas en void search()?

En el foro hay 2 o 3 categorías de respondedores.. si existe o se me permite el termino.

  1. los analistas des sistemas y/o programadores que estudiaron todos los lenguajes y pueden visualizar las cosas en forma mas abstracta.
  2. ingenieros y/o técnicos (aca caigo yo) que necesitamos (hablo por mi) manejar todo y muchas veces resolvemos las cosas por fuerza bruta a fuerza de prueba/error y de ahi mi pedido.
  3. entusiastas que actuan como 1 o 2 porque los hay muy inteligentes y muy nuevos.

Si quieres la ayuda de gente de categoría 2.. publica o adjunta todo el código.
Sino paso.

Ok..perdon si te momesto el comentario o algo..
Subire todo el codigo.. No lo subi entero puesto que hay 3 modos de juego y el que necesitaba esa funcion es el que ya coloque..
Aun asi lo subire todo..
Y mis disculpas si algo te molesto

No. No me molestó pero cuando algo lleva mas de 10 post y veo que el tema no luce que se vaya a resolver, hay que tomar otra acción, no te parece?
Mi comentario tiene que ver por como hago yo para resolver determinadas cosas. Algunas si no las veo no puedo resolverlas, aunque no entienda todo el programa tal vez pueda simularlo y resolver la rutina que a ti te interesa.
Sin el código no puedo hacerlo.