"Ciencia y Tecnología" por Manolo: Módulo RTC para arduino.

Marquesina

"AQUÍ NO NOS DETENEMOS A MIRAR EL PASADO POR MUCHO TIEMPO SIGUE SIEMPRE ADELANTE, ABRIENDO NUEVAS PUERTAS Y HACIENDO COSAS NUEVAS. SÉ CURIOSO" Walt Disney.

sábado, 2 de enero de 2021

Módulo RTC para arduino.

En esta ocasión voy a tratar los módulos RTC para nuestros proyectos con Arduino.

Los módulos RTC (real time clock) son muy interesantes ya que podemos conocer la hora exacta y guardarlo en la EEPROM sin que se borren al desconectar el Arduino. Tiene un calendario hasta el 2100 para saber el día de la semana que es, incluyendo los bisiestos.

Hay dos módulos RTC, el ds1307 y el 3231. Este último es más moderno y según otros autores tiene mayor estabilidad con la temperatura por lo que tiene menor error en el tiempo.





La comunicación es a través de I2C y tiene un pin que emite un pulso con frecuencia de 1 segundo, útil para medir o sincronizar otros componentes.

El módulo 1307 tiene la opción de incorporar un termosensor. 

Hay un portapila de 3 V. que es la que permite mantener la hora y la fecha incluso apagado la placa Arduino. Esto es de máxima importancia para proyectos que tenemos que saber la hora y la fecha en todo momento y no podemos perder esa información si se desconecta la placa. La duración de la pila llega a varios años ya que el módulo consume poquísimo, de 10  a 650 μA.





La memoria EEPROM puede ser de 32 kb o 4 kB y se comunica también por I2C.

La librería que usaremos la podemos tomar desde el gestor de librerías del IDE de Arduino o desde aquí https://github.com/adafruit/RTClib

El RTC ds1307 viene con fecha de 0/0/0, por lo que hay que "inicializarlo" a la fecha actual. Para ello con un programa donde se incluya 

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

se actualiza a la hora y fecha de la compilación del programa. Por lo tanto habría que cargar un nuevo programa en la placa arduino, una vez puesta la pila en el RTC, para que no se esté reinicializando constantemente el reloj.

CONEXIONES: 

imagen vía https://forum.arduino.cc

 

Módulo RTC ds1307Pin Arduino UNOPin Arduino 
MEGA
VCC5 V.5 V.
GNDGNDGND
SCLA5Pin 21
SDAA4Pin 20






Programa:

Aquí pongo el programa de inicio con ejemplos:

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"S.", "M.", "T.", "W.", "Th.", "F.", "Sat."};

void setup () {
  Serial.begin(57600);

#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif

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

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }

  // When time needs to be re-set on a previously configured device, the
  // following line sets the RTC to the date & time this sketch was compiled
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // January 21, 2014 at 3am you would call:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

void loop () {
    DateTime now = rtc.now();

    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.print(" since midnight 9/2/1969 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L - 334);
    Serial.println("d");

// calculate a date which is 7 d., 12 h., 30 min., and 6 s. into the future
    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");
    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(3000);
}