#include <Wire.h>
// Dirección I2C del DS1307
#define DS1307_ADDRESS 0x68
void setup() {
Wire.begin(); // Inicializa la comunicación I2C
Serial.begin(9600);
// Establecer la fecha y hora: segundos, minutos, horas
setDateTime(0, 30, 15); // Ejemplo: 15:30:00
}
void loop() {
printDateTime();
delay(1000); // Actualizar cada segundo
}
void setDateTime(int8_t second, int8_t minute, int8_t hour) {
// Escribir los valores en formato BCD
second = ((second / 10) << 4) + (second % 10);
minute = ((minute / 10) << 4) + (minute % 10);
hour = ((hour / 10) << 4) + (hour % 10);
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0); // Establecer el puntero de dirección en 0 (segundos)
Wire.write(second);
Wire.write(minute);
Wire.write(hour); // Formato de 24 horas
Wire.endTransmission();
}
void printDateTime() {
// Solicitar datos desde el DS1307
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0); // Establecer el puntero de dirección en 0 (segundos)
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 3); // Leer 3 bytes (segundos, minutos, horas)
int8_t second = (Wire.read() & 0x7F); // Leer segundos y eliminar el bit de habilitación del reloj
int8_t minute = Wire.read();
int8_t hour = Wire.read();
second = ((second >> 4) * 10) + (second & 0x0F);
minute = ((minute >> 4) * 10) + (minute & 0x0F);
hour = ((hour >> 4) * 10) + (hour % 16);
// Imprimir la hora y fecha en el monitor serial
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.print(second);
Serial.print(" ");
Serial.println();
}