Autor Tema: Manejar rangos de horas  (Leído 8777 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Manejar rangos de horas
« en: 23 de Agosto de 2008, 13:54:13 »
saludos a todos, ya hace bastante que estoy en un problema en manejar rangos de horas, tengo el siguiente problema, muy simple de explicarlo y entenderlo, pero yo lo he visto algo complicado de solucionarlo, lo he solucionado a medias, ya he hecho algunos algoritmos que funcionan a medias, debería funcionar así:

tengo un Reloj de Tiempo real funcionando, con la hora configurada y todo, ahora, tengo que diferenciar 9 horarios dentro de un día, por ejemplo:

horario1 6:00am a 10:15am
horario2 10:15am a 12:20pm
...
...
horario9 11:18pm a 6:00am
horario1 6:00am a 10:15am  y así sucesivamente

y pues se puede ver claramente un problema en el cambio de día porque el horario9 empezó el el día, pero terminará en el siguiente. Los minutos tb cuentan para el rango.

además los horarios son programables por un usuario externo, asi que ese 9no horario podrá ser de esa manera, o comenzar a las 0:00 y ser como un horario0, ahí surge el problema, pues se ven esas características:
-horario9 empieza antes de terminar el día
-horario9 empieza al mismo momento de inicio del día
-horario9 comienza después del inicio del día

de los cuales el 1er punto creo q es el más comflictivo, en realidad podría tratarse como un horario 0

he manejado el 2do y 3er punto facilmente, pero para el primero ya me complico, nose si tienen alguna solucion para mi problema. alguien que pueda ayudarme?

en sintesis mi función debe hacer algo así:
leer hora;
determinar rango de horario; //si es 1, 2, 3, ... 9

en el prog principal, dependiendo del rango de horario se hará una u otra cosa, 9 cosas diferentes en realidad en el transcurso de todo el dia.

Espero puedan ayudarme, muchas gracias de antemano, un saludo.

pd. de ser necesario mi anterior código (solucionando solo 2 puntos) lo coloco si quieren verlo
.

Desconectado maxluis

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 131
Re: Manejar rangos de horas
« Respuesta #1 en: 23 de Agosto de 2008, 14:12:59 »
Estimado Cryn: adjunto algo que me soluciono un problema similar, que saque de este maravilloso foro:

byte tiempomaquina(void)
{
byte salida;
if (T.ON > T.OFF)
     {
     if (reloj>=T.ON || reloj<=T.OFF)
          {
          salida=1;
          }
     else
          {
          salida=0;
          }
     }
else if (T.ON < T.OFF)
     {
     if (reloj>=T.ON && reloj<=T.OFF)
          {
          salida=1;
          }
     else
          {
          salida=0;
          }
     }
return (salida);

fue util cuando la partida es menor que el termino, reloj es la hora de tu rtc.... y salida  lo puedes usar como un false-true para interrogarlo con un if...ojala le sirva..
saludos.
Maxluis.

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: Manejar rangos de horas
« Respuesta #2 en: 23 de Agosto de 2008, 14:23:01 »
Para solucionar el problema del cruce de un dia a otro, lo que puedes hacer es comprobar  si la hora de inicio es menor que la de fin, si se da ese caso entonces estamos ante una temporización que cruza de un dia a otro. Por tanto para que la temporizacion se inicie y termine correctamente lo que habria que hacer es dividirla en dos partes, es decir, a la hora de comprobar si se debe iniciar o detener la temporizacion lo haremos comprobando dos cosas:
- Si la hora actual es mayor o igual que la hora de inicio y la hora de inicio es menor que las 23:59h, la temporización debe de iniciarse.
- Si la hora actual es mayor o igual a 00:00 y menor que la hora de fin, la temporización tambien deberá iniciarse.
Y por supuesto si no se cumple ninguno de los dos casos anteriores la temporizacion debera detenerse.

Te pongo la función que yo me hice para controlar este tema, lo unico que yo trabajo directamente con los minutos transcurridos desde 00:00h del dia actual, puesto que eso facilita a la hora de trabajar.

Código: [Seleccionar]
/**
 * Comprueba si hay que iniciar o detener una temporización dada por una hora de inicio y otra de fin.
 * @param inicio Hora de inicio en minutos transcurridos desde las 00:00.
 * @param fin Hora de fin en minutos transcurridos desde las 00:00.
 * @return INICIAR si hay que iniciar la temporización, DETENER si hay que detenerla o NONE si no hay que hacer nada.
 */
BYTE Utils_CheckTemporizacion(WORD inicio, WORD fin){

WORD hora = Time_GetMinutes(); //obtiene los minutos transcurridos desde las 00:00h

if(inicio > fin){ //caso de que la hora inicio y fin cruce un dia
if(((hora >= inicio)&&(hora < 1439))||((hora >= 0)&&(hora < fin))){ //la hora esta entre la hora de inicio y las 23:59h
return INICIAR; // o la hora es mayor que las 00:00h y menor que la hora de fin
}else{
return DETENER;
}
}else if(inicio < fin){ //caso que la hora inicio y fin este dentro del mismo dia
if((hora >= inicio)&&(hora < fin)){
return INICIAR;
}else{// if(hora >= fin){
return DETENER;
}
}
return NONE;
}

Un saludo.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Manejar rangos de horas
« Respuesta #3 en: 23 de Agosto de 2008, 16:03:27 »
Hola.

Pues, segun lo que entiendo  :lol: , yo trabajaria los rangos de temporizacion solo en minutos, o sea pasaria las horas a minutos para reducir confusiones y de esta manera hago los proceso que halla que hacer solo teniendo en cuenta cuantos minutos dura cada intervalo y para lo del cambio del dia usaria el registro del reloj que lleva la cuenta del dia. De esta manera, para saber si estoy en el otro dia o no, solo comparo el registro del dia con el registro inicial.

Saludos.
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Manejar rangos de horas
« Respuesta #4 en: 25 de Agosto de 2008, 12:05:38 »
gracias pors las respuestas, ahora mismo me pongo a estudiarlas.

MLO, dime lo que no has entendido porfavor, traté de expresar muchas ideas en pocas palabras, para no hacer larga la pregunta y no se aburran leyendo tanta lata, pero quizá por eso se me olvido hacer una buena explicación, creo que eso siempre me pasa, bueno MLO dime lo que quieras que te aclare y con gusto te lo explico mejor, nose en que parte este lo enredado.

con respecto a contar minutos, sería una buena opción intentaré hacer algo con ello

muchas gracias a todos, un saludo.
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Manejar rangos de horas
« Respuesta #5 en: 25 de Agosto de 2008, 14:36:46 »
Hola.

Podrias trabajar las horas en formato militar para que no halla enredos en las comparaciones para asignar el tipo de horario. Con que reloj estas trabajando amigo Cryn?

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Manejar rangos de horas
« Respuesta #6 en: 25 de Agosto de 2008, 14:41:37 »
caray se me olvido decirles, si estoy con horario militar, solo que en la 1ra explicación se veía bien con horario no militar :D

estoy usando un ds1307.

como haría esas comparaciones?
.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Manejar rangos de horas
« Respuesta #7 en: 25 de Agosto de 2008, 14:57:22 »
pero en el horario militar las 11:30 PM no  serian las 23300, con esto me parece que la comparacion se puede facilitar, pero lo que a  mi no me queda claro es en que momento realizas la comparacion, es decir, guardas los rangos en memoria, y cada cierto tiempo vas leyendo la hora actual y comparas con los valores guardados?.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Manejar rangos de horas
« Respuesta #8 en: 25 de Agosto de 2008, 15:05:35 »
disculpa la confusión, pero si estoy usando horario militar desde siempre, en la explicación solo era un ejemplo

si, cada cierto tiempo leo la hora y tendría que comparar con los datos guardados.
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Manejar rangos de horas
« Respuesta #9 en: 25 de Agosto de 2008, 17:52:37 »
Hola amigo Cryn.

Yo creo que la confusion entre los horarios 1 y 9 esta en que: en el ingreso de los datos del horario no esta implicado el cambio de dia. Creo que para ingresar el horario deberias hacerlo por el numero de horario (mostrando en pantalla la hora correspondiente) para que el ususario lo escoja (entre 1 y 9  :lol:), y en el horario9 mostrar otro simbolo que indique que se trata del otro dia.

Ya cuando inicies la temporizacion solo basta con comparar una vez la hora y de ahi, como ya estan asignados los minutos a temporizar en cada horario, seguir en orden de horas las demas comparaciones a las horas correspondientes para ver si se activo o no el horario, habria que activar un flag para ver si se trata de hoy o manana y asi no confundirse. Eso, si las horas de esos horarios no cambia.

No se si fui claro, espero que si  :o .
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Manejar rangos de horas
« Respuesta #10 en: 25 de Agosto de 2008, 18:26:56 »
gracias por la respuesta

primeramente viendo que la mayoría me recomienda que lo trate todo como minutos así lo estoy haciendo y ya lo entendí :-/

sobre el 9no horario si empieza o no en el mismo día y continua en el otro lo decidirá el usuario, yo no puedo decirle que el noveno siempre comenzará en un día u otro, de ahí el problema, por eso debo programar para que el usuario loco sea el que decida las horas que mejor le convengan, talvez eso me complica en programación, pero le hace la vida muy feliz al usuario :D las horas una vez fijadas solo se pueden modifcar si el usuario asi lo quiere, sino se quedan asi por mucho tiempo, o quizá para siempre :mrgreen:

nose si era eso lo que querias decir, o talvez ya nos rayamos los dos :D

.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Manejar rangos de horas
« Respuesta #11 en: 25 de Agosto de 2008, 19:25:46 »
Hola.

Ahora si que me enrede  :(. Si el horario 9 siempre comienza a esa hora y termina a las 6 del otro dia el usuario no podra elegir si es del otro dia!!! no entiendo ... a menos que el horario solo se fije por la hora inicial ... es asi? solo importa la hora de inicio para seleccionar a que horario pertenece?

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Manejar rangos de horas
« Respuesta #12 en: 26 de Agosto de 2008, 11:44:36 »
caray, disculpa el enredo, se me olvido aclarar ese detalle, y la respuesta es si, la hora de fin de un horario es la hora de inicio de su consecutivo. Solo se configurará las horas de inicio
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Manejar rangos de horas
« Respuesta #13 en: 26 de Agosto de 2008, 19:00:08 »
quiero comentarles que he solucionado mi problema de la forma que me la han recomendado, usando todo en minutos y con el if de si inicio>fin y la he adecuado a mis ocho horarios, quizá nose entienda, pero se los coloco para que si alguien alguna vez lo necesita pueda usarlo:

Código: C
  1. /*
  2. se lee la hora del RTC con la funcion get_hora(), en variables hora,min y seg
  3. minsd, min1, mins2,... mins8 son los datos de hh:mm convertidos a solo minutos de inicio de cada horario
  4. le llame al 9no horario minsd, pues como casi siempre esta en horarios nocturnos es el horario de dormir :D
  5. min_pas es la cantidad de minutos pasados desde las 00:00 hrs, de la lectura de la hora actual
  6. el valor que devuelve salto_hora es el horario en que se encuentra el programa.
  7.  
  8. */
  9.  
  10. long min_pasados(void){   // devuelve la cantidad de minutos q han pasado desde las 0hrs
  11.    int16 minuts;
  12.    
  13.    minuts=_mul(hora,60);
  14.    minuts+=min;
  15.    return(minuts);
  16. }
  17.  
  18. int1 en_rango(int16 inicio,int16 fin){
  19.    if(inicio>fin){   //caso de que la hora inicio y fin cruce un dia
  20.       if(((min_pas>=inicio)&&(min_pas<1439))||((min_pas>=0)&&(min_pas<fin)))   //la hora esta entre la hora de inicio y las 23:59h
  21.          return(1);                                       // o la hora es mayor que las 00:00h y menor que la hora de fin
  22.       else
  23.          return(0);
  24.    }
  25.    else if(inicio<fin){    //caso que la hora inicio y fin este dentro del mismo dia
  26.       if((min_pas>=inicio)&&(min_pas<fin))
  27.          return(1);
  28.       else
  29.          return(0);
  30.    }
  31. }
  32.  
  33. int salto_hora(void){
  34.    get_hora();    // lee la hora del rtc y lo guarda en hora, min, seg
  35.    min_pas=min_pasados();
  36.    if(en_rango(minsd,mins1) && minsd!=OFF)
  37.       return(9);
  38.    if(en_rango(mins1,mins2) && mins1!=OFF)
  39.       return(0);
  40.    if(en_rango(mins2,mins3) && mins2!=OFF)
  41.       return(1);
  42.    if(en_rango(mins3,mins4) && mins3!=OFF)
  43.       return(2);
  44.    if(en_rango(mins4,mins5) && mins4!=OFF)
  45.       return(3);
  46.    if(en_rango(mins5,mins6) && mins5!=OFF)
  47.       return(4);
  48.    if(en_rango(mins6,mins7) && mins6!=OFF)
  49.       return(5);
  50.    if(en_rango(mins7,mins8) && mins7!=OFF)
  51.       return(6);
  52.    if(en_rango(mins8,minsd) && mins8!=OFF)
  53.       return(7);
  54. }

espero se pueda entender, y muchas gracias a todos por sus consejos y su ayuda :-/

un saludo amigos.
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Manejar rangos de horas
« Respuesta #14 en: 27 de Agosto de 2008, 00:20:55 »
Felicitaciones Cryn  :-/ :-/

Saludos
El papel lo aguanta todo


 

anything