Go Down

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

acarreo

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


acarreo

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)
Code: [Select]
// 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++;
    }
  }


acarreo

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:
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++;
  }
  //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++;
    }
  }
}


Igor R

#23
Feb 14, 2011, 02:49 pm Last Edit: Feb 14, 2011, 02:57 pm by Igor R Reason: 1
Hay varias formas de hacer lo de la fecha, una facil es si tienes anyo,mes y dia en variables numericas:
unsigned long mifecha=anyo*10000+mes*100+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...

;)

acarreo

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

Go Up