(14-12-2015, 11:41 AM)ArturoS escribió: En tema de gestión de fechas, lo descartamos por simplicidad desde el principio, pero el ajustar el reloj a verano o invierno es por hacer coincidir la iluminación con la "hora del sofa" sin que el user tenga que estar abriendo la caja/o dando a un interruptor (soldadura) o recompilado para cambiar la hora.
El fundamento de la rutina que te comento es:
Tener una variable global boolean con indicador de horario de invierno (se le da valor en el setup en función del mes actual)
En el loop se captura el mes de la fecha, y si horario_invierno es true y mes >3 o <11 se cambia -1 la hora y se pone horario_invierno a false,
Y si horario_invierno es false y mes <4 o >10 se hace lo contrario.
El sistema solo falla si hay un corte de luz el 30/3 o 31/10 que dura hasta el día siguiente (para evitarlo había que usar la eeprom), pero creo que es error asumible.
No necesita ser exacto controlando que den las 2 am del ultimo domingo del mes para hacer el cambio, es mas cómodo esperar de 1 a 7 días que el sistema arregle el desfase de 1 hora que tener que estar retocando el sistema.
Lo que tú dices es que el usuario debe esperar a que se produzca un cambio de horario y en ese caso una desconexión y una reconexión dejaría el sistema configurado suponiendo que el algoritmo que tu describes fuera correcto, pero no lo es, porque los cambios de horarios ocurren en fines de semana. Tú algoritmo sirve para este año nada más.
El siguiente cambio ( al horario de Verano ) se producirá:
El día 27 de marzo de 2016
A las 2:00 de la mañana el reloj se cambiará a las 3:00 de la mañana
El anterior cambio ( al horario de Invierno ) se produjo:
El día 25 de octubre de 2015
A las 3:00 de la mañana el reloj se cambió 2:00 de la mañana
Para hacerlo bien, la manera que "se dice sencilla" por comparación con otros métodos, es aplicar la
congruencia de Zeller.
Si eso te parece complicado te diré que a esto se le llama la manera sencilla porque no tiene en cuenta el hecho de que el pasado 25 de octubre a las 2:30 existe una ambigüedad imposible de resolver. Esa hora ocurrió dos veces seguidas en el espacio de una hora. La primera en horario de verano y la segunda en horario de invierno porque el reloj hizo la putada de saltar atrás una hora al llegar a las 3:00 la primera vez.
Cuando haces algo que no funciona como debe, el que recibe toneladas de comentarios de listillos es el autor del programa y decir que lo has hecho así aposta no sirve sino para empeorar las cosas y paso de eso.
Si queremos hacer algo sencillo yo creo que lo mejor sería poner un jumper o no poner nada. Los temporizadores sencillos no suelen incluir el cambio de horario.
PD:
Para el que no domine la jerga, en programación, se llama algoritmo a una receta para resolver un problema. La idea de Arturo es un algoritmo para este año, la congruencia de Zeller es un algoritmo para cualquier año, y ninguna de las dos es perfecta.