Módulo Reloj DS3231 con I2C Arduino
Publicado por Victor Arrieta en
Este módulo de reloj es capaz de llevar la hora de forma precisa y mantenerla durante un tiempo indefinido aún si se desconecta su alimentación, debido a su pila interna CR2032 de 3V, capaz de permanecer en funcionamiento hasta por 10 años. Funciona con un oscilador de cristal compensado por temperatura, de ahí su gran precisión. Tiene también un módulo interno de memoria EEPROM que le permite almacenar alarmas y ciertas funciones especiales.
Se comunica por medio de protocolo I2C, lo cual le da la ventaja de necesitar un mínimo de sólo 4 pines para su funcionamiento y control, un pin para señal de reloj, uno para datos y dos para alimentación. Cuenta también con un pin con una señal de reloj de 32KHz para usos varios y un pin (SQW) que emite una onda cuadrada cuyas características puedes ser modificadas por medio de la comunicación por I2C; ambos pines requieren un pull up para funcionar correctamente y en caso de no usarlos se pueden dejar desconectados.
Para hacer uso del conjunto se hace necesaria la librería “Wire.h”, que nos permite la comunicación por I2C y la librería “DS3231.h” que controla al reloj. A continuación te facilitamos el enlace para que descargues la librería:
https://github.com/NorthernWidget/DS3231
Los pines del conjunto son:
VCC = Alimentación de 5 Voltios
GND = Referencia negativa
SDA = Pin de datos
SCL = Pin de señal de reloj
32K = Señal de reloj 32K / se puede no conectar
SQW = Señal de onda cuadrada / se puede no conectar
Esquema de conexión Arduino UNO:
Código y comandos básicos para configurar y obtener hora:
Grabar:
#include <DS3231.h> // se incluye la librería del módulo
#include <Wire.h> // se incluye la librería del I2C
// fecha y hora a guardar
int year = 17;
int month = 8;
int date = 19;
int hour = 12;
int minute = 0;
int second = 0;
DS3231 Clock; // se direcciona automáticamente el hardware
void setup() {
// Se inicial la interfaz I2c
Wire.begin();
//Se establece el modo horario en 24 horas (true = 12h)
Clock.setClockMode(false);
//Se establece el año
Clock.setYear((byte)year);
//Mes
Clock.setMonth((byte)month);
//Día
Clock.setDate((byte)date);
//Hora
Clock.setHour((byte)hour);
//Minutos
Clock.setMinute((byte)minute);
//Segundos
Clock.setSecond((byte)second);
}
void loop() {
}
Obtener:
#include <DS3231.h>
#include <Wire.h>
DS3231 Clock; // Direccionamiento del hardware
RTClib RTC; // Declaración de la función RTC
int year, month, date, hour, minute, second;
//se declaran variables para guardar fecha y hora obtenida
void setup() {
//se inicia la comunicación por I2C
Wire.begin();
// Se inicia la Comunicación Serial
Serial.begin(9600);
}
void loop() {
//Se llama la función que permite obtener la fecha y la hora
DateTime now = RTC.now();
//Se obtiene la fecha y la hora y se guarda en su respectiva variable
year = now.year();
month = now.month();
date = now.day();
hour = now.hour();
minute = now.minute();
second = now.second();
//Se imprime en le puerto serial
Serial.print(year,DEC);
Serial.print("/");
Serial.print(month);
Serial.print("/");
Serial.print(date);
Serial.print(" ");
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);
delay(1000); //retardo de un segundo
}