encender rele segun tiempo

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

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

:stuck_out_tongue_winking_eye:

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?

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

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

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

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

Estoy empezando con esto, explicame por favor

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

ok, gracias!

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

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

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

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.

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.

 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

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.

muy buena idea!!!

Gracias, ya os contare!

hola
que quieres controlar exactamente.
por que no utilizas las horas que te da el reloj.
es decir que se encienda a una hora y se apague a otra.
o que cuando pulses el boton compruebe la hora cada minuto y cuando llegue el momento (x minutos) se apague.
por ejemplo cuando sean las 5 empieza a mirar el reloj cada minuto y cuando sean las 10 se apaga (5+5)(hora que se enciende+mas lo que quieres que dure)
si quieres ser mas exacto utiliza minutos es decir las 13:30 son (13*60)+30 =810.

un saludo

Esa era la idea inicial pero por ahi hay un hilo fallo rtc creo q se llama, que describe el porque de buscar otra solucion ya que da siempre como valor 45, y no se cual ha sido el cambio a no ser que para el MEGA sea distinto y haya que levantar algun pin como pasa para la sd.

Sabes algo? Gracias

no entiendo lo del fallo 45. yo lo tengo asi y no hay problemas

Esto es lo que saca por pantalla
45:165:85 165/165/165 Day_of_week:165
45:165:85 165/165/165 Day_of_week:165
45:165:85 165/165/165 Day_of_week:165
45:165:85 165/165/165 Day_of_week:165