Calendario y horario

Hola, he hablado algunas veces en el foro para algunas dudas que he tenido a la hora de hacer algún proyecto. Esta vez estoy metido en otro proyecto , y como no... es nuevo para mi y necesito otra vez la ayuda del foro, muchas gracias de antemano.

Os explico, tengo un motor para sacar agua de un pozo y necesito que solo arranque en momentos concretos, estos momentos varían según el día y la hora. He pensado utilizar arduino para este proyecto. A medida que pasan los dias del año, pues cambia la hora a la que el motor tiene que arrancar. Por lo tanto necesito que de alguna manera arduino tenga un calendario con los 365 dias y además un reloj que sea exacto.

Por poner un ejemplo :
Quiero que el dia 1 de enero a las 23:00 se active el motor . Pero que el dia 2 de enero se active a las 21:00 y el dia 3 de enero a las 22:00.

Creéis que es posible hacer esto con arduino?

Claro que si.

Usa un módulo DS3231 que es más preciso. Tendrás que crear una tabla (array) con las horas de inicio. Esa tabla será muy grande con lo que será necesario usar una memoria que no sea la RAM. Los modulos DS3231 suelen venir con una EEPROM de at24c32 que tiene unos 4k bytes de tamaño que te vendrá muy bien para guardar los datos, o en su defecto usar la propia FLASH de arduino usando la directiva PROGMEM.

Has de tener en cuenta que cada 4 años es bisiesto, y por lo tanto el año tiene 366 días. También los cambios de hora.

Un consejo es que trabajes con el minuto del día en vez de con las horas, es decir, un dia tiene 23horas * 60 minutos + 59 minutos = 1439 minutos. Siendo la media noche el minuto 0 y las 23:59 el minuto 1439.

Aunque me parece un poco raro para controlar la bomba del pozo así, y esto es por curiosidad, ¿por que horarios diferentes a cada dia del año?

Gracias victorjam, me suena todo raro porque no tengo ji idea pero iré investigando poco a poco el modulo y las dudas que tenga las preguntaré aquí. Pues es simple la respuesta a el porque de las horas dependiendo del día, pues yo pongo la bomba en marcha para regar campos, los cuales solo pueden ser regados cuando no haya sol, y sobretodo 2 horas después de irse el sol para que la tierra se haya enfriado . He hecho pruebas con LDR y cuando pasan un par de semanas se ensucia y cree que es de noche. La conclusión es que es mejor un calendario con horas y así será lo mas exacto posible.

JOSEBERMUDEZ:
...dependiendo del día, pues yo pongo la bomba en marcha para regar campos, los cuales solo pueden ser regados cuando no haya sol, y sobretodo 2 horas después de irse el sol para que la tierra se haya enfriado...

¿Puedo sugerirte un cambio de método?

Usar una tabla en memoria, implica crear esa tabla, lo cual te puede llevar a error al crearla, además del costo de memoria.

Existen librerias que te permiten calcular la hora y puesta del sol indicando tan solo las coordenadas GPS del sitio, y funcionan bastante bien. Con lo que sabrias exactamente la hora real a la que se pone el sol todos los dias del año.

Te recomiendo Dusk2Dawn, aunque puedes hacer una busqueda en internet poniendo "sunset sunrise arduino" y buscar alguna que te guste mas.

Muchas gracias victojam, acabo de ver un post que hiciste tu mismo hace tiempo de como calcular el orto/ocaso del sol, es interesante a la vez que difícil para mi, porque no estoy familiarizado con eso, pero bueno todo es empezar y al final todo se aprende. Le voy a hechar un vistazo a ver como va eso.

Hola @JOSEBERMUDEZ, lo que te sugiere @victorjam es la mejor opción.

Solo ve a Google Maps en en tu celular o PC, encuentra la posición GPS latitud longitud de tu huerta/granja. Te dará algo 40.4381311 -3.8196214,11
Asi que pones eso para identificar tu sitio

  Dusk2Dawn miGranja(40.4381311, -3.8196214,11, timezone);

No se cual es la zona de España

con eso luego solo le debes preguntar si quieres el amanecer (sunrise) o el atardecer (sunset).

Defines algo como

 int miGranjaSunrise  = miGranja.sunrise(2017, 04, 17, false);
 int miGranjaSunset = miGranja.sunset(2020,04,17, false);

con esto lo imprimes pero tu deberás accionar tu valvula

 Serial.println(miGranjaSunrise  );  // 418
  Serial.println(miGranjaSunset );   // 1004

Es muy fácil.

Lo interesante que leyendo el dia/mes/año puedes pedirle dinámicamente al sistema que modifique la hora para accionar la electroválvula y para eso usas el DS2321.

Si Surbyte, muchas gracias, tengo el material pedido , estoy a la espera de recibirlo y ponerme a montar todo.