|
En este segundo tutorial sobre Arduino les enseñaremos a usar un modulo RTC (Real Time Clock) mediante el bus I2C. Usaremos una librería que nos facilitará la comunicación entre este modulo y Arduino. El modulo que emplearemos es el Tiny RTC I2C que incorpora un reloj de tiempo real serie DS1307, una batería para memorizar los datos y una pequeña memoria EEPROM 24C32; nos centraremos solo en el reloj DS1307 por lo que este tutorial y librería vale para todo modulo que tenga el DS1307.

Arduino incorpora sus propios temporizadores, uno de ello es millis(). Muchos usuarios se preguntaran para que usar un modulo externo temporizador, la respuesta es sencilla, los temporizadores de Arduino son contadores que cuando se inician empiezan desde 0, por ejemplo millis() se inicia una vez conectemos la alimentación de Arduino, es el contador encargado de indicar cuanto tiempo lleva encendido Arduino, y una vez se pierde la alimentación, este valor desaparece. Podemos entender entonces, que para algunos proyectos que necesitemos usar el tiempo como variable, estos contadores no nos servirían y necesitaríamos un RTC externo que posea una batería para almacenar los datos.
Comenzaremos conectando el modulo a nuestra placa Arduino, es sencillo de conectar ya que usa una comunicación I2C.
 Esquema Arduino Mega
 Esquema Arduino Uno

 Una vez conectado, tendremos que añadir la librería RTClib a la IDE de Arduino. La descargaremos y descomprimiremos en X:\diretorio IDE\libraries
Esta librería se apoya en la librería Wire para la comunicación I2C, por lo que tendremos que hacer referencia a ella he incluirla en nuestro código. No os preocupes, la librería Wire ya viene por defecto añadida a la IDE.
Cargaremos el siguiente código en nuestro Arduino:
#include <Wire.h> // Incluye la librería Wire
#include "RTClib.h" // Incluye la librería RTClib
RTC_DS1307 RTC; // Crea el objeto RTC
void setup () {
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin(); // Establece la velocidad de datos del RTC
}
void loop () {
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000); // La información se actualiza cada 1 seg.
}
Una vez cargado, abrimos el Monitor Serie de la IDE Arduino (9600 baudios). Si es la primera vez que usamos nuestro RTC veremos:
 Esto indica que no se ha establecido nunca la fecha y hora en el RTC o se quito la batería de este.
El siguiente paso es configurar nuestro RTC con la fecha y hora actual. En este punto, es necesario tener la fecha correcta de nuestro PC, ya que será la que se establecerá en el RTC. Para esto, compilaremos y cargaremos el siguiente código. Es de vital importación, que compilemos y carguemos el código con la mayor rapidez posible entre un paso y otro, porque cuando compilamos se genera un archivo .hex con su fecha de modificación, y es esta fecha es la que se cargará en el RTC. (En la versión 1.0.1 del IDE Arduino, cuando cargamos se compila el proyecto automáticamente)
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora
}
void loop () {
}
Una vez cargado el código anterior, volveremos a cargar el primer código para ver si ha tomado correctamente la fecha:
#include <Wire.h> // Incluye la librería Wire
#include "RTClib.h" // Incluye la librería RTClib
RTC_DS1307 RTC; // Crea el objeto RTC
void setup () {
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin(); // Establece la velocidad de datos del RTC
}
void loop () {
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000); // La información se actualiza cada 1 seg.
}
 Si todo es correcto veremos la fecha actual como se muestra en la imagen.
Podremos comprobar que desconectando la alimentación, y no la batería, la fecha y hora seguirá siendo la correcta.
La librería RTClib tiene una función que merece la pena mencionar, esta función es dayOfWeek() Es una función que devuelve el valor del día de la semana, es decir, si es lunes retornara un 1, si es martes un 2, si es miércoles un 3 y así sucesivamente. En el siguiente código vemos como se usa:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
}
void loop () {
DateTime now = RTC.now();
Serial.print("Dia de la semana: ");
Serial.println(now.dayOfWeek(), DEC);
Serial.println();
delay(1000);
}

Autor: FjRamirez
Otros artículos relacionados
|