Tabla de contenido:

Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino: 3 pasos
Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino: 3 pasos

Video: Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino: 3 pasos

Video: Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino: 3 pasos
Video: Modulo DS1307 y DS3231.- Reloj de Tiempo Real (RTC) ▌CURSO de ARDUINO #15 ⌚️ 2024, Noviembre
Anonim
Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino
Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino
Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino
Uso de módulos de reloj en tiempo real DS1307 y DS3231 con Arduino

Seguimos recibiendo solicitudes sobre cómo usar los módulos de reloj en tiempo real DS1307 y DS3231 con Arduino de varias fuentes, por lo que este es el primero de un tutorial de dos partes sobre cómo usarlos. Para este tutorial de Arduino tenemos dos módulos de reloj en tiempo real para usar, uno basado en el Maxim DS1307 (el módulo cuadrado) y el DS3231 (el módulo rectangular).

Hay dos diferencias principales entre los circuitos integrados de los módulos de reloj en tiempo real, que es la precisión del cronometraje. El DS1307 utilizado en el primer módulo funciona muy bien, sin embargo, la temperatura externa puede afectar la frecuencia del circuito del oscilador que impulsa el contador interno del DS1307.

Esto puede parecer un problema, sin embargo, por lo general, el reloj se retrasará unos cinco minutos al mes. El DS3231 es mucho más preciso, ya que tiene un oscilador interno que no se ve afectado por factores externos y, por lo tanto, tiene una precisión de unos pocos minutos al año como máximo. Si tiene un módulo DS1307, no se sienta mal, sigue siendo una placa de gran valor y le servirá bien. Con ambos módulos, se requiere una batería de respaldo.

Es una buena idea comprar una batería CR2032 nueva e instalarla en el módulo. Además de realizar un seguimiento de la hora y la fecha, estos módulos también tienen una pequeña EEPROM, una función de alarma (solo DS3231) y la capacidad de generar una onda cuadrada de varias frecuencias, todo lo cual será objeto de un segundo tutorial.

Paso 1: Conexión de su módulo a un Arduino

Ambos módulos utilizan el bus I2C, lo que facilita la conexión.

Primero deberá identificar qué pines en su Arduino o placas compatibles se utilizan para el bus I2C; estos se conocerán como SDA (o datos) y SCL (o reloj). En Arduino Uno o placas compatibles, estos pines son A4 y A5 para datos y reloj; En Arduino Mega, los pines son D20 y D21 para datos y reloj; Y si está utilizando un Pro Mini compatible, los pines son A4 y A5 para datos y reloj, que son paralelos a los pines principales.

Módulo DS1307

Si tiene el módulo DS1307, necesitará soldar los cables a la placa o soldar algunos pines del cabezal en línea para poder usar cables de puente. Luego conecte los pines SCL y SDA a su Arduino, y el pin Vcc al pin 5V y GND a GND.

Módulo DS3231

La conexión de este módulo es fácil ya que los pines del cabezal se instalan en la placa en la fábrica. Simplemente puede ejecutar cables de puente nuevamente desde SCL y SDA al Arduino y nuevamente desde los pines Vcc y GND del módulo a los 5V o 3.3. V y GND de su placa. Sin embargo, estos están duplicados en el otro lado para soldar sus propios cables. Ambos módulos tienen las resistencias pull-up requeridas, por lo que no es necesario que agregue las suyas propias. Como todos los dispositivos conectados al bus I2C, intente mantener la longitud de los cables SDA y SCL al mínimo.

Paso 2: leer y escribir la hora de su módulo RTC

Una vez que haya conectado su módulo RTC. ingrese y cargue el siguiente boceto. Aunque las notas y funciones en el esquema se refieren solo al DS3231, el código también funciona con el DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convierte números decimales normales en bytes decimales codificados en binario decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); } // Convertir decimal codificado en binario a números decimales normales byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); } configuración vacía () {Wire.begin (); Serial.begin (9600); // establece la hora inicial aquí: // DS3231 segundos, minutos, horas, día, fecha, mes, año // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte segundo, byte minuto, byte hora, byte dayOfWeek, byte dayOfMonth, byte mes, byte año) {// establece los datos de fecha y hora en DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // establece la siguiente entrada para que comience en el registro de segundos Wire.write (decToBcd (segundo)); // establecer segundos Wire.write (decToBcd (minuto)); // establecer minutos Wire.write (decToBcd (hora)); // establecer horas Wire.write (decToBcd (dayOfWeek)); // establecer el día de la semana (1 = domingo, 7 = sábado) Wire.write (decToBcd (dayOfMonth)); // establecer fecha (1 a 31) Wire.write (decToBcd (mes)); // establecer el mes Wire.write (decToBcd (año)); // establece el año (0 a 99) Wire.endTransmission (); } void readDS3231time (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mes, byte * año) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // establece el puntero del registro DS3231 en 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // solicita siete bytes de datos de DS3231 a partir del registro 00h * second = bcdToDec (Wire.read () & 0x7f); * minuto = bcdToDec (Wire.read ()); * hora = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * mes = bcdToDec (Wire.read ()); * año = bcdToDec (Wire.read ()); } void displayTime () {segundo byte, minuto, hora, dayOfWeek, dayOfMonth, mes, año; // recuperar datos de DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // enviarlo al monitor serial Serial.print (hora, DEC); // convierte la variable de bytes en un número decimal cuando se muestra Serial.print (":"); if (minuto <10) {Serial.print ("0"); } Serial.print (minuto, DEC); Serial.print (":"); if (segundo <10) {Serial.print ("0"); } Serial.print (segundo, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (mes, DEC); Serial.print ("/"); Serial.print (año, DEC); Serial.print ("Día de la semana:"); switch (dayOfWeek) {caso 1: Serial.println ("Domingo"); rotura; caso 2: Serial.println ("Lunes"); rotura; caso 3: Serial.println ("martes"); rotura; caso 4: Serial.println ("miércoles"); rotura; caso 5: Serial.println ("jueves"); rotura; caso 6: Serial.println ("viernes"); rotura; caso 7: Serial.println ("sábado"); rotura; }} bucle vacío () {displayTime (); // muestra los datos del reloj en tiempo real en el monitor serial, delay (1000); // cada segundo }

Puede haber mucho código, sin embargo, se divide en partes manejables.

Primero incluye la biblioteca Wire, que se usa para la comunicación del bus I2C, seguida de la definición de la dirección del bus para el RTC como 0x68. Estos son seguidos por dos funciones que convierten números decimales a BCD (decimal codificado en binario) y viceversa. Estos son necesarios ya que los circuitos integrados de RTC funcionan en BCD, no en decimal.

La función setDS3231time () se utiliza para configurar el reloj. Usarlo es muy fácil, simplemente inserte los valores desde el año hasta el segundo, y el RTC comenzará a partir de ese momento. Por ejemplo, si desea establecer la siguiente fecha y hora (miércoles 26 de noviembre de 2014 y 9:42 pm y 30 segundos), usaría:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Paso 3:

Tenga en cuenta que la hora se establece en formato de 24 horas y que el cuarto parámetro es el "día de la semana". Esto cae entre 1 y 7, que es de domingo a sábado, respectivamente. Estos parámetros son valores de bytes si sustituye sus propias variables.

Una vez que haya ejecutado la función una vez, es aconsejable ponerle el prefijo // y cargar su código nuevamente, para que no restablezca la hora una vez que se haya desconectado la energía o se haya restablecido el microcontrolador. Leer la hora desde su RTC es tan simple, de hecho, el proceso se puede seguir cuidadosamente dentro de la función displayTime (). Necesitará definir siete variables de bytes para almacenar los datos del RTC, y luego estos se insertan en la función readDS3231time (). Por ejemplo, si sus variables son:

byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año;

… los actualizaría con los datos actuales del RTC usando:

readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

Luego, puede usar las variables como mejor le parezca, desde enviar la hora y la fecha al monitor en serie como lo hace el boceto de ejemplo, hasta convertir los datos en una forma adecuada para todo tipo de dispositivos de salida.

Solo para verificar que todo está funcionando, ingrese la hora y fecha apropiadas en el boceto de demostración, cárguelo, comente la función setDS3231time () y cárguelo nuevamente. A continuación, abra el monitor en serie y se le proporcionará una pantalla en ejecución de la fecha y la hora actuales.

Desde este punto, ahora tiene las herramientas de software para configurar datos y recuperarlos de su módulo de reloj en tiempo real, y esperamos que comprenda cómo usar estos módulos económicos.

Puede obtener más información sobre los circuitos integrados de reloj en tiempo real en el sitio web del fabricante: DS1307 y DS3231.

Esta publicación presentada por pmdway.com: todo para fabricantes y entusiastas de la electrónica, con envío gratuito en todo el mundo.

Recomendado: