ok, gracias por el dato, voya aver de hacer el experimento fisicamente, espero de resultado
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
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.
¿Cual es tu pregunta?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();
si... tengo tiempo buscando informacion de como poner a trabajar el RTC en modo 12 H¿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...
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.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();
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.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.
Hola, no hay tanta magia.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 estoes 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?
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");
}
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
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.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.
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.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
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);