Select Page

Todos sabemos que la mayoría de las MCU que utilizamos para nuestros proyectos son independientes del tiempo; En pocas palabras, no son conscientes del tiempo que les rodea. Está bien para la mayoría de nuestros proyectos, pero de vez en cuando te encuentras con una idea de que mantener el tiempo es una preocupación principal, el módulo DS1307 RTC es un salvador. Es perfecto para proyectos que contienen registro de datos, construcción de reloj, sellado de tiempo, temporizadores y alarmas.

El RTC DS1307, es un real time clock con comunicación I2C, una vez cargada la fecha inicial, este dispositivo proveera los segundos, minutos y hora, asi mismo tambien el dia, el mes y el año.

Una alternativa muy usada al DS1307 es el módulo RTC DS3231.

Características técnicas

  • Voltaje de Operación: 3.3V – 5V
  • Integrados principales: AT24C32 y DS1307.
  • Dirección I2C del DS1307: Read(11010001) Write(11010000)
  • Memoria EEPROM AT24C32 (4K * 8bit = 32Kbit = 4KByte)
  • Comunicación I2C, solo utiliza 2 cables.
  • La batería puede mantener al RTC funcionando por 10 años.
  • Dimensiones: 28x25x8.4mm

Modulo DS1307

En el corazón del módulo se encuentra un chip RTC de bajo costo y bastante preciso de Maxim – DS1307. Gestiona todas las funciones de cronometraje y presenta una interfaz I2C simple de dos hilos que se puede conectar fácilmente con cualquier microcontrolador.

RTC DS1307 1

El chip mantiene información de segundos, minutos, horas, día, fecha, mes y año. La fecha al final del mes se ajusta automáticamente para los meses con menos de 31 días, incluidas las correcciones por año bisiesto (válido hasta 2100). El reloj funciona en formato de 24 horas o de 12 horas con un indicador AM / PM.

La otra característica interesante de esta placa viene con un pin SQW, que emite una de las cuatro frecuencias de onda cuadrada de 1Hz, 4kHz, 8kHz o 32kHz y se puede habilitar mediante programación.

El modulo DS1307 viene con un cristal externo de 32 kHz para mantener el tiempo. El problema con estos cristales es que la temperatura externa puede afectar su frecuencia de oscilación. Este cambio en la frecuencia es insignificante pero seguramente suma conforme pasa el tiempo. En un año acumula un atraso significativo. Podes ver los problemas del modulo ds1307 en este link.

Esto puede parecer un problema, pero no lo es. En realidad, el reloj se atrasa unos cinco minutos al mes.

Pila DS1307

El DS1307 incorpora una entrada de batería y mantiene un cronometraje preciso cuando se interrumpe la alimentación principal del dispositivo gracias a una pila.

El circuito de detección de energía incorporado monitorea continuamente el estado de VCC para detectar fallas de energía y cambia automáticamente al suministro de respaldo. Por lo tanto, no debe preocuparte los cortes de energía, su MCU aún puede hacer un seguimiento del tiempo.

RTC DS1307 2

El lado inferior de la placa contiene un soporte de batería tipo moneda de litio de 20 mm 3V. Cualquier batería CR2032 va bien.

Suponiendo que se utiliza una batería CR2032 completamente cargada con una capacidad de 47 mAh y el chip consume su mínimo de 300 nA, la batería puede mantener el RTC funcionando durante un mínimo de 17.87 años sin una fuente de alimentación externa de 5 V.

47mAh/300nA = 156666.67 horas = 6527.78 dias = 17.87 años

24C32 EEPROM

El módulo DS1307 RTC también viene con un chip EEPROM 24C32 de 32 bytes de Atmel que tiene ciclos de lectura-escritura limitados. Se puede usar para guardar configuraciones o realmente cualquier cosa.

RTC DS1307 3

La EEPROM 24C32 utiliza la interfaz I2C para la comunicación y comparte el mismo bus I2C que DS1307.

La EEPROM 24C32 integrada tiene una dirección I2C cableada y está configurada en 0x50HEX

El código para leer / escribir el 24C32 EEPROM se proporciona al final del tutorial.

Corrección por Temperatura

Hay un lugar especial en nuestro módulo DS1307 RTC que a menudo pasa desapercibida. Nos permite instalar el sensor de temperatura DS18B20. El sensor de temperatura se usa para corregir el error de la electrónica por temperatura para medir el tiempo.

Los 3 orificios en la esquina superior justo al lado del soporte de la batería (etiquetado como U1) es donde va soldado el DS18B20.

RTC DS1307 4

Una vez que instale el DS18B20, podrá obtener lecturas de temperatura del pin DS. Estas lecturas se pueden usar para compensar la deriva del tiempo basada en la temperatura en el código.

Seguí la serigrafía para soldar DS18B20. También es posible que necesites una resistencia de 4.7K entre VCC y DS por conectar este sensor.

DS1307 PinOut

El módulo DS1307 RTC tiene un total de 7 pines que lo conectan con el mundo exterior. Las conexiones son las siguientes:

RTC DS1307 5

El pin SQW emite una de las cuatro frecuencias de onda cuadrada de 1Hz, 4kHz, 8kHz o 32kHz y se puede habilitar mediante programación.

El pin DS supone lecturas de temperatura de salida si su módulo tiene un sensor de temperatura DS18B20 instalado justo al lado del soporte de la batería (etiquetado como U1).

SCL es la entrada de reloj para la interfaz I2C y se utiliza para sincronizar el movimiento de datos en la interfaz en serie.

SDA es la entrada / salida de datos para la interfaz serial I2C.

El pin VCC suministra energía para el módulo. Puede estar en cualquier lugar entre 3.3V a 5.5V.

GND es un pin de tierra.

BAT es una entrada de suministro de respaldo para cualquier celda de litio estándar de 3V u otra fuente de energía para mantener un cronometraje preciso cuando se interrumpe la alimentación principal del dispositivo.

Conexionado al Arduino

Las conexiones son bastante simples. Comience conectando el pin VCC a la salida de 5V en el Arduino y conecte GND a tierra.

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

Si tienes un Mega, ¡los pines son diferentes! Querrá usar el formato digital 21 (SCL) y 20 (SDA). Consulte la tabla a continuación para una comprensión rápida.

RTC DS1307 6
SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo/Micro32

El siguiente diagrama le muestra cómo conectar todo.

RTC DS1307 7

Librería RTClib

La comunicación con un módulo RTC es un montón de trabajo. Afortunadamente, la biblioteca RTClib se escribió para ocultar todas las complejidades y poder emitir comandos simples para leer los datos RTC.

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

RTC DS1307 8

Filtre su búsqueda escribiendo «rtclib». Debería haber un par de entradas. Busque RTClib por Adafruit. Haga clic en esa entrada y luego seleccione Instalar.

RTC DS1307 9

Código Arduino– Fecha y Hora

El siguiente sketch le dará una comprensión completa sobre cómo configurar / leer la fecha y la hora en el módulo DS1307 RTC y puede servir como base para experimentos y proyectos más prácticos.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

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

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

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC lost power, lets set the time!");
	
	// Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
	
    // Following line sets the RTC with an explicit date & time
    // for example to set January 27 2017 at 12:56 you would call:
    // rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));
  }
}

void loop () 
{
    DateTime now = rtc.now();
    
    Serial.println("Current Date & Time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.println("Unix Time: ");
    Serial.print("elapsed ");
    Serial.print(now.unixtime());
    Serial.print(" seconds/");
    Serial.print(now.unixtime() / 86400L);
    Serial.println(" days since 1/1/1970");
    
    // calculate a date which is 7 days & 30 seconds into the future
    DateTime future (now + TimeSpan(7,0,0,30));
    
    Serial.println("Future Date & Time (Now + 7days & 30s): ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(1000);
}

Código Arduino 24C32 EEPROM

El contenido no se borrará incluso si se interrumpe la alimentación principal del dispositivo.

El siguiente programa escribe y luego lee un mensaje de la EEPROM 24C32. Puede usar este programa para guardar configuraciones o contraseñas o realmente cualquier cosa.

#include <Wire.h>

void setup()
{
    char somedata[] = "lastminuteengineers.com"; // data to write
    Wire.begin(); // initialise the connection
    Serial.begin(9600);
    Serial.println("Writing into memory...");
	
	// write to EEPROM
    i2c_eeprom_write_page(0x57, 0, (byte *)somedata, sizeof(somedata));

    delay(100); //add a small delay
    Serial.println("Memory written");
}

void loop()
{
    Serial.print("Reading memory: ");
    int addr=0; //first address
	
	// access the first address from the memory
    byte b = i2c_eeprom_read_byte(0x57, 0);

    while (b!=0)
    {
        Serial.print((char)b); //print content to serial port
        addr++; //increase address
        b = i2c_eeprom_read_byte(0x57, addr); //access an address from the memory
    }
    Serial.println(" ");
    delay(2000);
}

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.write(rdata);
    Wire.endTransmission();
}

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddresspage >> 8)); // MSB
    Wire.write((int)(eeaddresspage & 0xFF)); // LSB
    byte c;
    for ( c = 0; c < length; c++)
        Wire.write(data[c]);
    Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,1);
    if (Wire.available()) rdata = Wire.read();
    return rdata;
}

// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,length);
    int c = 0;
    for ( c = 0; c < length; c++ )
        if (Wire.available()) buffer[c] = Wire.read();
}

Productos Necesarios:

Programacion:

Links:

Dónde Comprar Modulo DS1307

PatagoniaTec

Amazon

Alibaba

A %d blogueros les gusta esto: