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:

  • DS3231 Real Time Clock…………….. Amazon
  • Arduino Board ………………………….. Amazon

*Please note: These are affiliate links. I may make a commission if you buy the components through these links.
I would appreciate your support in this way!

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.

24 Responses

  1. Mohamed Radwan

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

    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
    • Dejan Nedelkovski

      Hello,
      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.
      Cheers!

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

    Reply
  4. ksa

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

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

  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?

    Reply
    • 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?

      Reply
      • Dejan Nedelkovski

        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.

  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

    Reply
  7. Sivapathasuntharam

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

    Reply
  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

    Reply
  9. Dominique DELEAZ

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

    Reply

Leave a Reply

Your email address will not be published.