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.

RECOMMENDED The 8 Best Arduino Starter Kits For Beginners in 2019

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.


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,

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
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  // Initialize the rtc object
  // 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(" ");
  // Send date
  Serial.print(" -- ");

  // Send time
  // 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,
* DS3231 Library made by Henning Karlsen which can be found and downloaded from his website,
#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.print("Time:  ");
 lcd.print("Date: ");

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

45 Responses

  1. Mohamed Radwan

    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

    • Bill

      No, you can not. The telephone’s sim card doesn’t apply here. (Could be done just extremely difficult)
      But you can synchronise it to an Internet Time Server easily. Search for it.

  2. Smart Ejeka

    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

    • Dejan Nedelkovski

      Well, of course, you would need some knowledge in programming and Arduino in order to do such a project. I cannot see how I could assist you except to tell you to take a look at my Arduino tutorial from the very beginning and start learning.

  3. Mathew Rawson

    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.

  4. ksa

    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.

    • Dejan Nedelkovski

      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.

      • ksa

        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..

    • Mike

      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

  5. Mario

    Hallo sir,

    What should i do to add switch based on certain time? Example in 6p.m
    How to write code in ‘if else’ operation?

    • Mario

      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?

      • Dejan Nedelkovski

        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.

  6. Jim

    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

  7. Sivapathasuntharam

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

  8. houda

    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

  9. Dominique DELEAZ

    Hello, How do you manage LCD and RTC with only one SDA and one SLC ?

  10. Baptiste LAGNEAUX

    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 !

    • Dejan Nedelkovski

      Hey, you can use the Arduino substring() function to extract, the hours and the minutes separately, and also if you need them as integers use the toInt() function to convert them to integers.

  11. James

    Do I have to use an Arduino Mega,
    for say could i shrink it down to an Arduino Micro size?

  12. Daniel Fernandes

    And how to use the temperature sensor of the DS3231 module in code?

  13. Philip

    Very useful your website and the explanation with examples demo is easy to learn. Thanks very much.

  14. Philip

    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.

  15. alfian

    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?

    • Dejan

      Well once you set the time you need to program your Arduino again, but without the set time functions, remove them from the setup section.

  16. Musdalifa

    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?

    • Dejan

      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.

  17. Noman sarwar

    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.

    • Dejan

      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.

  18. Noman sarwar

    Nice, your project is too good, and I will use a great part of this.

  19. Caden

    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)’;


Leave a Reply

Your email address will not be published.


Best Entry Level Oscilloscopes for Beginners and Hobbyists 2019



The 8 Best Arduino Starter Kits For Beginners in 2019



Best 3D Printers for Beginners and Hobbyists - 3D Printing