Go Down

Topic: Mantener un pin HIGH solo una vez a una hora en concreto. (Read 1 time) previous topic - next topic

Anakinspain

Estoy aprendiendo a programar un arduino MEGA, el caso es que quiero que, a una hora determinada un pin este HIGH durante un tiempo y luego vuelva a LOW.

El condicional que uso es, que si es la misma hora y minuto, este HIGH, pero claro, cuendo continua el bucle y vuelve a esa linea, la hora y minuto sigue coincidiendo y vuelve a hacer lo mismo. Cuando lo que quiero es que ya no lo haga hasta el dia siguiente.
Como lo hago?

Code: [Select]
////////////////////////////////////////////////////////////
//
//   COMEDERO
//
//////////////////////////////////////////////////
void comedero()
   {
       if  (Reloj.GetHour() ==  (CFG.COMIDA_H) && (Reloj.GetMinute() == (CFG.COMIDA_M )));
           {
             SetRele( 4, PIN_D_COMIDA, HIGH );
             delay(3000);
           }
   }

Cheyenne

Lo que quieres es que se produzca una acción (pin a HIGH, tiempo predeterminado, pin a LOW) cuando se produce un evento (la hora prefijada). Pero no quieres que se produzca mientras se cumple la condición si no sólo en el instante en el que se cumple. Pues esto es lo que se denomina ejecutar una acción en un flanco ascendente. Para ello crea una variable que en este caso valdrá 0 ó 1. También se puede establecer tipo boolean con true o false, es lo mismo. Esta variable suele llamarse una bandera.

Partimos de que la bandera está a cero.
Si se produce tu evento (coincidencia de la hora) y la bandera es cero entonces ejecutas la acción (activar el PIN el tiempo que quieras) y pones la bandera a 1.
Si la bandera está a 1 y termina tu evento (no coincide la hora) entonces pones la bandera a 0.

La explicación es casi el código que tienes que hacer narrado. A ver si te sale, si no pones lo que avances y te lo depuro.
http://cuadricopterodiyarduino.blogspot.com/

eried

Si colocas delay(60000); en vez de 3000 sólo se activará 1 vez, o si pones Reloj.GetSecond( como parte de la condición
My website: http://ried.cl

curro92

#3
Oct 02, 2012, 05:03 am Last Edit: Oct 02, 2012, 05:06 am by curro92 Reason: 1
Hola,
Si cierras con punto y coma la sentencia if(), la estás anulando.

Si después del delay ya no coinciden los minutos, solo tienes que controlar la hora
Yo probaría algo así:

Code: [Select]

int hancomido = 0;

void comedero()
  {
      if  (Reloj.GetHour() ==  CFG.COMIDA_H && Reloj.GetMinute() == CFG.COMIDA_M  && hancomido == 0)
      {
            SetRele( 4, PIN_D_COMIDA, HIGH );
            delay(3000);
            hancomido = 1;
      }
      else
           hancomido = 0;
  }


Anakinspain


Hola,
Si cierras con punto y coma la sentencia if(), la estás anulando.

Si después del delay ya no coinciden los minutos, solo tienes que controlar la hora
Yo probaría algo así:

Code: [Select]

int hancomido = 0;

void comedero()
  {
      if  (Reloj.GetHour() ==  CFG.COMIDA_H && Reloj.GetMinute() == CFG.COMIDA_M  && hancomido == 0)
      {
            SetRele( 4, PIN_D_COMIDA, HIGH );
            delay(3000);
            hancomido = 1;
      }
      else
           hancomido = 0;
  }




Gracias, pero creo que hay un error. Ya que siempre que sea la hora estara dando de comer, un bucle si, otro no, y asi.

Creo que habira que hcaer como dijo Cheyenne:

Code: [Select]


boolean hancomido = false;

////////////////////////////////////////////////////////////
//
//   COMEDERO
//
//////////////////////////////////////////////////
void comedero()
   {
       if  (Reloj.GetHour() ==  (CFG.COMIDA_H) && (Reloj.GetMinute() == (CFG.COMIDA_M )) && !=hancomido );
           {
             SetRele( 4, PIN_D_COMIDA, HIGH );
             delay(3000);
             SetRele( 4, PIN_D_COMIDA, LOW );
             hancomido = true;
           }
      if  Reloj.GetHour() !=  (CFG.COMIDA_H) && (Reloj.GetMinute() != (CFG.COMIDA_M )) hancomido= false;

   }

Go Up