RtcManager - Gestor del Módulo RTC DS1307

Descripción General

El RtcManager es una clase que maneja la comunicación con el módulo RTC DS1307 a través de I2C. Proporciona funciones para obtener fecha/hora actual y comparar intervalos de tiempo.

Características Técnicas

Hardware

  • RTC: DS1307 (I2C, dirección 0x68)

  • Precisión: ±2ppm a 0°C

  • Batería: CR2032 (hasta 10 años)

  • Temperatura de operación: -40°C a +85°C

  • Consumo: <500nA en modo batería

Comunicación

  • Protocolo: I2C

  • Velocidad: 100kHz (configurado para compatibilidad)

  • Dirección: 0x68 (DS1307)

Estructura de la Clase

class RtcManager {
private:
    RTC_DS1307 rtc;
    bool isInitialized;
    String getTimeString(const DateTime& dt);

public:
    RtcManager();
    bool begin();
    DateTime getDateTime();
    bool setDateTime(const DateTime& dt);
    bool isDateTimeValid(const DateTime& dt);
    String getTimeString();
    bool compareHsAndMs(const String& time1, const String& time2);
    void printDateTime(const DateTime& dt);
    bool isRunning();
    bool isInitialized() const;
};

Métodos Principales

Constructor

RtcManager::RtcManager()

Inicializa el gestor del RTC sin parámetros (usa I2C).

Inicialización

bool RtcManager::begin()

Inicializa el RTC DS1307:

  • Configura I2C a 100kHz

  • Escanea dispositivos I2C

  • Verifica presencia del DS1307

  • Configura fecha/hora si es necesario

  • Valida funcionamiento

Retorna: true si la inicialización fue exitosa

Obtención de Fecha/Hora

DateTime RtcManager::getDateTime()

Obtiene la fecha y hora actual del RTC.

Retorna: Objeto DateTime con la fecha/hora actual

Configuración de Fecha/Hora

bool RtcManager::setDateTime(const DateTime& dt)

Establece la fecha y hora del RTC.

Parámetros:

  • dt: Objeto DateTime con la nueva fecha/hora

Retorna: true si se estableció correctamente

Validación de Fecha/Hora

bool RtcManager::isDateTimeValid(const DateTime& dt)

Verifica si una fecha/hora es válida (año entre 2000-2100).

Parámetros:

  • dt: Objeto DateTime a validar

Retorna: true si la fecha/hora es válida

Obtención de Hora como String

String RtcManager::getTimeString()

Obtiene la hora actual en formato «HH:MM».

Retorna: String con formato «HH:MM»

Comparación de Horas

bool RtcManager::compareHsAndMs(const String& time1, const String& time2)

Compara dos horas en formato «HH:MM».

Parámetros:

  • time1: Primera hora (formato «HH:MM»)

  • time2: Segunda hora (formato «HH:MM»)

Retorna: true si las horas son iguales

Impresión de Fecha/Hora

void RtcManager::printDateTime(const DateTime& dt)

Imprime la fecha/hora en formato legible (YYYY-MM-DD HH:MM:SS).

Parámetros:

  • dt: Objeto DateTime a imprimir

Verificación de Estado

bool RtcManager::isRunning()

Verifica si el RTC está funcionando.

Retorna: true si el RTC está funcionando

bool RtcManager::isInitialized() const

Verifica si el RTC está inicializado.

Retorna: true si el RTC está inicializado

Ejemplo de Uso

#include "rtc_manager.h"

RtcManager rtc;

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

    // Inicializar RTC
    if (!rtc.begin()) {
        Serial.println("Error: No se pudo inicializar el RTC");
        return;
    }

    // Obtener fecha/hora actual
    DateTime now = rtc.getDateTime();
    Serial.print("Fecha/hora actual: ");
    rtc.printDateTime(now);
    Serial.println();

    // Obtener solo la hora
    String currentTime = rtc.getTimeString();
    Serial.printf("Hora actual: %s\n", currentTime.c_str());

    // Comparar horas
    bool isEqual = rtc.compareHsAndMs("12:30", "12:30");
    Serial.printf("¿12:30 = 12:30? %s\n", isEqual ? "Sí" : "No");
}

void loop() {
    // Mostrar hora cada minuto
    static unsigned long lastTime = 0;
    if (millis() - lastTime > 60000) {
        String time = rtc.getTimeString();
        Serial.printf("Hora: %s\n", time.c_str());
        lastTime = millis();
    }

    delay(100);
}

Configuración de Hardware

Conexiones I2C

ESP8266    DS1307
--------   ------
D1 (GPIO5) → SCL
D2 (GPIO4) → SDA
3.3V       → VCC
GND        → GND

Notas Importantes

  • El DS1307 funciona a 5V, pero es compatible con 3.3V del ESP8266

  • La batería CR2032 mantiene el RTC funcionando cuando no hay alimentación

  • El módulo incluye resistencias pull-up para I2C

Manejo de Errores

Errores Comunes

  1. DS1307 no encontrado: Verificar conexiones I2C

  2. RTC no funcionando: Verificar batería CR2032

  3. Fecha/hora inválida: Configurar fecha/hora inicial

Diagnóstico

// Verificar inicialización
if (!rtc.isInitialized()) {
    Serial.println("RTC no inicializado");
}

// Verificar funcionamiento
if (!rtc.isRunning()) {
    Serial.println("RTC no está funcionando");
}

// Verificar fecha válida
DateTime now = rtc.getDateTime();
if (!rtc.isDateTimeValid(now)) {
    Serial.println("Fecha/hora inválida");
}

Optimizaciones Implementadas

Debug Reducido

  • Solo mensajes de error y confirmaciones importantes

  • Sin spam de debug en funciones de comparación

  • Información concisa de inicialización

Validaciones

  • Verificación de direcciones I2C

  • Validación de rangos de fecha/hora

  • Comprobación de formato de strings

Compatibilidad

  • Configuración I2C a 100kHz para mayor compatibilidad

  • Manejo de errores robusto

  • Fallbacks para casos de error

Diferencias con DS1302

Característica

DS1302 (Anterior)

DS1307 (Actual)

Comunicación

3-wire (SPI)

I2C

Pines

CLK, DAT, RST

SDA, SCL

Velocidad

Más lento

Más rápido

Compatibilidad

Menor

Mayor

EEPROM

No incluida

No usada

Precisión

Similar

Similar

Notas de Implementación

  • Se eliminó toda funcionalidad de EEPROM para simplificar el código

  • El debug se optimizó para reducir spam en pantalla

  • Se mantienen solo las funciones esenciales para el proyecto

  • La validación de fecha/hora es más robusta

  • El manejo de errores es más claro y específico