Pages: [1] 2   Go Down
Author Topic: Código horario verano/invierno  (Read 5036 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

quiero detectar el cambio de hora verano/invierno, es decir, que a partir del último domingo del mes de marzo me reste una hora a la hora que obtiene del RTC y a partir del último domingo del mes de octubre me deje la hora como la obtiene del RTC. Mi RTC es el DS3231SN por lo que tengo como variables:

-Día de la semana [0=domingo,1=lunes,...]
-Día del mes [1=enero,2=febrero,..]
-Hora [0,1,..,22,23]

Una forma que se me ha ocurrido es que cuando detecte uno de esos domingos guarde la situación en la EEPROM (1=verano,0=invierno), pero tendría que poner un 1 o 0 según la situación en el momento de cargar el software en el Arduino, cosa que el día de mañana seguro que se me olvida y la lio. Además si ese domingo por alguna razón está apagado no cambiará hasta el siguiente domingo de cambio de hora ¿Alguna propuesta más práctica/fiable?

Parece una chorrada pero me estoy volviendo loco, y llevo un tiempo buscando el código en internet y no encuentro nada que me valga.

Un saludo
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cada vez que leas la hora mira si estás en horario de verano o invierno (a qué corresponde el día y mes en el que estás ahora) y ajusta la hora según ello.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Entonces estás en las mismas, si lo apagas un domingo ya pierdes la cuenta
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hombre, lo bueno de poner un RTC es que se les puede poner batería de respaldo para que lleve la cuenta independientemente del estado del dispositivo al que lo tengas conectado.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por contestar,

bokeauss: es verdad, me he liado. Los datos que da son:
-Día de la semana [0=domingo,1=lunes,...]
-Día del mes [1,2,..,31]
-Día de mes [1=enero,2=febrero,..]
-Hora [0,1,..,22,23]

Lógicamente mi RTC tiene batería, y el uso del sistema no es continuo (se enciende de vez en cuando), es por eso que cuando lo encienda cualquier día del año, quiero que me dé la hora correctamente según se este en el horario de verano o invierno.

Lo del cambio de hora va de la siguiente manera:

El último domingo del mes de marzo a las 2 de la madrugada son las 3 y el último domingo del mes de octubre a las 3 son las 2.

No sé si hay una forma sencilla de hacerlo, pero lo que se me ocurre es demasiado tedioso y supongo que no soy el primero que tiene que resolver este tema (pero no encuentro el código por ningún lado).

Mi idea es ver nada más encender el Arduino si estamos en horario de verano o invierno, y se le suma/resta según corresponda.
Filtrando a groso modo (saltándome algunos días) por meses es fácil, diciendo que si es mayor o igual que abril y menor o igual que noviembre se esta en horario de verano, si no en horario de invierno.
Ahora si quiero filtrar exactamente, tendría que añadir la condición de todas las posibilidades posibles del último domingo de marzo y octubre, es decir, si el domingo (0) cae en 25 o en 26 o ... en 31. Esto a su vez supone que si el último domingo es el día 25 hay que decir que el 26,27,..31 también son horario de verano/invierno. Si el domingo es el 26, el 27,28,29,30 y 31 ya son del nuevo horario, y así un buen rato.

Luego, lógicamente ese domingo de cambio horario no hay que cambiarlo hasta las 2 para que sean las 3 o a las 3 para que sean las 2, según toque.

¿Alguien conoce alguna forma más sencilla de hacerlo o el código ya escrito?

Un saludo

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

O se me escapa algo, o lo veo tan sencillo como dice Chiva.
1) Leo del RTC
2) Es el dia D la hora H y el mes M?? --> si lo es, programo el RTC con mi nueva hora.
3) Tengo una variable que me diferencia verano/invierno (dos estados) ya que solo lo tiene que hacer una vez. (Si no lo haces, cuando restas 1 hora, en la proxima hora volveras a cumplir la condicion de cambio de hora (te quedas "forever" atrapado en el tiempo  smiley-grin). Es decir, si estoy en verano y se cumple la condicion del dia concreto, hago el cambio de hora y mi variable ahora es igual a invierno.
4) Dicha variable (es tan solo un bit) la guardo en la EEPROM del micro para que cuando se me salten los plomos de la casa y mi Arduino se quede sin alimentacion, no pierda el estado.

no?? Incluso, si no me equivoco, algunos integrados RTC tienen hasta alarma!!! Para que no tengas que estar todo el rato "preguntando"... es hoy el dia? es hoy el dia? es hoy el dia?   smiley-grin smiley-lol


smiley-wink
« Last Edit: February 11, 2011, 04:02:15 pm by Igor R » Logged


0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

He mirado tu RTC por encima, y parece tener alarma:

The DS3231 contains two time-of-day/date alarms.
Alarm 1 can be set by writing to registers 07h to 0Ah.
Alarm 2 can be set by writing to registers 0Bh to 0Dh.
The alarms can be programmed (by the alarm enable
and INTCN bits of the control register) to activate the
INT/SQW output on an alarm match condition.

Vaya, no se cual es tu aplicacion y si lees muy de continuo el RTC, pero una cosa mas por si quieres que te active una interrupcion que "despierte" tu Arduino......


Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias Igor R por contestar,

lo que dices del RTC que uso es cierto, pero lo único que he encontrado es un ejemplo de uso pero no implementa el uso de las alarmas. He usado la siguiente ejemplo:

http://code.google.com/p/gfb/source/browse/arduino/DS3231/DS3231.pde

Respecto a lo que propones, no sé si no lo entiendo bien, pero era la idea incial que tenía. Lo que pasa es que es para un sistema que se enciende de vez en cuando. Por tanto, nada más encenderse tendría que darme la hora acorde a la época del año que se este, sin tener que estar horas/días encendido. Y lógicamente el domingo que tiene que cambiar de fecha debería de poder de estar apagado y por tanto no cumplirse nunca el momento de cambio de hora.

Un saludo


« Last Edit: February 11, 2011, 04:31:56 pm by acarreo » Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pero tu RTC hace eso por ti.... Es decir, es un reloj independiente.
Tu lo pones en hora, y el solito va aumentando de segundos, horas, minutos, dias,....

Arduino no entra para nada en ese proceso. Simplemente, cuando Arduino quiere saber que hora/dia es, le pregunta....RTC, me dice la hora, por favor?? Y muy amablemente te contesta (todo esto por I2C).
Una vez sabiendo la hora/dia/mes que es, haces tus calculitos, y los muestras en un lcd o haces lo que quieras con ellos. Si es el caso que hay que cambiar la hora, pues Arduino le da la orden para que se "sincronice" con dicha hora, y a seguir "pasando el tiempo"....

A que si te pregunto la hora que es en Canarias y vives en la peninsula, sabes contestarme mirando tu reloj? Pues es lo mismo.... (espero que seas de Espanya y no te ponga en un aprieto...ja,ja,ja). Miras la hora, y como sabes que en Canarias es una hora menos, se la restas y me la dices, no??

Piensalo en facil sin I2C, chips y cosas raras..... Tengo un reloj/calendario, y si me dice la hora y dia, con dicha informacion soy capaz de hacer las "correcciones" para ajustarlo a mi horario verano/invierno. Es mas, soy capaz de decir que hora es Hong Kong, cual en New York, etc.
Es decir, no tendrias ni que programarlo con la nueva hora.....



smiley-wink
« Last Edit: February 11, 2011, 04:49:20 pm by Igor R » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pero para "sincronizarle" la nueva hora al RTC el arduino tiene que estar funcionando, y si ese domingo esta sin batería ¿cuándo le va a sincronizar al RTC? Por ejemplo, este año el domingo 27 de marzo a las 2 serán las 3. Se supone que al encenderse y leer la hora del RTC, si es más tarde que el 27 de marzo a las 2, entonces le suma una hora, no? Pero no es tan fácil, ya que el 27 yo lo he mirado en el calendario, pero tiene que ser capaz de calcularlo el solo (último domingo de marzo que varia todos los años). Como he comentado antes, lo laborioso son los días de marzo que les afecta el cambio de hora, ya que en abril ya es todo el mes igual.

Otra interpretación que hago es que si le sincronizas al RTC con una hora más cuando se de la condición que sea más tarde del 27 de marzo a las 2, ¿cómo sabes que no lo has hecho ya antes?

Un saludo
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Repito.... no pierdes nada cuando se apaga el Arduino!! El RTC con su pila , es completamente independiente del Arduino. Solo tienes que ponerlo por primera vez que lo montes en la hora y fecha, y te durara anyos encendido!!
Cuando Arduino se enciende, tan solo tiene que preguntar al RTC, me da la hora y la fecha, por favor? te bastara para tener de nuevo TODA la informacion que necesitas.
El Arduino no tiene por que guardar nada (es opcional)..... simplemente tiene que saber "asimilar" que hacer con dicha informacion.

La verdad es que no entiendo realmente el problema.... smiley-eek

1) Guardo una tabla en mi Arduino con las tareas que tengo que hacer. La entrada es la fecha, y el me dice que tengo que hacer porque ando "jodido" de memoria.
2) Mi Arduino se despierta, despues de 10 dias de resacon (el garrafon esta haciendo muy mal a este pais).
3) Y pregunta al RTC, me puedes decir a que estamos?
4) Con dicha informacion, voy a la tabla y resulta que con esa fecha/hora estoy en horario verano y que originalmente mi reloj cuando lo programe por primera vez y es mi CONDICION INICIAL, estaba en invierno, asi que me devuelve un -1  para restarle una hora a lo que me dice el RTC (ya me he creado todas las correcciones basandome en mi CONDICION INICIAL). Me da absolutamente igual haber estado dormido esos dias y haberme perdido el gran momento del cambio de hora. Que me quiten lo bailao con el juergon que me pegao!!!
5) Me da igual que si es bisiesto, martes, julio.... porque mi "chuletario" (una tabla, constantes,...a eleccion del programador)  para cuando pierdo la memoria, en cuanto le diga le fecha y hora, me va a decir que factores de correcion le tengo que hacer.

smiley-wink

« Last Edit: February 11, 2011, 06:12:42 pm by Igor R » Logged


0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No pienso quedar con vosotros nunca a tomar canyas en hora "zulu" que seguro llegais a horas diferentes..... smiley-grin
Como hara la gente para quedar por telefono que le recojan en el aeropuerto de Madrid a una hora determinada si vuelan desde Brasil y alli hay "x" horas de diferencia?? Buff, y alli es verano cuando aqui es invierno!! Lo haran con un Arduino?? Debe ser un MEGA!!!


Es conya!!


 smiley-grin smiley-grin smiley-grin
« Last Edit: February 11, 2011, 06:11:48 pm by Igor R » Logged


0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sin que te lo tomes a mal....primero no sera mejor saber/buscar que info te da el RTC??
Es que si no, entramos en bucle que no tiene ningun sentido....

Del datasheet: "Real-Time Clock Counts Seconds, Minutes, Hours, Day, Date, Month, and Year with Leap Year Compensation Valid Up to 2100
The RTC maintains seconds, minutes, hours, day, date,month, and year information. The date at the end of the month is automatically adjusted for months with fewer
than 31 days, including corrections for leap year. The clock operates in either the 24-hour or 12-hour format with an AM/PM indicator. Two programmable time-ofday
alarms and a programmable square-wave output are provided. Address and data are transferred serially through an I2C bidirectional bus.
A precision temperature-compensated voltage reference and comparator circuit monitors the status of VCC to detect power failures, to provide a reset output, and
to automatically switch to the backup supply when necessary. Additionally, the RST pin is monitored as a pushbutton input for generating a μP reset.
"
« Last Edit: February 11, 2011, 06:27:20 pm by Igor R » Logged


0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No pasa na... smiley-wink
« Last Edit: February 11, 2011, 06:38:24 pm by Igor R » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por contestas:

bokeausa: El código que has puesto funcionaría siempre y cuando el arduino este encendido del 25 al 29 de marzo y octubre, ¿y si no lo está? Si se apaga el 23 y se enciende el mes siguiente, no detectará la transición.
Entiendo que la variable  HORARIO DE VERANO  la metes en la EEPROM. Esta era mi idea inicial pero ya ves que por ser para un sistema no encendido permanente no me sirve.

if (dia>24 && dia<30 && mes == Marzo && DiaDeLaSemana== Domingo) {

  HORARIO DE VERANO = True
HORARIO DE INVIERNO = False
}

if (dia>24 && dia<30 && mes == Octubre && DiaDeLaSemana== Domingo) {

HORARIO DE INVIERNO = True
  HORARIO DE VERANO = False
}

-------------

Respecto al año, si que tiene ese dato también. Siento no haberlo comentado pero el problema que tengo no es con el funcionamiento del RTC en sí, a él le pones la fecha y hora y la mantiene. Mi problema es saber si a esa hora le tengo que sumar una hora o no, según los humanos tengamos el horario de verano o invierno.

Igor R: Ahora creo que te nos entendemos, lo que pasa es que la idea no es usar una tabla, sino un algoritmo que me detecte que esta en horario de verano/invierno. Si fuese que cambia todos los 1 de abril y 1 de noviembre el algoritmo estaría chupado:

if (mes>=abril && mes<octubre)
{
hora=hora+1;
    if (hora>=24)
    {
    hora = 0;
    }
}

Lo que pasa es que no son los 1 del mes, sino el último domingo.

Además, ahora que lo pienso tampoco es tan simple ya que si le suma una hora cuando son las 23horas, la hora se convierte a cero, pero el día sigue siendo el anterior, por lo que durante la hora 0 tendría que sumarle también 1 al día hasta que se haga la 1 para, entonces, dejarla como la lee del RTC. Esto es de locos.

Un saludo
Logged

Pages: [1] 2   Go Up
Jump to: