#include <Wire.h>
#define DS1307_ADDRESS 0x68 /* I2C address of the DS1307 RTC */
#define SECONDS_REGISTER 0x00
typedef union {
uint8_t bcd_value;
struct {
uint8_t units :4, /* decenas */
tents :4; /* unidades */
} nibble;
} RTC_item_type;
typedef union {
uint8_t content[8];
struct {
RTC_item_type seconds;
RTC_item_type minutes;
RTC_item_type hours;
uint8_t day;
uint8_t date;
uint8_t month;
uint8_t year;
uint8_t ram;
} regs;
} RTC_type;
RTC_type rtc_mem;
void readRTC(void) {
uint8_t i;
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(SECONDS_REGISTER); /* Start at the seconds register */
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7); /* Request 7 bytes */
for(i=0; i<8; i++){
rtc_mem.content[i] = Wire.read();
}
}
void setup() {
Wire.begin(); /* Start I2C communication */
Serial.begin(9600); /* Start serial communication for debugging */
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(SECONDS_REGISTER); /* Start at the seconds register */
Wire.write(0x00);
Wire.endTransmission();
}
void loop() {
uint8_t temp;
readRTC();
Serial.print("Local Time: ");
temp = (rtc_mem.regs.hours.nibble.tents & 0x3F) *10 + rtc_mem.regs.hours.nibble.units;
Serial.print(temp);
Serial.print(":");
temp = 0;
Serial.print(temp);
temp = (rtc_mem.regs.seconds.nibble.tents & 0x7F) *10 + rtc_mem.regs.seconds.nibble.units;
Serial.print(":");
Serial.println(temp);
delay(1000); /* Wait for 1 second before updating the time again */
}