Interfaz DS1307 módulo RTC con Arduino

Si estás buscando una forma de controlar la hora y la fecha en tus proyectos de Arduino, el módulo RTC DS1307 es la solución perfecta. En este artículo, te mostraremos cómo utilizar este módulo y conectarlo de forma sencilla con tu Arduino para que puedas mantener un seguimiento preciso del tiempo en tus creaciones electrónicas. ¡Sigue leyendo para descubrir cómo interfazar el módulo RTC DS1307 con Arduino!

Todos somos conscientes de que la mayoría de las MCU utilizadas en nuestros proyectos son independientes del tiempo. es decir, desconocen el tiempo que los rodea. Para la mayoría de nuestros proyectos está bien, pero de vez en cuando, cuando se le ocurre una idea en la que mantener el tiempo es esencial, el módulo DS1307 Precision RTC resulta útil. Es adecuado para una variedad de proyectos que incluyen relojes, temporizadores y alarmas, así como registro de datos y marcas de tiempo.

Descripción general del hardware

Este módulo se basa en el chip RTC DS1307 de alto rendimiento y la EEPROM AT24C32, los cuales existen desde hace algún tiempo y tienen un buen soporte de biblioteca.

Chip DS1307 RTC

En el corazón del módulo se encuentra un chip RTC rentable y extremadamente preciso de Maxim: el DS1307. Maneja todas las funciones de cronometraje y se comunica con el microcontrolador a través de I2C.

Interfaz DS1307 módulo RTC con Arduino

El DS1307 puede realizar un seguimiento de segundos, minutos, horas, días, días, meses y años. Puede funcionar en formato de 12 o 24 horas y tiene una pantalla AM/PM. Para meses con menos de 31 días, ajusta automáticamente la fecha al final del mes, incluidas las correcciones de año bisiesto (válido hasta 2100).

Otra característica interesante del DS1307 es el pin SQW, que se puede programar para emitir una de las cuatro frecuencias de onda cuadrada: 1 Hz, 4 kHz, 8 kHz o 32 kHz.

El DS1307 requiere un cristal externo de 32 kHz para medir el tiempo, cuya frecuencia está ligeramente influenciada por la temperatura exterior. Aunque este cambio en la frecuencia es insignificante, todavía suma.

Puede parecer un problema, pero no lo es. De hecho, hace que el reloj avance unos dos minutos por mes.

Batería de reserva

El DS1307 IC cuenta con una entrada de batería para mantener la hora exacta incluso cuando se interrumpe la fuente de alimentación principal del dispositivo.

El circuito de detección de energía incorporado monitorea continuamente el estado de VCC para detectar cortes de energía y cambia automáticamente a energía de respaldo. Esto significa que el IC aún puede mantener la hora incluso en caso de un corte de energía.

Interfaz DS1307 módulo RTC con Arduino

Para el suministro de energía de emergencia, hay un soporte para una pila de botón de litio de 20 mm y 3 V en la parte inferior de la placa. Cualquier batería CR2032 encajará perfectamente aquí.

Suponiendo que utilice una batería de tipo botón de 47 mAh completamente cargada y mantenga el consumo de corriente del chip en al menos 300 nA, la batería debería poder alimentar el RTC durante al menos 17 años sin la necesidad de una fuente de alimentación externa.

47mAh/300nA = 156666,67 horas = 6527,78 días = 17,87 años

EEPROM 24C32 integrado

El módulo DS1307 RTC también incluye un chip EEPROM AT24C32 (no volátil) de 32 bytes (4K x 8 bits) con 1.000.000 de ciclos de escritura. En realidad, este chip no tiene nada que ver con el RTC, pero puede ser útil para cosas como el registro de datos o el almacenamiento de otros datos que no deben ser volátiles.

Interfaz DS1307 módulo RTC con Arduino

La EEPROM 24C32 se comunica a través de I2C y utiliza el mismo bus I2C que el DS1307.

La EEPROM 24C32 integrada tiene una dirección I2C fija de 0x50.

La EEPROM AT24C32 tiene una capacidad nominal de 1.000.000 de ciclos de escritura, por lo que no se desgastará en aplicaciones normales de registro de datos siempre y cuando no escriba datos cada segundo.

Función oculta del módulo – DS18B20

El módulo RTC DS1307 tiene una opción para instalar un sensor de temperatura DS18B20 que muchas veces pasa desapercibido.

El DS18B20 se puede instalar utilizando los tres orificios de montaje en la esquina superior derecha, cerca del soporte de la batería (marcado U1).

Interfaz DS1307 módulo RTC con Arduino

Después de instalar DS18B20, puede obtener lecturas de temperatura del pin DS. Estas mediciones se pueden utilizar para compensar la desviación del tiempo relacionada con la temperatura.

Suelde el DS18B20 según la polaridad que se muestra en la pantalla. Es posible que también necesite una resistencia de 4,7 K entre VCC y DS.

interfaz I2C

El módulo tiene una interfaz I2C simple que ocupa dos direcciones. La dirección I2C fija del chip RTC DS1307 es 0x68 y la dirección I2C fija de la EEPROM 24C32 es 0x50.

Las señales SDA y SCL, así como la alimentación y la tierra, también se conducen al otro lado del módulo para que estas señales puedan conectarse en bucle a otro módulo.

Interfaz DS1307 módulo RTC con Arduino

Para permitir la comunicación, tanto la línea SDA como la SCL tienen resistencias pull-up de 4,7K.

Especificaciones técnicas

Aquí están las especificaciones:

Tensión de funcionamiento 4,5 a 5,5 V (5 V típico)
Consumo actual < 1,5 mA (típico)
Precisión (0-40°C) Dependiendo del cristal (± 20 ppm típ.)
batería CR2032 (moneda de 3V)

Para obtener más información sobre el chip DS1307 RTC y 24C32 EEPROM, consulte las hojas de datos que se enumeran a continuación.

Distribución de pines del módulo DS1307 RTC

El módulo DS1307 RTC tiene un total de 7 pines. La asignación de pines es la siguiente:

Interfaz DS1307 módulo RTC con Arduino

SQW El pin emite una de las cuatro frecuencias de onda cuadrada: 1 Hz, 4 kHz, 8 kHz o 32 kHz.

D.S. El pin debe proporcionar lecturas de temperatura cuando se instala un sensor de temperatura DS18B20 usando los tres orificios de montaje en la esquina superior derecha cerca del soporte de la batería (etiquetado U1).

SCL es un pin de reloj serie para la interfaz I2C.

ASD es un pin de datos en serie para la interfaz I2C.

VCC suministra energía al módulo. Puedes conectarlo a una fuente de alimentación de 5 voltios.

Tierra es el pin de tierra.

MURCIÉLAGO es una entrada de suministro de respaldo para cualquier celda de litio estándar de 3 V u otra fuente de energía para mantener la hora exacta cuando se interrumpe el suministro de energía principal del dispositivo.

Cableado de un módulo RTC DS1307 a un Arduino

Conectemos el RTC al Arduino.

Las conexiones son sencillas. Comience conectando el pin VCC a la salida de 5 V del Arduino y el pin GND a tierra.

Ahora nos quedan los pines que se utilizan para la comunicación I2C. Tenga en cuenta que cada placa Arduino tiene diferentes pines I2C que deben conectarse correctamente. En las placas Arduino con diseño R3, SDA (línea de datos) y SCL (línea de reloj) se encuentran en los encabezados cerca del pin AREF. También se les conoce como A5 (SCL) y A4 (SDA).

Consulte la siguiente tabla para obtener una referencia rápida.

SCL ASD
ArduinoUno A5 A4
Arduino Nano A5 A4
arduino mega 21 20
Leonardo/Micro 3 2

El siguiente diagrama muestra cómo está todo conectado.

Interfaz DS1307 módulo RTC con Arduino

Instalación de la biblioteca uRTCLib

La comunicación con un módulo RTC requiere mucho esfuerzo. Por suerte eso es biblioteca uRTCLib fue creado para ocultar todas las complejidades y permitirnos emitir comandos simples para leer los datos RTC.

Es una biblioteca simple pero poderosa que también admite la programación de salida SQW, que no es compatible con muchas bibliotecas RTC.

Para instalar la biblioteca, navegue hasta Bosquejo > Incluir biblioteca > Administrar bibliotecas… Espere a que el administrador de la biblioteca descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.

Interfaz DS1307 módulo RTC con Arduino

Filtra tu búsqueda escribiendo 'urtclib'. Buscar uRTCLib de Naguisa. Haga clic en esta entrada y luego seleccione «Instalar».

Interfaz DS1307 módulo RTC con Arduino

Al final del tutorial, también incluimos código para leer y escribir la EEPROM 24C32 integrada. Si está interesado, debe instalar la biblioteca uEEPROMLib. Buscar 'eepromlib' e instalarlo también.

Interfaz DS1307 módulo RTC con Arduino

Código Arduino: leer fecha y hora

Este es un boceto simple para configurar/leer la fecha y la hora desde el módulo RTC DS1307.

#include "Arduino.h"
#include "uRTCLib.h"

// uRTCLib rtc;
uRTCLib rtc(0x68);

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() {
  Serial.begin(9600);
  delay(3000); // wait for console opening

  URTCLIB_WIRE.begin();

  // Comment out below line once you set the date & time.
  // Following line sets the RTC with an explicit date & time
  // for example to set January 13 2022 at 12:56 you would call:
   rtc.set(0, 56, 12, 5, 13, 1, 22);
  // rtc.set(second, minute, hour, dayOfWeek, dayOfMonth, month, year)
  // set day of week (1=Sunday, 7=Saturday)
}

void loop() {
  rtc.refresh();

  Serial.print("Current Date & Time: ");
  Serial.print(rtc.year());
  Serial.print('/');
  Serial.print(rtc.month());
  Serial.print('/');
  Serial.print(rtc.day());

  Serial.print(" (");
  Serial.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
   Serial.print(") ");

  Serial.print(rtc.hour());
  Serial.print(':');
  Serial.print(rtc.minute());
  Serial.print(':');
  Serial.println(rtc.second());
  
  delay(1000);
}

Así es como se ve el resultado:

Interfaz DS1307 módulo RTC con Arduino

Explicación del código:

El boceto comienza con la integración de las bibliotecas Arduino.h y uRTCLib.h para la comunicación con el módulo. Luego creamos y definimos un objeto de biblioteca uRTCLib. daysOfTheWeek Matriz de caracteres 2D para almacenar la información del día.

Para interactuar con el módulo RTC, utilizamos las siguientes funciones en las secciones de configuración y bucle del código:

comenzar() La función garantiza que el módulo RTC se inicialice correctamente.

Conjunto(ss, mm, hh, día, dd, mm, aa) La función establece el RTC en una fecha y hora explícitas. Por ejemplo, para programar el 13 de enero de 2022 a las 12:56 p.m., llamarías a: rtc.set(0, 56, 12, 5, 13, 1, 22);

Actualizar() La función actualiza los datos del HW RTC.

Año() La función devuelve el año actual.

Mes() La función devuelve el mes actual.

Día() La función devuelve el día actual.

Día laborable() La función devuelve el día actual de la semana (1 a 7). Esta función se utiliza normalmente como índice de una matriz de caracteres 2D que almacena información sobre los días.

Hora() La función devuelve la hora actual.

Minuto() La función devuelve el minuto actual.

segundo() La función devuelve los segundos actuales.

Código Arduino: lectura/escritura de EEPROM 24C32

Como ventaja adicional, el módulo RTC DS1307 incluye 32 bytes de ROM borrable eléctricamente. El contenido no se eliminará incluso si se interrumpe la alimentación principal del dispositivo.

Este es un boceto simple que intenta escribir un número entero, un flotante, un carácter y una cadena en la EEPROM 24C32 y luego volver a leerlos. Este boceto se puede ampliar para almacenar configuraciones, contraseñas o prácticamente cualquier cosa.

#include "Arduino.h"
#include "Wire.h"
#include "uEEPROMLib.h"

// uEEPROMLib eeprom;
uEEPROMLib eeprom(0x50);

void setup() {
  Serial.begin(9600);
  delay(2500);

  Wire.begin();

  int inttmp = 32123;
  float floattmp = 3.1416;
  char chartmp = 'A';
  char c_string[] = "lastminuteengineers.com"; //23
  int string_length = strlen(c_string);

  Serial.println("Writing into memory...");
  
  // Write single char at address 
  if (!eeprom.eeprom_write(8, chartmp)) {
  Serial.println("Failed to store char.");
  } else {
  Serial.println("char was stored correctly.");
  }

  // Write a long string of chars FROM position 33 which isn't aligned to the 32 byte pages of the EEPROM
  if (!eeprom.eeprom_write(33, (byte *) c_string, strlen(c_string))) {
  Serial.println("Failed to store string.");
  } else {
  Serial.println("string was stored correctly.");
  }

  // Write an int
  if (!eeprom.eeprom_write(0, inttmp)) {
    Serial.println("Failed to store int.");
  } else {
    Serial.println("int was stored correctly.");
  }

  // write a float
  if (!eeprom.eeprom_write(4, floattmp)) {
    Serial.println("Failed to store float.");
  } else {
    Serial.println("float was stored correctly.");
  }

  Serial.println("");
  Serial.println("Reading memory...");
  
  Serial.print("int: ");
  eeprom.eeprom_read(0, &inttmp);
  Serial.println(inttmp);

  Serial.print("float: ");
  eeprom.eeprom_read(4, &floattmp);
  Serial.println((float) floattmp);

  Serial.print("char: ");
  eeprom.eeprom_read(8, &chartmp);
  Serial.println(chartmp);

  Serial.print("string: ");
  eeprom.eeprom_read(33, (byte *) c_string, string_length);
  Serial.println(c_string);

  Serial.println();
}

void loop() {
}

Así es como se ve el resultado:

Interfaz DS1307 módulo RTC con Arduino

Al leer/escribir la EEPROM, tenga en cuenta que diferentes tipos de datos requieren diferentes cantidades de memoria. Por ejemplo, un carácter tiene un byte, un número entero tiene dos bytes y un número de coma flotante tiene cuatro bytes.

En otras palabras, cuando almacena un carácter, puede escribirse en cualquier ubicación de la memoria (0, 1, 2, 3, 4, 5…).

Sin embargo, al almacenar un número entero, necesita reservar dos ubicaciones de memoria para cada valor, por lo que es posible que desee almacenar datos en cualquier otra ubicación, como por ejemplo: B. (0,2,4,6….).

Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded





Interfaz DS1307 módulo RTC con Arduino

Interfaz DS1307 módulo RTC con Arduino

Estamos todos conscientes de que la mayoría de los MCUs utilizados en nuestros proyectos no tienen noción del tiempo a su alrededor. Esto no supone un problema para la mayoría de nuestros proyectos, pero de vez en cuando, cuando se nos ocurre una idea en la que mantener el tiempo es crucial, el módulo de reloj en tiempo real (RTC) DS1307 de precisión viene al rescate. Es adecuado para una amplia gama de proyectos, incluidos relojes, temporizadores, alarmas, así como para el registro de datos y el marcaje de tiempo.

Descripción del hardware

Este módulo está construido en torno al chip RTC DS1307 de alta capacidad y el EEPROM AT24C32, ambos con un buen soporte de librería.

Preguntas frecuentes

  1. ¿Cuál es la función del DS1307 RTC Chip?

    El chip DS1307 puede realizar un seguimiento de segundos, minutos, horas, días, fechas, meses y años. Puede funcionar en un formato de 12 horas o 24 horas y tiene un indicador de AM/PM. Para los meses con menos de 31 días, ajusta automáticamente la fecha al final del mes, incluyendo correcciones de año bisiesto (válido hasta el 2100).

  2. ¿Cuál es la función del Battery Backup en el DS1307?

    El IC DS1307 incorpora una entrada de batería para mantener una precisa marcación del tiempo incluso cuando se interrumpe la alimentación principal del dispositivo.

  3. ¿Qué es la EEPROM de 24C32?

    La EEPROM de 24C32 es una memoria no volátil que puede ser utilizada para el registro de datos u otra información que se desee mantener.

  4. ¿Cuál es la característica oculta del módulo DS1307 RTC?

    El módulo DS1307 RTC tiene una provisión para la instalación de un sensor de temperatura DS18B20. Este sensor proporciona lecturas de temperatura que se pueden utilizar para compensar la deriva del reloj basada en la temperatura.

  5. ¿Cómo se conecta un módulo DS1307 RTC a un Arduino?

    Las conexiones son sencillas. Es necesario conectar el pin VCC a la salida de 5V del Arduino y el pin GND a tierra.

Para obtener más información sobre el DS1307 RTC y el chip EEPROM 24C32, consulte las hojas de datos a continuación:

4 comentarios en «Interfaz DS1307 módulo RTC con Arduino»

Deja un comentario