Arduino and DS3231 Real Time Clock Tutorial

In this Arduino Tutorial we will learn how to use the DS3231 Real Time Clock Module. You can watch the following video or read the written tutorial below.

Overview

The first question that comes here is why we actually need a separate RTC for our Arduino Project when the Arduino itself has built-in timekeeper. Well the point is that the RTC module runs on a battery and can keep track of the time even if we reprogram the microcontroller or disconnect the main power.

DS3231 Real Time Clock

DS3231 Real Time Clock

The DS3231 is a low-cost, highly accurate Real Time Clock which can maintain hours, minutes and seconds, as well as, day, month and year information. Also, it has automatic compensation for leap-years and for months with fewer than 31 days.

DS3231 Real Time Clock Specifications

The module can work on either 3.3 or 5 V which makes it suitable for many development platforms or microcontrollers. The battery input is 3V and a typical CR2032 3V battery can power the module and maintain the information for more than a year.

The module uses the I2C Communication Protocol which makes the connection to the Arduino Board very easy.

Here’s the circuit schematics:

Arduino and DS3231 Real Time Clock Circuit Schematics

So all we need is 4 wires, the VCC and the GND pins for powering the module, and the two I2C communication pins, SDA and SCL.

You can get the components needed for this Arduino Tutorial from the links below:

Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.

Programming

Once we connect the module we need to program the Arduino Board to work with the Real Time Clock. However, when it comes to programing a communication between Arduino and an I2C module the code isn’t that small and easy. Luckily, there are already several libraries for the DS3231 RTC which can be found on the internet.

For this tutorial I chose to use the Library made by Henning Karlsen which can be found and downloaded from his website, www.rinkydinkelectronics.com.

So once we download and install the library we can use its first demo example to initially activate the clock of the RTC module. In the setup section of the demo example code we can notice that there are three line that we need to uncomment in order to initially set the day of the week, the time and the data.

// Code from the Demo Example of the DS3231 Library

void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014
}

The first line is for setting the day of the week, the second line is for setting the time in hours, minutes and seconds, and the third line is for setting the date in days, months and years.

Once we upload this code we need to comment back the three lines and re-upload the code again.

// Code from the Demo Example of the DS3231 Library

void loop()
{
  // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Send time
  Serial.println(rtc.getTimeStr());
  
  // Wait one second before repeating
  delay (1000);
}

If we take a look at the loop section of the code we can see that now using the three custom functions we get the information from the RTC and print them in the Serial Monitor. Here’s how they appear in the Serial Monitor.

DS3231 RTC Serial Monitor Results

Now even if we disconnect the Arduino power and then reconnect it and run the Serial Monitor again we can notice that the time keeps going without being reset.

So now we have our Real Time Clock up and running and we can use in any Arduino Project. As a second example I connected an LCD to the Arduino and printed the time and the date on it.

Arduino DS3231 Real Time Clock and LCD Example

Here’s the source code of this example:

/*
* Arduino DS3231 Real Time Clock Module Tutorial
*
* Crated by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
* DS3231 Library made by Henning Karlsen which can be found and downloaded from his website, www.rinkydinkelectronics.com.
*
*/
#include <DS3231.h>
#include <LiquidCrystal.h> // includes the LiquidCrystal Library 

DS3231  rtc(SDA, SCL);
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 

void setup() { 
 rtc.begin(); // Initialize the rtc object
 lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } 
}

void loop() { 
 lcd.setCursor(0,0);
 lcd.print("Time:  ");
 lcd.print(rtc.getTimeStr());
 
 lcd.setCursor(0,1);
 lcd.print("Date: ");
 lcd.print(rtc.getDateStr());
 
 delay(1000); 
}

That’s all for this Arduino Tutorial, feel free to ask any question in the comments section below.

45 thoughts on “Arduino and DS3231 Real Time Clock Tutorial”

  1. Hi
    Could you help me?
    I want Arduino updates the real time clock from a mobile SIM Card, like the Mobile phone always updates the real time clock from the mobile network.
    Could it applicable?
    Thank you for your help

    Reply
  2. Hello,
    Could you assist me?
    I want to develop an android medicine reminder app connected with a medicine pillbox, first i dont know anything about arduino and name of compiler to run it also. how to link my android app to the arduino? I’m still learning android programming using Java. Can you please help me out

    Reply
  3. Do you know how to change the DS1302 to 12 hour mode. If no do you know how to change the DS3231 to 12 hour mode. Other whys nice project.

    Reply
  4. Sir,
    This code executed successfully, but the date is being displayed as 01.01.2000, though i have changed it in the code. Please reply how to solve the problem.

    Thank you.

    Reply
    • Did you follow the steps as explained. First uploaded the code to set the date, with the three lines in the setup section uncommened, then upload the normal code which shows the date with the three lines in the setup section commened or removed.

      Reply
      • Sir, thanku for the reply, sorry for the late reply. i did the same way as u said , but the problem is still repeating, can u please suggest a solution..

        Reply
    • Be sure to enter your date in the correct format, i.e. DD, MM, YYYY.
      You can then change the way it is displayed with the FORMAT comments

      Reply
    • How to separate the TIME so i can get the specified hour or minute in “if else” operation to make an automatic on-off switch?

      Reply
      • Hello,
        Sorry for the late response. You can separate it using the substring(). You can find more details how this function works on the Arduino official website. Plus you can check my Arduino Touch Screen Music Player and Alarm Clock Project where I use this method to get the hours, the minutes and the seconds into a separate variables.

        Reply
  5. Hello Dejan Nedelkovski. Thank you for these videos they are helping me to learn all about these amazing Arduino’s. I am new to these Arduino’s and have decided this is to be my first project. I have ordered all the parts necessary and will have to wait to get started but I have only one question at this time. You mentioned that you connected an LCD but did not say how to do that. Is there some where I can get a schematic or something to tell me how to do that?
    Thank you

    Reply
  6. ‘DS3231’ does not name a type. DS3231 rtc(SDA, SCL);
    I get this error. How to get over this issue? Please assist

    Reply
  7. Hi, please I want to ask you. I have an arduino project with RTC ds3132 and LCD. I want to display in LCD only the time. is it possible to use the same programming that you use in this video of arduino and DS3231 real time clock

    Reply
  8. Hello ! Please can you help me ? I want to get hours and minuts separate … Is it possible ??? Because i created a variable “hours” and an other “minuts” … Thank you !
    😉

    Reply
  9. Using this LCD to display the countdown timer. If I set in the program code as delay (5000); // 5000ms = 5s for example, can I send/display on LCD this delay time in this format: 00:00:05 then countdown to 00:00:00 in time ? Thanks for your help.

    Reply
  10. hey sir, i tried this tutorial and its working
    the only problem i have is whenever i disconnected the arduino power, the time is reset to the set time, can you help me?

    Reply
  11. Hello, thanks for the tutorial. My question is can the real time clock data be manipulated to allow a user control it so as to trigger an alarm at a desired time?

    Reply
    • Hey, yes that’s possible. You can read the data from the RTC and extract the hours, the minutes and the seconds and put them into variables (also you should convert them into integers). Then using a simple “if” statement you can make do anything at the desired time.

      Reply
  12. HI, your project is too good and I tried to copy this idea, but I got a problem, the problem is I set a time and burned the program into an Arduino, so it was working perfectly and when I disconnected the Arduino from the power source and then reconnected to Power to its show previous time (that which I burned the program).

    I tried to use Ds3231 much time and got help from many websites but I couldn’t fix the problem, so Plz help me because my personal project depends upon Ds3231.

    Reply
    • Hey, thanks! Well I’m not sure whether you have burned the program the right way. First you should set the time in the setup() section. Once done, then you should upload the same code again, without those lines for setting the time in the setup() section.

      Reply
  13. Hi, can you help me with a problem? I followed the code exactly and included the DS3231 library, but I get an error that says: “no matching function for call to ‘DS3231::DS3231(const uint8_t&, const uint8_t&)'”. The Arduino IDE says the error is on the line: ‘DS3231 rtc(SDA, SCL)’;

    Reply

Leave a Comment