This Arduino sketch reads time and date data from a DS3231 real-time clock (RTC) module and displays it on the serial monitor. It sets the initial time on the RTC, reads the time and date values stored, and prints them out formatted every second.
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0 ratings0% found this document useful (0 votes)
97 views
ds3231 Arduino Sketch
This Arduino sketch reads time and date data from a DS3231 real-time clock (RTC) module and displays it on the serial monitor. It sets the initial time on the RTC, reads the time and date values stored, and prints them out formatted every second.
// DS3231 RTC sketch #include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } void setup() { Wire.begin(); Serial.begin(9600); // set the initial time here: // DS3231 seconds, minutes, hours, day, date, month, year // day 1-Synday,2-Monday,3-Tuesday,4-Wednesday,5-Thursday,6-Friday,7-Saturday setDS3231time(30,11,06,1,19,02,17); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte 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(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31) Wire.write(decToBcd(month)); // set month Wire.write(decToBcd(year)); // set year (0 to 99) Wire.endTransmission(); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); // sends a "Start" command to the Slave device Wire.write(0); // sets DS3231 Register Pointer to 00h Wire.endTransmission(false); // after a WRITE to the Slave device you have to // send a "Repeated Start" command before a READ from the same slave device Wire.requestFrom(DS3231_I2C_ADDRESS, 7, true); // requests to READ 7 (seven) bytes of data from DS3231 starting from Register 00h // sends a "Stop" command at the end of the request, releasing the I2C channel *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()); // no need to send a "Stop" command using the Wire.endTransmission(), since READ request was for just 7 (seven) bytes, so the // I2C communication is automatically terminated by the Master with a "Stop" command when the 7th byte has been received } void displayTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); -1- C:\Users\dntg\Documents\Arduino\DS3231\ds3231\ds3231.ino mercoledì 3 gennaio 2018 19:48 // send it to the serial monitor Serial.print(hour, DEC); // convert the byte variable to a decimal number when displayed Serial.print(":"); if (minute<10) { Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/20"); Serial.print(year, DEC); // since year format is YY Serial.print(" Day of week: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); break; case 2: Serial.println("Monday"); break; case 3: Serial.println("Tuesday"); break; case 4: Serial.println("Wednesday"); break; case 5: Serial.println("Thursday"); break; case 6: Serial.println("Friday"); break; case 7: Serial.println("Saturday"); break; } } void loop() { displayTime(); // display the real-time clock data on the Serial Monitor, delay(1000); // every second }