RTC Real time Clock (reloj en timpo real)

Hola, quiero controlar dos eventos con cierta precisión en el tiempo. He escuchado que con un RTC lo puedo hacer, aunque nunca he trabajado con ellos.

La idea básicamente es encender un aparato a las 7 PM (19:00) y apagarlo a las 7 AM (7:00), ya tengo la etapa de potencia lista, y lo estaba trabajando con una LDR y comparadores de voltaje con histeresis, pero es inexacto y ya me "aburri" de ajustarlo. Por lo cual he considerado la opción con RTC. Ademas de alimentarlo con una batería tipo CR2032.

Me pueden recomendar algún circuito o idea para este fin.
 
Hola, quiero controlar dos eventos con cierta precisión en el tiempo. He escuchado que con un RTC lo puedo hacer, aunque nunca he trabajado con ellos.

La idea básicamente es encender un aparato a las 7 PM (19:00) y apagarlo a las 7 AM (7:00), ya tengo la etapa de potencia lista, y lo estaba trabajando con una LDR y comparadores de voltaje con histeresis, pero es inexacto y ya me "aburri" de ajustarlo. Por lo cual he considerado la opción con RTC. Ademas de alimentarlo con una batería tipo CR2032.

Me pueden recomendar algún circuito o idea para este fin.

Hola...Como lo veo yo...¿sabias que existen este tipo de cosas? Buscar en Mercadolibre: MLA-605272549-timer-digital-programable-enchufable-_JM buscas en tu país.
La otra es micro-controlador, RTC tipo los DSxxxx mira acá.
Saludos.

Ric.
 
Hola...Como lo veo yo...¿sabias que existen este tipo de cosas? Buscar en Mercadolibre: MLA-605272549-timer-digital-programable-enchufable-_JM buscas en tu país.
La otra es micro-controlador, RTC tipo los DSxxxx mira acá.
Saludos.

Ric.

Me inclino por la segunda opción, no quiero algo ya hecho, quiero construirlo yo mismo.

Pero quiero saber si con el ds1307 u otro similar, es posible hacerlo directamente sin microcontroladores, o necesariamente debo tener un micro que interprete las señales del RTC.

Gracias
 
de hecho un micro puede imitar un ds1307, ya que este tiene internamente un crystal de 32.768 kHz (algunos, no todos) y el timer0, en modo de bajo voltaje (2V-3.3V). La cuestión sería programarlo.
 
Pues, si, es necesario el MCU, los chips que son RTC solo son eso :p no están pensados para programarse, sino para llevar el control de tiempo independiente del sistema principal, por otra parte esta también que los microcontroladores que admiten relojes secundarios de 32,768Hz pueden programarse para RTC con el timer y un poco de código, para alimentarlo a bajo voltaje si necesitaras MCU diferentes a los clásicos PIC que se compran fácilmente (el problema con ellos es que básicamente la mayoría son para operar sobre 4V), los MSP430 de Texas Instruments tienen bajo consumo y serian apropiados.
 
lo acabo de hacer con un arduino asi para formato 12 horas y un rtc ds1307.
estaba buscando por toda la red como hacerlo pero nadie lo explica, debe ser por lo fácil que es ,pero yo no se nada de programación
// Wire.beginTransmission(RTCAddress); //RTCAddress es la direccion I2c del reloj
//Wire.write(2); //direccion del registro hora
// Wire.write(0x52);//valor que se escribe en el registro en binario 0101 0010 ( 12 de la noche AM y formato 12)
// Wire.endTransmission();
 
lo acabo de hacer con un arduino asi para formato 12 horas y un rtc ds1307.
estaba buscando por toda la red como hacerlo pero nadie lo explica, debe ser por lo fácil que es ,pero yo no se nada de programación
// Wire.beginTransmission(RTCAddress);
//Wire.write(2);//direccion del registro hora
// Wire.write(0x52);//valor que se escribe en el registro en binario 0101 0010 ( 12 de la noche AM y formato 12)
// Wire.endTransmission();
¿Cual es tu pregunta?
Estás reviviendo un hilo de 2016 para comentar sin preguntar.
Supongo que sabes que el "código" que muestras está comentado y que no hace nada...
 
¿Cual es tu pregunta?
Estás reviviendo un hilo de 2016 para comentar sin preguntar.
Supongo que sabes que el "código" que muestras está comentado y que no hace nada...
si... tengo tiempo buscando informacion de como poner a trabajar el RTC en modo 12 H
como no se programacion, ahorita estaba haciendo las pruebas y haci pude hacerlo.

Wire.beginTransmission(RTCAddress);
Wire.write(2);//direccion del registro hora
Wire.write(0x52);//valor que se escribe en el registro en binario 0101 0010 ( 12 de la noche AM y formato 12)
Wire.endTransmission();
 
si... tengo tiempo buscando informacion de como poner a trabajar el RTC en modo 12 H
como no se programacion, ahorita estaba haciendo las pruebas y haci pude hacerlo.

Wire.beginTransmission(RTCAddress);
Wire.write(2);//direccion del registro hora
Wire.write(0x52);//valor que se escribe en el registro en binario 0101 0010 ( 12 de la noche AM y formato 12)
Wire.endTransmission();
Revisa los registros de la hoja de datos. El código que pusiste primero le dice al reloj que escribirás en la dirección 2 y el segundo es el valor que cargarás.
1691491621335.png
Si vemos la tabla la dirección 2 maneja las horas, el bit 6 establece si es formato de 12 o 24hrs cuando es 1 como en el ejemplo 0101 0010 se indica que sea en 12 hora, en ese caso el bit 5 cuando es 1 = pm y 0 =am, las 10 en el bit 4 y los bits 0 a 3 las unidades.
 
Revisa los registros de la hoja de datos. El código que pusiste primero le dice al reloj que escribirás en la dirección 2 y el segundo es el valor que cargarás.
Ver el archivo adjunto 302363
Si vemos la tabla la dirección 2 maneja las horas, el bit 6 establece si es formato de 12 o 24hrs cuando es 1 como en el ejemplo 0101 0010 se indica que sea en 12 hora, en ese caso el bit 5 cuando es 1 = pm y 0 =am, las 10 en el bit 4 y los bits 0 a 3 las unidades.
es correcto...tan fácil como eso, pero yo estoy empezando con esto de arduino y cuando uno no sabe nada todo es difícil.
Como puede hacer para cambiar o leer solo el bit del registro, por ejemplo solo leer el bit de am y pm o cambiar el BIT 6 de formato 12/24 sin alterar los demás bit?
 
es correcto...tan fácil como eso, pero yo estoy empezando con esto de arduino y cuando uno no sabe nada todo es difícil.
Como puede hacer para cambiar o leer solo el bit del registro, por ejemplo solo leer el bit de am y pm o cambiar el BIT 6 de formato 12/24 sin alterar los demás bit?
Hola, no hay tanta magia.

Es leer todo el registro, cambiar el bit y escribir nuevamente todo el registro. No es posible escribir solo un bit y eso no es por una u otra librería, eso ya está determinado por el mismo chip RTC.

Entonces vas hacer los pasos de lectura del registro, obtendrás 1 byte, cambias el bit (lo enmascaras) o usas alguna función a nivel de bits y vuelves a escribir el mismo registro con el contenido del byte cambiado.

Saludos
 
es correcto...tan fácil como eso, pero yo estoy empezando con esto de arduino y cuando uno no sabe nada todo es difícil.
Como puede hacer para cambiar o leer solo el bit del registro, por ejemplo solo leer el bit de am y pm o cambiar el BIT 6 de formato 12/24 sin alterar los demás bit?
usas operadores a nivel de bit, por ejemplo, leerlo lo puedes hacer con AND directamente, si ocupas hacer una prueba con if por ejemplo usarías esto
C++:
  byte reg2 = 0x52;
 
  int horasDecenas = (reg2 & bit(4)) >> 4; //se enmascara y se desplaza 4 posiciones.
  int horasUnidades = reg2 & 0x0F; //Se enmascara solo el nibble menos significativo

  Serial.print(horasDecenas);
  Serial.print(horasUnidades);
  if (reg2 & bit(5)) {
    //Código para cuando es PM
    Serial.print("PM");
  } else {
    //Código para cuando es AM
    Serial.print("AM");
  }

En los if && es lógico, pero en este caso &(AND) es un operador matemático que básicamente va a multiplicar cada bit con el respectivo bit en la misma posición, el resultado es que si el bit 5 es 1 tendrás al final 16 mientras que si es cero el resultado es 0, dentro de un if, cualquier valor distinto a 0 se considera verdadero. Para la hora lo puedes hacer similar, las unidades son más simple de hecho, en las decenas puedes usar corrimiento de carro.

Para escribirlo si lo vamos a editar primero leemos y luego.
C++:
  byte actHora = reg2 & 0b11000000; //los bit que vamos a editar los filtramos reiniciandolos a 0
  byte horaDecena = 1;
  byte horaUnidad = 34;
  actHora |= bit(5) | (horaDecena << 4) | horaUnidad; //bit(5) lo omitimos si es AM igual puedes poner eso en un if
  Serial.println(actHora, BIN); //aqui lo imprimo en consola pero lo envias como viste anteriormente
El operador l (ojo, que es una barra, no una L, en el teclado ESP lo tienes con Alt Gr + tecla 1, en el latinoamericano directo en la tecla al lado del 1) lo puedes sustituir por +, este es el de OR que sería una suma binaria sin el acarreo de bit por lo que es más "fácil" de procesar cuando se compone el comando.

Por cierto, cambiar de 12 a 24 te fuerza a reescribir todo el dato ya que tiene que calcularse de nuevo, podría usar esto como ejemplo

C++:
reg2 = 0b00010110; //El dato que procesaremos
  byte cambiarformato; //Variable para almacenar el nuevo dato
  horaUnidad = reg2 & 0x0F; // Extraemos las unidades
  if(reg2 & bit(6)) { //Detectamos si esta en modo de 12 horas
    horaDecena = (reg2 & bit(4)) >> 4; //Extraemos las decenas
    if(reg2 & bit(5)){ //Si era PM
      horaDecena += 1; //Agregamos 1 a las decenas
      horaUnidad += 2; //Agregamos 2 a las unidades
      if(horaUnidad > 9) { //corregimos el desborde si la suma excede las unidades.
        horaUnidad -= 10;
        horaDecena += 1;
      }
    }
    cambiarformato = (horaDecena << 4) | horaUnidad; //Nuevo valor a 24hrs
  } else { //Si esta en modo de 24 horas
    horaDecena = (reg2 & (bit(4)+bit(5))) >> 4; //Extraemos las decenas
    if((horaDecena == 2)||((horaDecena == 1) && (horaUnidad > 2))){ //Si el tiempo las decenas horas son 2 o (decenas 1 Y unidades mayor a 2)
      horaDecena -= 1; //Restamos 1 a las decenas
      horaUnidad -= 2; //Restamos 2 a las unidades
      cambiarformato = bit(5); //establecemos como PM
    }
    cambiarformato |= bit(6)| (horaDecena << 4) | horaUnidad; //Cargamos bit 6 para marcar como 12hrs y las horas.
  }
 
  Serial.println(cambiarformato, BIN);
 
Última edición:
usas operadores a nivel de bit, por ejemplo, leerlo lo puedes hacer con AND directamente, si ocupas hacer una prueba con if por ejemplo usarías esto
C++:
  byte reg2 = 0x52;
 
  int horasDecenas = (reg2 & bit(4)) >> 4; //se enmascara y se desplaza 4 posiciones.
  int horasUnidades = reg2 & 0x0F; //Se enmascara solo el nibble menos significativo

  Serial.print(horasDecenas);
  Serial.print(horasUnidades);
  if (reg2 & bit(5)) {
    //Código para cuando es PM
    Serial.print("PM");
  } else {
    //Código para cuando es AM
    Serial.print("AM");
  }

En los if && es lógico, pero en este caso &(AND) es un operador matemático que básicamente va a multiplicar cada bit con el respectivo bit en la misma posición, el resultado es que si el bit 5 es 1 tendrás al final 16 mientras que si es cero el resultado es 0, dentro de un if, cualquier valor distinto a 0 se considera verdadero. Para la hora lo puedes hacer similar, las unidades son más simple de hecho, en las decenas puedes usar corrimiento de carro.

Para escribirlo si lo vamos a editar primero leemos y luego.
C++:
  byte actHora = reg2 & 0b11000000; //los bit que vamos a editar los filtramos reiniciandolos a 0
  byte horaDecena = 1;
  byte horaUnidad = 34;
  actHora |= bit(5) | (horaDecena << 4) | horaUnidad; //bit(5) lo omitimos si es AM igual puedes poner eso en un if
  Serial.println(actHora, BIN); //aqui lo imprimo en consola pero lo envias como viste anteriormente
El operador l (ojo, que es una barra, no una L, en el teclado ESP lo tienes con Alt Gr + tecla 1, en el latinoamericano directo en la tecla al lado del 1) lo puedes sustituir por +, este es el de OR que sería una suma binaria sin el acarreo de bit por lo que es más "fácil" de procesar cuando se compone el comando.

Por cierto, cambiar de 12 a 24 te fuerza a reescribir todo el dato ya que tiene que calcularse de nuevo, podría usar esto como ejemplo

C++:
reg2 = 0b00010110; //El dato que procesaremos
  byte cambiarformato; //Variable para almacenar el nuevo dato
  horaUnidad = reg2 & 0x0F; // Extraemos las unidades
  if(reg2 & bit(6)) { //Detectamos si esta en modo de 12 horas
    horaDecena = (reg2 & bit(4)) >> 4; //Extraemos las decenas
    if(reg2 & bit(5)){ //Si era PM
      horaDecena += 1; //Agregamos 1 a las decenas
      horaUnidad += 2; //Agregamos 2 a las unidades
      if(horaUnidad > 9) { //corregimos el desborde si la suma excede las unidades.
        horaUnidad -= 10;
        horaDecena += 1;
      }
    }
    cambiarformato = (horaDecena << 4) | horaUnidad; //Nuevo valor a 24hrs
  } else { //Si esta en modo de 24 horas
    horaDecena = (reg2 & (bit(4)+bit(5))) >> 4; //Extraemos las decenas
    if((horaDecena == 2)||((horaDecena == 1) && (horaUnidad > 2))){ //Si el tiempo las decenas horas son 2 o (decenas 1 Y unidades mayor a 2)
      horaDecena -= 1; //Restamos 1 a las decenas
      horaUnidad -= 2; //Restamos 2 a las unidades
      cambiarformato = bit(5); //establecemos como PM
    }
    cambiarformato |= bit(6)| (horaDecena << 4) | horaUnidad; //Cargamos bit 6 para marcar como 12hrs y las horas.
  }
 
  Serial.println(cambiarformato, BIN);
deja procesar eso porque soy principiantes y si colocas comandos nuevos menos voy a entender ... y estoy programando con el IDE de arduino.
y me ayuda mucho el comentario//
 
Atrás
Arriba