Pages: [1]   Go Down
Author Topic: Mantener un pin HIGH solo una vez a una hora en concreto.  (Read 975 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
////////////////////////////////////////////////////////////
//
//   COMEDERO
//
//////////////////////////////////////////////////
void comedero()
   {
       if  (Reloj.GetHour() ==  (CFG.COMIDA_H) && (Reloj.GetMinute() == (CFG.COMIDA_M )));
           {
             SetRele( 4, PIN_D_COMIDA, HIGH );
             delay(3000);
           }
   }
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Chile
Offline Offline
Edison Member
*
Karma: 35
Posts: 1251
Arduino rocks?
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

My website: http://ried.cl

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 721
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
   }
« Last Edit: October 01, 2012, 10:06:58 pm by curro92 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:

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;

   }
Logged

Pages: [1]   Go Up
Jump to: