Hola querido lect@r, en este proyecto veremos como configurar un pequeño modulo de tiempo real con arduino (El Modulo RTC Tiny es común y económico). Este modulo se compone entre otros elementos de un reloj DS1307, una memoria EEPROM 24C32AN y un soporte para pila de litio CR2032.
Gracias a la pila de litio y a la memoria EEPROM el módulo almacena los datos y sigue en funcionamiento aunque desconectemos Arduino y por lo tanto cuando lo volvamos a encender seguiremos teniendo la hora correcta.
Pero primero debemos configurarlo a la hora actual antes siguiendo las instrucciones del código 1, sin olvidarnos de instalar las librerías necesarias antes de nada. Linck de la información original aquí.
Y luego volviendo a subir el código 1 cuando hayamos seguido las instrucciones para dejarla a la hora correcta ya configurada en nuestro pequeño modulo.
Podemos comprobar si todo esta ok con el código 2 y su librería RTClib. Ya que este segundo código brinda la opción de mostrar la hora del modulo o la de ordenador si seguimos sus instrucciones.
Espero que les sirva y ayude, saludos de GUILLENXT.
CODIGO 1
#include <Wire.h> // Por alguna extraña razón, Wire.h debe incluirse aquí
#include <DS1307new.h>
// *********************************************
// DEFINIENDO
// *********************************************
// *********************************************
// VARIABLES
// *********************************************
uint16_t startAddr = 0x0000; // Dirección inicial para almacenar en la NV-RAM
uint16_t lastAddr; // Nueva dirección para el almacenamiento en la NV-RAM
uint16_t TimeIsSet = 0xaa55; // Ayuda que el tiempo no debe establecer de nuevo
// *********************************************
// SETUP
// *********************************************
void setup()
{
pinMode(2, INPUT); // Prueba del pasador SQW, D2 = ENTRADA
digitalWrite(2, HIGH); // Prueba del pasador SQW, D2 = ALTO
Serial.begin(9600);
/*
Note por favor: HEMOS HECHO UN CAMBIO DIRECCIÓN PARA LA NV-RAM!
NV-RAM DIRECCIÓN 0x08 TIENE QUE CURSAR CON DIRECCIÓN 0x00 = 0
Para evitar sobrescribir LOS REGISTROS DEL RELOJ EN CASO DE
Errores en el código. LO QUE LA DIRECCIÓN ES LA ÚLTIMA 0x38 = 56!
*/
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08
/*
Elimine el comentario de las siguientes 2 líneas si desea ajustar el reloj
Comentario hacia fuera si el reloj está ajustado.
NO ME PREGUNTE POR QUÉ: DEBE SUBIR EL CÓDIGO dos veces para dejarlo trabajar
DESPUÉS DE AJUSTE DEL RELOJ UNA VEZ.
*/
//TimeIsSet = 0xffff;
//RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
/*
Control del reloj.
Reloj sólo se establecerá si la Dirección NV-RAM no contiene 0xaa.
DS1307 deben tener una copia de seguridad de la batería.
*/
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet != 0xaa55)
{
RTC.stopClock();
// FECHA A CAMBIAR //
RTC.fillByYMD(2013,12,13);
RTC.fillByHMS(18,03,0);
RTC.setTime();
TimeIsSet = 0xaa55;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
RTC.startClock();
}
else
{
RTC.getTime();
}
/*
Registro de Control de pin SQW que se puede utilizar como una interrupción.
*/
RTC.ctrl = 0x00; // 0x00 = desactivar pin SQW, 0x10 = 1 Hz,
// 0x11 = 4096Hz, 0x12 = 8192Hz, 0x13 = 32768Hz
RTC.setCTRL();
Serial.println("Tiempo Actual");
uint8_t MESZ;
Serial.println();
}
// *********************************************
// LOOP
// *********************************************
void loop()
{
RTC.getTime();
if (RTC.hour < 10) // hora correcta si es necesario
{
Serial.print("0");
Serial.print(RTC.hour, DEC);
}
else
{
Serial.print(RTC.hour, DEC);
}
Serial.print(":");
if (RTC.minute < 10) // minutos corregidos si es necesario
{
Serial.print("0");
Serial.print(RTC.minute, DEC);
}
else
{
Serial.print(RTC.minute, DEC);
}
Serial.print(":");
if (RTC.second < 10) // segundos corregidos si es necesario
{
Serial.print("0");
Serial.print(RTC.second, DEC);
}
else
{
Serial.print(RTC.second, DEC);
}
Serial.print(" ");
if (RTC.day < 10) // fecha correcta, si es necesario
{
Serial.print("0");
Serial.print(RTC.day, DEC);
}
else
{
Serial.print(RTC.day, DEC);
}
Serial.print("-");
if (RTC.month < 10) // mes correcto si es necesario
{
Serial.print("0");
Serial.print(RTC.month, DEC);
}
else
{
Serial.print(RTC.month, DEC);
}
Serial.print("-");
Serial.print(RTC.year, DEC); // Año necesita no ser cambiado
Serial.print(" ");
switch (RTC.dow) // Impresión agradable del día de la semana
{
case 1:
Serial.print("LUNES");
break;
case 2:
Serial.print("MARTES");
break;
case 3:
Serial.print("MIERCOLES");
break;
case 4:
Serial.print("JUEVES");
break;
case 5:
Serial.print("VIERNES");
break;
case 6:
Serial.print("SABADO");
break;
case 7:
Serial.print("DOMINGO");
break;
}
uint8_t MESZ = RTC.isMEZSummerTime();
RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
Serial.print("\n");
lastAddr = lastAddr + 1; // queremos usarlo como contador de direcciones, por ejemplo,
RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet == 0xaa55) // comprobar si el reloj se ajusta o no
{
}
else
{
}
delay(1000); // espera un segundo
}
CODIGO 2
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
//Inicializamos el puerto serie, wire y el modulo RTC
Serial.begin(9600);
Wire.begin();
RTC.begin();
//Si quitamos el comentario de la linea siguiente, se ajusta la hora y la fecha con la del ordenador
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
void loop () {
DateTime now = RTC.now();
//Imprimimos el dia
Serial.print(now.day(), DEC);
Serial.print('/');
//Imprimimos el mes
Serial.print(now.month(), DEC);
Serial.print('/');
//Imprimimos el año
Serial.print(now.year(), DEC);
Serial.print(' ');
//Imprimimos la hora
Serial.print(now.hour(), DEC);
Serial.print(':');
//Imprimimos los minutos
Serial.print(now.minute(), DEC);
Serial.print(':');
//Imprimimos los segundos
Serial.print(now.second(), DEC);
Serial.println();
//Comprobamos la hora y la enviamos por el puerto serie cada 3s
delay(3000);
}
FOTOS Y VIDEOS:
Comentarios
Publicar un comentario