/*
    Ejemplo de uso de reloj de tiempo real (RTC) DS1307
    Utiliza la biblioteca RTClib de Adafruit
    https://github.com/adafruit/RTClib
*/

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

RTC_DS1307 rtc;

String dias[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves",
                   "Viernes", "Sabado" };
String meses[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
                     "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };

void setup() {

  Serial.begin(9600);
  delay(1000);

  if (!rtc.begin()) {
    Serial.println(F("No se encuentra el dispositivo"));
    while (1)
      ;
  }

  // Fijar a fecha y hora de compilacion
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // ...
  // Fijar a fecha y hora específica YYYY-MM-DD-HH-MM-SS
  // rtc.adjust(DateTime(2023, 10, 12, 8, 0, 0));

  // Fijar a fecha y hora mediante el terminal serie
  Serial.println("Ingresar fecha y hora en formato ISO8601 (2022-12-18T18:00:00):");

  while (true) {

    char buffer[20];

    if (Serial.available() > 0) {
      Serial.readBytesUntil('\n', buffer, 20);
      Serial.print("El dato ingresado es: ");
      Serial.println(buffer);
      rtc.adjust(DateTime(buffer));
      break;
    }
  }
}

void loop() {

  // Obtener fecha actual
  DateTime tiempo = rtc.now();

  Serial.print(dias[tiempo.dayOfTheWeek()]);
  Serial.print(" ");
  Serial.print(tiempo.day(), DEC);
  Serial.print(" de ");
  Serial.print(meses[tiempo.month() - 1]);
  Serial.print(" de ");
  Serial.print(tiempo.year(), DEC);
  Serial.print(" | ");
  Serial.print(tiempo.hour(), DEC);
  Serial.print(':');
  Serial.print(tiempo.minute(), DEC);
  Serial.print(':');
  Serial.println(tiempo.second(), DEC);

  delay(1000);
}
GND5VSDASCLSQWRTCDS1307+