Ayuda arduino para terrario

Hola me llamo Manuel, tengo un arduino mega controlando una pantalla de leds para un terrario tropical, al cual quiero ponerle una bomba de agua para la humedad del mismo. Decir que no tengo ni idea de programación en arudino ni en nada, el codigo que tengo lo ha hecho un compañero de un foro de acuarios y no quiero molestarlo mas ya que cada dia anda con nuevos proyectos de mas compañeros y está bastante liao.

Bueno mi caso es que está todo funcionando menos la bomba de agua que va conectada a un deposito, dicha bomba me gustaria poder programarla para que funcione 5 veces al dia, se encinde a traves de un rele cuando arduino le da la orden, el problema es que no puede estar funcionando mas de 30 segundos aprox. ya que se quemaria si estuviese mas tiempo.

La funcion de la bomba es para que en el terrario se mantenga una humedad alta y constante ya que lleva 2 boquillas nebulizadoras que hacen que el agua salga muy finita haciendo hasi el efecto lluvia en el terrario.

Este trocito de codigo es donde va configurada las horas de la lluvia a la que quiero que se active.
Hay algo que falla, ya que el rele se queda siempre encendido y no corta como es de esperar. Bueno no me enrollo mas si hace falta mas datos preguntadme porfavor,

void Lluvia() {
if((hour == 8)&&(minute == 45)){
digitalWrite(PinLluvia, LOW);
delay(30000);
digitalWrite(PinLluvia, HIGH);
}
if((hour == 11)&&(minute == 45)){
digitalWrite(PinLluvia, LOW);
delay(30000);
digitalWrite(PinLluvia, HIGH);
}
if((hour == 14)&&(minute == 45)){
digitalWrite(PinLluvia, LOW);
delay(30000);
digitalWrite(PinLluvia, HIGH);
}
if((hour == 17)&&(minute == 45)){
digitalWrite(PinLluvia, LOW);
delay(30000);
digitalWrite(PinLluvia, HIGH);
}
if((hour == 20)&&(minute == 45)){
digitalWrite(PinLluvia, LOW);
delay(30000);
digitalWrite(PinLluvia, HIGH);
}
else{
digitalWrite(PinLluvia, 0);

}}

Saludos

Si puedes poner todo el codigo ,mejor.Usa el icono de code (el penultimo de la primera fila) cada vez que quieras poner un sketch o parte de el.

Básicamente, falta el resto del código. También habría que saber qué tipo de relé estás usando.

No puedo meter el código con el code me dice que excede de 20000 caracteres?¿?¿?

Hola.
Puedes adjuntar un archivo desplegando "Attachments and other options" en la parte inferior del editor.
Por el momento, basándome en las impresiones que me dá el trozo de código, tus relés se activan con LOW; así que deberías sustituir por el final de tu código

digitalWrite(PinLluvia, 0);
por
digitalWrite(PinLluvia, HIGH);

Aunque eso arregle el problema y ya no esté constantemente encendido, es muy probable que cuando toque encendido te haga dos consecutivos de 30 segundos (es decir, que esté un minuto).

Una audita porfavor...

En lo personal mas alla de que el código funcione me parece HORRIBLE y debo fundamentar la razón: (nada contigo Manupower).

Parece un parche de un parche.
Faltan comentarios.
Falta optimizar mucho código y lo peor es el abuso de delays que detienen el ARDUINO cuando lo encuentran.

Repetiendo lo que dice NOTER, como tu consulta es que se produzca algo a tal hora, la condición se va a efectuar cada 30 segundos. o sea 2 x min o 120 por hora. DESASTRE.

Pero tu quieres la solución a tu problema: asi que vamos

Lo que tienes que hacer es algo asi (Tomo el caso de hora == 14)

if(hour == 14 && minute == 0 && seconds > 31){
    digitalWrite(PinLluvia, LOW);
   delay(30000);                                                    // 30 segundos
   digitalWrite(PinLluvia, HIGH);
   }

O usa los minutos que gustes.
No es la mejor opción pero es práctico seconds> 31 asegura que se ejectará solo una vez.

como menciona surbyte agregar los segundos le da mas precisión a la condición. y lo que apunta noter es muy importante pues en la parte final de tu código, siguiendo la logica de tu codigo, activas el rele con:

else{
digitalWrite(PinLluvia, 0);

   }

Tu rele lo activas con un estado LOW y, 0 es igual que LOW. Aunque me quede pensando en como es que tienes conectado tu rele, seria bueno que nos compartieras que modelo es y como lo tienes conectado ya que las bobinas de los reles pueden dañar los microcontroladores.

Tu código se me hace que puede estar en una función mas sencilla con una variable global long:

long lap = 0;

void lluvia(){
    digitalWrite(PinLluvia, LOW);
   delay(30000); 
   digitalWrite(PinLluvia, HIGH);
lap = millis();
}

void setup(){
...
lluvia();
}

void loop(){
....
if (millis() > lap + 17280000L)
    lluvia();

....

}

17280000L representa una quinta parte de un día en milisegundos.

Edito el ejemplo de arriba no reaccionara al desbordarse millis(), aproximadamente 50 dias.
creo, solo hay que cambiar la comparación y usar unsigned long en lugar de long.

void loop(){
....
if (millis() - lap  > 17280000L)
    lluvia();

....

}

Hola, ante todo gracias por contestar. En esta foto se ven los reles que utilizo, el codigo está bastante caotico ya que yo lo he modificado a mi gusto bastante, no es el original del creador, pero lo que me importa es que funciona en mi pantalla de leds, todo menos el efecto lluvia que es el tema que estamos tratando, pero bueno ya iré mejorando con el tiempo.

Como me dijo Noter, cambié el 0 por HIGH, pero el relé sigue encendido siempre, tambien he probado a poner el ejempl. de surbyte, pero nada me da este error:

CODIGO_MODIFICADO_HUMEDAD.ino: In function 'void Lluvia()':
CODIGO_MODIFICADO_HUMEDAD:847: error: 'seconds' was not declared in this scope

el ejm. de ehrja no lo entiendo, si es posible podriais ponerme el codigo para yo copiarlo directamente en el ide, ya que debido a mi torpeza con esto, luego me lio vivo . jeje gracias

Hola manuel,

He revisado el código que has colgado antes, a mi parecer si esta declarada la función lluvia pero nunca es usada, porque no es llamada al final de la función loop().

En este caso hay muchas cosas que pueden estar mal pero primero agrega la función dentro de la ultima parte del loop(){}
en el IDE Arduino vas a buscar la linea void loop(){ que se encuentra en la linea 221 (en el IDE de arduino el numero de linea aparece en la esquina inferior izquierda), de ahí bajas hasta la linea 900 donde aparecen las otras funciones y agregas Lluvia(); entre ellas de la siguiente forma:

  Luces(minute, hour); 

  Luces1(minute, hour); 

  Luces2(minute, hour);

Lluvia();

  Niebla(minute, hour); 

  Cascada(minute, hour);

///

En segundo lugar tienes que cambiar seconds por second, en el codigo que te sugirió surbyte, por cierto el codigo esta interesante. :grin:

if(hour == 14 && minute == 0 && second > 31){
    digitalWrite(PinLluvia, LOW);
   delay(30000);                                                    // 30 segundos
   digitalWrite(PinLluvia, HIGH);
   }

haces eso y nos cuentas que paso.

Buenas, y buenas noticias, jeje, lo he puesto como me has dicho y está funcionando correctamente, muchas gracias a todos los que me hais ayudado a completar el trabajo, uff ya tenia ganas jeje por fin mis ranillas se van a sentir agustico y humedas como no, bueno un saludo a toda la comunidad y estaré por aqui aprendiendo de VDS. maestros...