Go Down

Topic: Código horario verano/invierno (Read 5 times) previous topic - next topic

acarreo

#15
Feb 13, 2011, 04:18 pm Last Edit: Feb 13, 2011, 04:45 pm by acarreo Reason: 1
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:

Code: [Select]
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

acarreo

#16
Feb 13, 2011, 08:03 pm Last Edit: Feb 13, 2011, 09:17 pm by acarreo Reason: 1
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)

Code: [Select]
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

Imagina

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)

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



Igor R

#18
Feb 14, 2011, 11:39 am Last Edit: Feb 14, 2011, 11:48 am by Igor R Reason: 1
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....

;)

Igor R

#19
Feb 14, 2011, 12:15 pm Last Edit: Feb 14, 2011, 12:27 pm by Igor R Reason: 1
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... ;) . 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??

Go Up