Código horario verano/invierno

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.... :astonished:

  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.

:wink:

No pienso quedar con vosotros nunca a tomar canyas en hora "zulu" que seguro llegais a horas diferentes..... :smiley:
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: :smiley: :smiley:

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

No pasa na... :wink:

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

Bueno, aquí tenéis el código que he creado. Sólo ajusta la hora según el Arduino se "despierte" un día de horario de verano o invierno. No he ajustado el día del mes [1..31], y el del año no se ve afectado ya que como requisito de configuración del RTC habrá que decir que hay que colocarle la hora según el horario de invierno (así me ahorro líneas de código)[Para la versión 2.0]

Si alguien ve algún error que me avise por favor:

void calculo_horario (void){
  
  //Todo abril y todo noviembre (más adelante se le resta para los días de
  //octubre que no son horario de verano
  if (month>=4&&month<=10){
    hour=hour+1;
  }
  //Para los días de marzo desde el último domingo del mes
  if (month==3&&dayOfWeek==0&&dayOfMonth==31){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==0&&dayOfMonth==30){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==0&&dayOfMonth==29){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==0&&dayOfMonth==28){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==0&&dayOfMonth==27){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==0&&dayOfMonth==26){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==0&&dayOfMonth==25){
    if(hour>=2){   
    hour=hour+1;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==31){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==30){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==29){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==28){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==27){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==26){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==31){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==30){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==29){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth>=28){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==27){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==31){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==30){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==29){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==28){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==31){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==30){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==29){
    hour=hour+1;
  }
  if (month==3&&dayOfWeek==5&&dayOfMonth==31){
    hour=hour+1;
  }  
  if (month==3&&dayOfWeek==5&&dayOfMonth==30){
    hour=hour+1;
  }  
  if (month==3&&dayOfWeek==6&&dayOfMonth==31){
    hour=hour+1;
  }
  
 
//Para los días de octubre que no son de horario de verano (se le resta la hora
//anteriormente sumada)
  if (month==10&&dayOfWeek==0&&dayOfMonth==31){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==0&&dayOfMonth==30){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==0&&dayOfMonth==29){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==0&&dayOfMonth==28){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==0&&dayOfMonth==27){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==0&&dayOfMonth==26){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==0&&dayOfMonth==25){
      if(hour>=2){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==31){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==30){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==29){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==28){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==27){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==26){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==31){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==30){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==29){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==28){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==27){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==31){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==30){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==29){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==28){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==31){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==30){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==29){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  if (month==10&&dayOfWeek==5&&dayOfMonth==31){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }  
  if (month==10&&dayOfWeek==5&&dayOfMonth==30){
    if (hour==0){
      hour==23;
      
    }
    else
    {
    hour=hour-1;
    }
  }  
  if (month==10&&dayOfWeek==6&&dayOfMonth==31){
    if (hour==0){
      hour==23;
    }
    else
    {
    hour=hour-1;
    }
  }
  
  if (hour>=24){
    hour=0;
  }
}

Un saludo

Hola,

he corregido el código anterior, ahora aparte suma el día de la semana y el del mes. Además me he dado cuenta que lo que enuncié como datos del RTC DS3231SN# no estaba correcto, ya que el domingo es 1 y no 0, es decir: dayOfWeek[1=domingo,2=lunes,....,7=sábado]

A continuación muestro el código que he hecho, si veis algún error por favor comentarmelo
Como requisito al poner la hora del RTC es que ésta se ponga en horario de invierno y no de verano.
Os recuerdo que este código no reconfigura el RTC sino que modifica el dato para posteriormente imprimirlo en pantalla/datalogger,...
La idea es que funcione incluso en sistemas que no están encendidos permanentemente (lógicamente el RTC ha de tener su batería para que cuente el tiempo independiente de lo que pase con el Arduino)

void calculo_horario (void){
  
  //Todo abril y todo noviembre (más adelante se le resta para los días de
  //octubre que no son horario de verano
  if (month>=4&&month<=10){
    hour=hour++;
  }
  //Para los días de marzo desde el último domingo del mes
  if (month==3&&dayOfWeek==1&&dayOfMonth==31){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==30){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==29){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==28){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==27){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==26){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==1&&dayOfMonth==25){
    if(hour>=2){   
    hour=hour++;
    }
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==31){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==30){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==29){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==28){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==27){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth==26){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==31){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==30){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==29){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==28){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth==27){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==31){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==30){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==29){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth==28){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==5&&dayOfMonth==31){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==5&&dayOfMonth==30){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==5&&dayOfMonth==29){
    hour=hour++;
  }
  if (month==3&&dayOfWeek==6&&dayOfMonth==31){
    hour=hour++;
  }  
  if (month==3&&dayOfWeek==6&&dayOfMonth==30){
    hour=hour++;
  }  
  if (month==3&&dayOfWeek==7&&dayOfMonth==31){
    hour=hour++;
  }
  
 
//Para los días de octubre que no son de horario de verano (se le resta la hora
//anteriormente sumada)
  if (month==10&&dayOfWeek==1&&dayOfMonth==31){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==30){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==29){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==28){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==27){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==26){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==1&&dayOfMonth==25){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==30){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==29){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==28){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==27){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth==26){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==30){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==29){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==28){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth==27){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==30){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==29){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth==28){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==5&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==5&&dayOfMonth==30){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==5&&dayOfMonth==29){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==6&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }  
  if (month==10&&dayOfWeek==6&&dayOfMonth==30){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }  
  if (month==10&&dayOfWeek==7&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  
  //Al incrementar la hora en verano, hay que ajustar el día de mes y mes una hora antes que el RTC
  if (hour>=24){
    hour=0;
    dayOfMonth=dayOfMonth++;
    if(dayOfMonth>=32){
      dayOfMonth=1;
      month=month++;
    }
    dayOfWeek=dayOfWeek++;
    if(dayOfWeek==8){
      dayOfWeek=1;
    }
  }
}

Un saludo

acarreo, tienes que simplificar tu codigo como dice bokeauss...

Sumar una hora a todos los dias a partir del ultimo domingo de marzo hasta octubre (completo) quedaría una cosa así... (no he probado el codigo pero en principio tiene que funcionar)

if (month>=4 && month<=9){
   hour++;
   }
else if (month==3 && dayOfWeek ==1 && (dayOfMonth>=25){
   hour++;
   }

Si trabajas con formato de fechas del tipo YYYYMMdd, ej 20110324 para el 24 de marzo del 2011, te simplifica la vida (una fecha mayor, siempre es un numero mayor y viceversa)
Lo mismo para horas en formato 0000-2359

Puedes hacer tabla multidimensional anyos, cuantos dias tiene el mes:
byte diasMes[][12] PROGMEM =
{
{31, 28, 31,....,31}, //2011
(31, 29, 31,...,31}, //2012
...
};

Me refiero que te lo puedes "preparar" para que todo te sea mas sencillo....

:wink:

Veo mas facil tener una tabla con los dias, que complicarse con codigo....

2011: Domingo 27 Marzo 02:00 -- Domingo 30 Octubre 03:00
2012: Domingo 25 Marzo 02:00 -- Domingo 28 Octubre 03:00
2013: Domingo 31 Marzo 02:00 -- Domingo 27 Octubre 03:00
2014: Domingo 30 Marzo 02:00 -- Domingo 26 Octubre 03:00
2015: Domingo 29 Marzo 02:00 -- Domingo 25 Octubre 03:00
2016: Domingo 27 Marzo 02:00 -- Domingo 30 Octubre 03:00
2017: Domingo 26 Marzo 02:00 -- Domingo 29 Octubre 03:00
2018: Domingo 25 Marzo 02:00 -- Domingo 28 Octubre 03:00
2019: Domingo 31 Marzo 02:00 -- Domingo 27 Octubre 03:00
2020: Domingo 29 Marzo 02:00 -- Domingo 25 Octubre 03:00

Te haces una tabla multidimensional con los anyos y los 2 dias de cada anyo que son los cambios y a correr.... O vectores. Pero me refiero a ir a lo practico...
Tu codigo solo tiene que entrar con el anyo de la fecha actual, y le dicen los dias. Entonces solo tienes que mirar si estas mas de la fecha o no...

Sigo viendolo mas facil que todas las vueltas que se le esta dando... :wink: . Me debo estar dejando algo.... Un par de tablas, ponertelo facil con el tema formato de fechas, y un if con las condiciones (que no deben ser muchas, solo la especial si estas en una hora mayor 2300 cuando le sumas una hora que cambias de dia....que miras en otro vector cuantos dias tiene ese mes segun el anyo (para saber si cambias de mes).
no??

Gracias por contestar,

la idea de agrupar toda la fecha para generar un número con el que comparar así fechas, para saber si una fecha está antes o después, es muy buena idea. Lo que no sé es como hacerlo, ya que las variables que obtengo del RTC (month, day, hour,..) me vienen en tipo byte por lo que supongo que tendré que convertirlo en long -> 2011032703 (momento clave de cambio de hora en formato [AAAAMMDDHH]) es decir necesito guardar más de 2 mil millones (supongo que el año podría dejarlo sólo en dos cifras pero como el integer no sirve ya que estamos...)

¿Alguién sabe como hacerlo?

Un saludo

Se me había olvidado que no todos los meses tienen 31 días, pero en horario de verano todos los años son iguales (siento no reducir el código)

// Al incrementar la hora en verano, hay que ajustar el día de mes y mes una hora antes que
// el RTC según el mes tenga 30 o 31 días
  if (hour>=24){
    hour=0;
    if(dayOfMonth>=32&&month==3){
      dayOfMonth=1;
      month=month++;
    }
    if(dayOfMonth>=32&&month==5){
      dayOfMonth=1;
      month=month++;
    }
    if(dayOfMonth>=32&&month==7){
      dayOfMonth=1;
      month=month++;
    }
    if(dayOfMonth>=32&&month==8){
      dayOfMonth=1;
      month=month++;
    }
    if(dayOfMonth>=32&&month==10){
      dayOfMonth=1;
      month=month++;
    }

    if(dayOfMonth>=31&&month==4){
      dayOfMonth=1;
      month=month++;
    }
    if(dayOfMonth>=31&&month==6){
      dayOfMonth=1;
      month=month++;
    }
    if(dayOfMonth>=31&&month==9){
      dayOfMonth=1;
      month=month++;
    }
  }

Creo que he simplificado bastante el código, como bien me habéis recomendado. A la espera de hacer otra versión mejorada, haciendo un numero uniendo las variables para compararlas, como comentáis, dejo aquí la última versión (se agradece cualquier comentario:

void calculo_horario (void){
  
  //Todo abril y todo noviembre (más adelante se le resta para los días de
  //octubre que no son horario de verano
  if (month>=4&&month<=10){
    hour++;
  }
  //Para los días de marzo desde el último domingo del mes
  if (month==3&&dayOfWeek==1&&dayOfMonth>=25){
    if(hour>=2){   
    hour++;
    }
  }
  if (month==3&&dayOfWeek==2&&dayOfMonth>=26){
    hour++;
  }
  if (month==3&&dayOfWeek==3&&dayOfMonth>=27){
    hour++;
  }
  if (month==3&&dayOfWeek==4&&dayOfMonth>=28){
    hour++;
  }
  if (month==3&&dayOfWeek==5&&dayOfMonth>=29){
    hour++;
  }
  if (month==3&&dayOfWeek==6&&dayOfMonth>=30){
    hour++;
  }  
  if (month==3&&dayOfWeek==7&&dayOfMonth==31){
    hour++;
  }
  
 
//Para los días de octubre que no son de horario de verano (se le resta la hora
//anteriormente sumada)
  if (month==10&&dayOfWeek==1&&dayOfMonth>=25){
      if(hour>=3){
        hour=hour-1;
      }
  }
  if (month==10&&dayOfWeek==2&&dayOfMonth>=26){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==3&&dayOfMonth>=27){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==4&&dayOfMonth>=28){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  if (month==10&&dayOfWeek==5&&dayOfMonth>=29){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }

  if (month==10&&dayOfWeek==6&&dayOfMonth>=30){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }  
  if (month==10&&dayOfWeek==7&&dayOfMonth==31){
    if (hour==0){
      hour=22;
    }
    else
    {
      if (hour==1){
      hour=23;
      }
      else
      {
        hour=hour-2;
      }
    }
  }
  
// Al incrementar la hora en verano, hay que ajustar el día de mes y mes una hora antes que
// el RTC según el mes tenga 30 o 31 días
  if (hour>=24){
    hour=0;
    if(dayOfMonth>=32&&month==3){
      dayOfMonth=1;
      month++;
    }
    if(dayOfMonth>=32&&month==5){
      dayOfMonth=1;
      month++;
    }
    if(dayOfMonth>=32&&month==7){
      dayOfMonth=1;
      month++;
    }
    if(dayOfMonth>=32&&month==8){
      dayOfMonth=1;
      month++;
    }
    if(dayOfMonth>=32&&month==10){
      dayOfMonth=1;
      month++;
    }

    if(dayOfMonth>=31&&month==4){
      dayOfMonth=1;
      month++;
    }
    if(dayOfMonth>=31&&month==6){
      dayOfMonth=1;
      month++;
    }
    if(dayOfMonth>=31&&month==9){
      dayOfMonth=1;
      month++;
    }
  }
}

Hay varias formas de hacer lo de la fecha, una facil es si tienes anyo,mes y dia en variables numericas:
unsigned long mifecha=anyo10000+mes100+dia;

Para dia=11,mes=10 y anyo=2011=> mifecha=20110000+1000+11 (si quieres puedes usar el anyo solo 2 cifras o esperas que aguante mas del 2100?? je,je,je)

De todas formas, esta pregunta es de no haberse parado a pensar un poquito.... ehhh!!!!

Yo cogeria papel y boli, y me lo pensaria bien como hacerlo. Luego programar son 5 minutillos...

:wink:

Gracias Igor R,

lo que comentas esta bien pero lo que no sé es pasar de variable byte a long, ya que byte es como me devuelve la función del RTC y byte no se suficiente para alamacenar el número.

Un saludo

A ver....

Un byte contiene un numero de 0 a 255.
Si ves el datasheet de tu RTC => http://datasheets.maxim-ic.com/en/ds/DS3231.pdf
Pag 11 => puedes ver los "range" de tus datos.
cual es el problema?? Te va a devolver algo como (fecha de hoy)
Anyo=11, Mes=02, Dia=14

No hay ningun problema en sumar variables de tipo byte y almacenarlas en un unsigned long (ya que la suma va a ser mas pequenya que el maximo numero que puede albergar unsigned long).

Ahora que hemos cambiado de hora, he encontrado una forma bastante sencilla, empleand la "congruencia de Zeller". En este artículo lo explican:
http://latecladeescape.com/recetas-algoritmicas/ya-estamos-otra-vez-con-el-dichoso-cambio-de-hora.html

He mirado el codigo y no lo entiendo, como sabe el cambio?

Salu2

En el enlace que puse viene explicado, y también en la wikipedia, pero esa explicación no la entiendo

Lo que calculamos es el último domingo de Marzo y el último domingo de Octubre (las 2 de la madrugada del sábado al domingo ya es el domingo) y si la fecha actual es posterior al último domingo de Marzo, y anterior al último domingo de octubre, entonces es horario de verano (lo almaceno poniendo la variable horariodeverano a true). Se podría afinar más haciendo el cambio a las 2 de la madrugada, pero a mí me vale si lo hace a las 12 de la noche y me simplifica el código.

La hora, la tengo en UTC y si es horario de verano, cuando voy a escribirla muestro la hora +2, pero si no es horario de verano, muestro la hora +1.

  if  (horariodeverano==true)
  {
    Serial.print(now.hour()+2, DEC);
  }
  else
  {
    Serial.print(now.hour()+1, DEC);
  }

Aquí la función calculacambiohora, que llama a la de Zeller:

void calculacambiohora () {
  DateTime now = RTC.now();
  int anno=now.year();
  //el último domingo de Marzo
  int dhv = 31 - Zeller(anno, 3, 31);
  //el último domingo de Octubre
  int dhi=31 - Zeller(anno,10,31);
  horariodeverano=false;
  if ((( now.month()>3 ) && ( now.month()<10 )) || ( ( now.month()==3 ) && (  now.day()>=dhv)) || ( ( now.month()==10 ) && (  now.day()<dhi)))
  {
    horariodeverano=true;
  }
}


int Zeller(int anno, int mes, int dia)
{
  if (mes <= 2)
  {
    mes = mes + 10;
    anno = anno - 1;
  }
  else
  {
    mes = mes - 2;
  }
  int a = anno % 100;
  int b = anno / 100;
  int resultado =
    (
  700 +
    ((26 * mes - 2) / 10) +
    dia +
    a +
    a / 4 +
    b / 4 -
    2 * b
    ) % 7;
  return resultado;
}

Lo probé el otro día, y por la mañana el arduino-reloj mostraba la hora con el cambio correcto
Saludos