#include <Wire.h>
//BEGIN RTC CODE
//rtc variables
int second, minute, hour;
int dayOfWeek, dayOfMonth, month, year;
//end rtc variables
#define DS3231_I2C_ADDRESS 0x68
byte decToBcd(byte val) {
return ( (val / 10 * 16) + (val % 10) );
}
// Convert binary coded decimal to decimal numbers
byte bcdToDec(byte val) {
return ( (val / 16 * 10) + (val % 16) );
}
// Set the time
void rtc_setTime(byte second, byte minute, byte hour, byte wday, byte mday, byte mon, uint16_t year) {
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(wday)); // set day of week
Wire.write(decToBcd(mday)); // set date (1 to 31)
Wire.write(decToBcd(mon)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
//Refresh/Read the time
void rtc_readTime() {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
// request seven bytes of data from DS3231 starting from register 00h
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
second = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read() & 0x3f);
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
//leap year correction (if year is > 2100)
#define LEAP_YEAR(Y) ( !(((Y))%4) && ( (((Y))%100) || !(((Y))%400) ) )
if(LEAP_YEAR(year) == 0 && dayOfMonth == 29 && month == 2){
rtc_setTime(second, minute, hour, dayOfWeek, 1, 3, year);
}
if(year == 0){
rtc_setTime(second, minute, hour, dayOfWeek, dayOfMonth, month, 100);
}
}
void rtc_init(){
Wire.begin();
}
//END RTC CODE
void setup() {
rtc_init();
Serial.begin(115200);
}
void loop() {
rtc_readTime();
static char buf[50];
sprintf(buf, "%u-%02d-%02dT%02d:%02d:%02dZ", 2000U+year, month, dayOfMonth, hour, minute, second);
Serial.println(buf);
delay(500);
}