Pages: [1] 2   Go Down
Author Topic: encender rele segun tiempo  (Read 3666 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

hola! Para mi proyecto necesito encender y mantener encendido un rele por el tiempo establecido y se me ocurre lo siguiente,
tiempo = 12;
 if (hour == hora && minute == minute && second == segundo){     
                       
                 digitalWrite(relayPin, HIGH);
                 delay(tiempo);
                 Serial.println("encendio");
              }
            digitalWrite(relayPin, LOW);
            Serial.println("apago");

Como lo veis?
Gracias
Logged


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

Con eso debería funcionar.

El único problema que se me ocurre es que el arduino, una vez que se apague (o reinicie), pone a cero los contadores de tiempo, así que te hace falta una fuente fiable de energía o una placa con contador específica que incluya su propia pila (que las hay por ahí).

Además, el tiempo máximo que dura el contador de tiempo del arduino es de unos 50 días smiley-wink

;P
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias!

Tengo un rtc que es de donde coge las horas.
No entiendo lo de los 50 dias.

Por otro lado tengo que manejar otro rele y seguramente coincidan en el tiempo, al utilizar delay deja el arduino en "pause"? Si es asi no me serviria ya que al enceder uno no podria encender el otro no?
Logged


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

Lo de los 50 días tiene que ver con que usa 4bytes de memoria para el contador de tiempo (mira la función millis())

Efectivamente durante un delay se detiene la ejecución del programa, lo que puedes hacer es declarar un if() en el que compares el tiempo actual con el que tenías cuando activaste el relé, si es mayor que el tiempo preestablecido, lo apagas, sino, sigues a tus cosas smiley-wink
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

pero entonces si suceden dos eventos a la vez? Es decir se enciendo el tele de la calefaccion y es hora de regar?
Funcionara?
Logged


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

Si se dan las condiciones de cada uno sí, sin problema.

Ojito con las limitaciones de entrada y salida de corriente de los pines
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Estoy empezando con esto, explicame por favor
Logged


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

En general, corrientes máximas de entrada o salida:

DC Current per I/O Pin ................................................ 40.0mA (por cada pin)
DC Current VCC and GND Pins................................. 200.0mA (alimentación)

Es decir, asegúrate (con la resistencia que pones antes del transistor) de que no sacas más de 40mA de cada pin al mismo tiempo (con sacar 15 o 20 mA te funciona igual) y en total de todos los pines también hay restricciones, unos 100 mA (dependiendo de qué pines sean)

Toda esta info viene en la datasheet del micro, en "electrical characteristics".
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, gracias!
Logged


Cordoba
Offline Offline
God Member
*****
Karma: 41
Posts: 688
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nota de programador viejo: Si estas aprendiendo a programar no uses el estilo de los ejemplos es malisimo para seguir.

Esto esta mal, siempre se te va a apagar. El delay esta de mas ya que detiene por completo el resto de las tareas.
Puede usar una interupcion periodica y leer el reloj o cada 1,2,3.. segundos consultar el reloj y ver si ya es hora despues en el programa principal.
O algo mas simple.

long intervalo = 1000;

unsigned long currmillis = millis();

 
if(currmillis - prevmillis > intervalo) // si paso mas de 1 segundo leer el reloj
{
  previousmillis = currmillis;   
 
  ...llamar a la rutina de lectura del reloj.

  if (hour == hora && minute == minute && second == segundo)
  {    
    digitalWrite(relayPin, HIGH); //encender si estaba apagado
    Serial.println("encendio");
  }
  else
  {
     digitalWrite(relayPin, LOW); //apagar si estaba prendido
     Serial.println("apago");
  }
}

... seguir con otras tareas
« Last Edit: December 27, 2012, 01:16:50 pm by maxid » Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

se apaga cuando salga del if no? una vez que haya pasado el tiempo?
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

He hecho la siguiente prueba,

Enciendo un led1 mientras que esta encendido (delay)  doy la orden de encender led2, pero este no se enciende hasta que el delay ha terminado, por lo tanto no me sirve esta forma!


A ver si encontramos otra
« Last Edit: December 27, 2012, 01:34:21 pm by Jossema106 » Logged


Cordoba
Offline Offline
God Member
*****
Karma: 41
Posts: 688
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

relee mi respuesta, le di enviar sin querer.

Es asi el delay es un bucle con un nop, no hay ejecucion ni interruciones en ese momento. Ni funciona el puerto serial.
Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

El problema de ese código, si no me equivoco ya que es muy parecido al ejemplo de blinkwithoutdelay, para adaptarlo al mio es que ahora mismo proboco el encendido del led pulsando un botón y el apagado es automático es decir que no se vuelve a pulsar el botón por lo tanto no entra en el if de comprobacion de estado, no se si me explico.

Code:
if((ircode == 3108437760)){  //pulsado el boton del led1
    if (tiempo > 0){ 
           digitalWrite(led, HIGH);
           Serial.println("encendio");
           delay(tiempo);
           digitalWrite(led, LOW);
           Serial.println("apagado");
           ircode = ir.read() ;
  }
   else
     Serial.println("El tiempo de encendido es 0");
       
}
if((ircode == 3091726080)){//pulsado el boton del led2
         digitalWrite(rojo, HIGH);
         Serial.println("encendio rojo");
         delay(tiempo);
         digitalWrite(rojo, LOW);
         Serial.println("apagado rojo");
         ircode = ir.read() ;
}
 

Si falta alguna llave es que he quitado de mas para dejar lo minimo posible.

Gracias de nuevo
Logged


Cordoba
Offline Offline
God Member
*****
Karma: 41
Posts: 688
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno eso es otra cosa.
Cuando entras a la rutina del boton 1 debes tomar la hora actual y guardarla, si presionas el boton 2 tambien lo guardas.
Despues consultas la hora cada tantos segundos como te mencione y revisas todas las variables (puede ser un array para mas facil manejo) guardadas mas el tiempo de encendido y si se cumplio lo pagas.
Separa el codigo en 2, te lo bosquejo

Rutinas de botones
..
.
.
.
Rutina de tiempos

incluso de esta forma si vuelves a presionar el boton extiendes el tiempo de encendido.
Logged

El que pregunta aprende, el que responde aprende a responder.

Pages: [1] 2   Go Up
Jump to: