Часы реального времени на rtc модулях ардуино ds1302, ds1307, ds3231

Block Diagram of DS1307

This RTC IC contains more than seven internal blocks, the first one is oscillator and divider it is connected with standard 32.768 KHz quartz crystal, the internal oscillator circuitry is designed for operation with a crystal having a specified capacitance of 12.5 pF. The power control block have Vcc, Gnd and Vbat pins, here Vcc and Gnd pins provides primary power supply.

When the voltage is applied within normal limits, the device is fully accessible and data can be written and read. When the battery supply connected (Vbat) without primary supply read and writes are inhibited, but the time keeping function continues.

The DS 1307 RTC communicates with external world through serial bus interface I²C protocol. SCL (Serial Clock), SDA (Serial Data).

Wiring DS1307 RTC module to Arduino UNO

Let’s hook the RTC up to the Arduino.

Connections are fairly simple. Start by connecting VCC pin to the 5V output on the Arduino and connect GND to ground.

Now we are remaining with the pins that are used for I2C communication. Note that each Arduino Board has different I2C pins which should be connected accordingly. On the Arduino boards with the R3 layout, the SDA (data line) and SCL (clock line) are on the pin headers close to the AREF pin. They are also known as A5 (SCL) and A4 (SDA).

If you have a Mega, the pins are different! You’ll want to use digital 21 (SCL) and 20 (SDA). Refer below table for quick understanding.

Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

The following diagram shows you how to wire everything.

Wiring DS1307 RTC module with Arduino

DS1307 RTC chip

At the heart of the module is a low-cost, quite accurate RTC chip from Maxim – DS1307. It manages all timekeeping functions and features a simple two-wire I2C interface which can be easily interfaced with any microcontroller of your choice.

The chip maintains seconds, minutes, hours, day, date, month, and year information. The date at the end of the month is automatically adjusted for months with fewer than 31 days, including corrections for leap year (valid up to 2100). The clock operates in either the 24-hour or 12-hour format with an AM/PM indicator.

The other cool feature of this board comes with SQW pin, which outputs one of four square-wave frequencies 1Hz, 4kHz, 8kHz or 32kHz and can be enabled programmatically.

DS1307 come with an external 32kHz crystal for time-keeping. The problem with these crystals is that external temperature can affect their oscillation frequency. This change in frequency is negligible but it surely adds up.

This may sound like a problem, but it’s not. It actually results with the clock being off by around five or so minutes per month.

Модули часов реального времени в проектах Arduino

Модуль часов представляет собой небольшую плату, содержащей, как правило, одну из микросхем DS1307, DS1302, DS3231.Кроме этого, на плате практически можно найти механизм установки батарейки питания. Такие платы часто  применяется для учета времени, даты, дня недели и других хронометрических параметров. Модули работают от автономного питания – батареек, аккумуляторов, и продолжают проводить отсчет, даже если на Ардуино отключилось питание. Наиболее распространенными моделями часов являются DS1302, DS1307, DS3231. Они основаны на подключаемом к Arduino модуле RTC (часы реального времени).

Часы ведут отсчет в единицах, которые удобны обычному человеку – минуты, часы, дни недели и другие, в отличие от обычных счетчиков и тактовых генераторов, которые считывают «тики». В Ардуино имеется специальная функция millis(), которая также может считывать различные временные интервалы. Но основным недостатком этой функции является сбрасывание в ноль при включении таймера. С ее помощью можно считать только время, установить дату или день недели невозможно. Для решения этой проблемы и используются модули часов реального времени.

Электронная схема включает в себя микросхему, источник питания, кварцевый резонатор и резисторы. Кварцевый резонатор работает на частоте 32768 Гц, которая является удобной для обычного двоичного счетчика. В схеме DS3231 имеется встроенный кварц и термостабилизация, которые позволяют получить значения высокой точности.


At the center of the DS1307 RTC module is an 8-pin DS1307 chip. It provides a real-time clock that is used to keep track of seconds, minutes, hours, days, months, and years. It uses the I2C communication protocol for communicating with other devices like in our case we are using Arduino. Arduino read values of time and date from DS1307 using the I2C communication protocol. Moreover, It also has a feature to keep a record of the exact time in case of power failure with the help of a backup battery. It is used to make a real-time clock using some other electronic components.

DS1307 Chip Pinout

The following figure shows the pinout diagram of DS1307 IC.

Now let’s see the functionality of each pin one by one.

  • X1 and X2 are used for crystal oscillators. The crystal oscillator value usually used with DS1307 is 32.768k Hz.
  • VBAT: Connect a CR2032 coil cell as backup power. Its value should be between 3-5 volt. voltage more than 5 volts may burn DS1307 permanently. A backup battery is used to keep track of time in case of power failure.
  • Vcc and GND are power supply pins
  • SDA and SCL are used to communicate with other devices over of I2C communication bus.
  • SQW pin provides square waves of different frequencies such as 1Hz, 4kHz, 8kHz, or 32kHz. The frequency of output wave can be selected by sending a signal to DS1307 over an I2C bus.

If you want to use this IC directly with Arduino, you need to use external components to connect with DS1307. The following circuit diagram shows the connections of all required components with DS1306:

Real Time Clock DS1307 Circuit Diagram

But instead of using DS1307 chip alone and making your own PCB desing, you can get a ready to use DS1307 RTC module in very low cost.

Сравнение популярных модулей RTC DS1302, DS1307, DS3231

В этой таблице мы привели список наиболее популярных модулей и их основные характеристики.

Название Частота Точность Поддерживаемые протоколы
DS1307 1 Гц, 4.096 кГц, 8.192 кГц, 32.768 кГц Зависит от кварца – обычно значение достигает 2,5 секунды в сутки, добиться точности выше 1 секунды в сутки невозможно. Также точность зависит от температуры. I2C
DS1302 32.768 кГц 5 секунд в сутки I2C, SPI
DS3231 Два выхода – первый на 32.768 кГц, второй – программируемый от 1 Гц до 8.192 кГц ±2 ppm при температурах от 0С до 40С.

±3,5 ppm при температурах от -40С до 85С.

Точность измерения температуры – ±3С


Работа программного обеспечения

Интерфейс DS5000

Программа, приведённая в Приложении, написана для взаимодействия DS5000 с DS1307 с помощью двухпроводного интерфейса. DS5000 запрограммирован с использованием макетной платы DS5000T фирмы Dallas Semiconductor, которая позволяет использовать ПК в качестве терминала ввода/вывода. Программные средства KIT5K поставляемые вместе с макетной платой DS5000T обеспечивают высокоуровневый интерфейс для загрузки программных приложений в DS5000 или установки его параметров через Program command. Программное обеспечение KIT5K содержит эмулятор терминала ввода/вывода, чтобы позволить пользователю запускать программные приложения в микроконтроллер DS5000, который связан с пользователем через COM порт ПК.

Исходный код DS1307

Первый раздел исходного кода, расположенный в Приложении, используется при конфигурации DS5000 для последовательного соединения с ПК. Также в начале кода находится подпрограмма MASTER_CONTROLLER, которая используется для управления демонстрационной программой.

Подпрограммы, которые следуют непосредственно за подпрограммой MASTER_CONTROLLER, являются драйверами низкого уровня и служат для управления двухпроводным интерфейсом. Они не являются индивидуальными для DS1307, а могут быть использованы с любым совместимым с двухпроводным интерфейсом «ведомым» устройством. Вот эти подпрограммы:


Подпрограмма используется для генерации состояния START на двухпроводной шине.


Подпрограмма используется для генерации состояния STOP на двухпроводной шине.


Подпрограмма посылает 8-разрядное слово (первым является старший значащий бит (MSB)) по двухпроводной шине и девятый тактовый импульс для импульса подтверждения приёма.


Подпрограмма читает 8-разрядное слово с двухпроводной шины. Она проверяет очищен ли флаг LASTREAD после того, как считан последний байт из «ведомого» устройства. Если это был не последний байт, то DS5000 посылает импульс подтверждения по девятому тактовому импульсу, а если это был последний считанный байт из «ведомого» устройства, то DS5000 посылает «неподтверждение».


Подпрограмма осуществляет переход линии SCL из низкого в высокое состояние и обеспечивает высокое состояние линии SCL перед продолжением.


Эти две подпрограммы включены для обеспечения сохранения временной диаграммы двухпроводной шины.

Остальная часть кода, включённая в приложение, специально предназначена для демонстрации функций DS1307. Продемонстрированы следующие функции:

Setting Time

Время считывается с клавиатуры и сохраняется в сверхоперативной памяти DS5000. Затем оно передаётся по двухпроводной шине в DS1307.


Одиночный байт в шестнадцатеричном виде считывается с клавиатуры и записывается в RAM DS1307.

Read Date/Time

Дата и время считываются по двухпроводной шине и сохраняются в сверхоперативной памяти DS5000. Затем они выводятся на экран. Это продолжается до тех пор, пока не будет нажата кнопка на клавиатуре.


Тактовый генератор DS1307 может быть включен или выключен.


Функция SQW/OUT может быть включена или выключена. Она будет переключаться на частоте 1 Гц.

Таблица 1. AC электрические характеристики

Параметр Символ Эффективноезначение Единицы
Тактовая частота SCL fSCL 59 кГц
Время свободного состояния шины между состояниями STOP и START tBUF 5.7 мкс
Время удержания(повторенного) состояния START tHD:STA 6.2 мкс
Период низкого состояния тактового импульса SCL tLOW 10.5 мкс
Период высокого состояния тактового импульса SCL tHIGH 6.5 мкс
Время установки для повторного состояния START tSU:STA 5.3 мкс
Время удержания данных tHD:DAT 5.5 мкс
Время установки данных tSU:DAT 3.1 мкс
Время установки для состояния STOP tSU:STO 5.4 мкс


Было показано, как правильно подсоединять напрямую DS1307 или любое двухпроводное «ведомое» устройство к 8051-совместимому микроконтроллеру. Соединение должно быть таким, чтобы временная диаграмма двухпроводного интерфейса на микроконтроллере не нарушалась драйверами низкого уровня. Для этого в программный код должны быть включены подпрограммы задержки. Приведённых в таблице 1 эффективных значений, придерживались при конфигурации аппаратной части, описанной в данном техническом руководстве.


  Rus Пример программы на языке Асемблер
  100 Kb Engl Исходный фаил
  Rus Описание интерфейса I2C
  Програмное обеспечение микроконтроллеров MCS-51
  200 Kb Engl Описание DS1307 — часы реального времени с IIC интерфейсом

Главная —
Микросхемы —
Источники питания —
Электромеханика —
Интерфейсы —
Программы —
Применения —


описание библиотеки для использования в Arduino модуля реального времени DS3107 на русском языке

Скачать:   на официальном сайте       зеркало1    зеркало2


   Эта библиотека была написана для легкого взаимодействия и использования модуля на микросхеме DS1307 с Arduino или chipKit без необходимости использования библиотеки Wire.   Данная библиотека использует по умолчанию режим Fast Mode (400 кГц) аппаратного интерфейса I2C.    Работа этой библиотека не гарантируется в режиме одновременной работы с библиотекой Wire и совместного использования контактов.


Time;Структура управления данными времени и даты.Переменныеhour, min, sec: Для определения данных времениdate, mon, year: Для определения данных датыdow: День недели, начиная с понедельникаПример: Time t; // Определяем структуру с именем t класса «время»DS1307_RAM;Буфер для использования совместно с ReadBuffer () и WriteBuffer ().Переменные: Cell : Байт-массив для хранения данных, с возможностью чтения или записи в ОЗУ микросхемы.Пример: DS1307_RAM ramBuffer; // Объявляем буфер для использования

Определенные литералы:

Дни неделиИспользуется совместно с setDOW() и Time.dowMONDAY:          1TUESDAY:         2WEDNESDAY:  3THURSDAY:      4FRIDAY:             5SATURDAY:      6SUNDAY:           7Длина названияИспользуется совместно с getTimeStr(), getDateStr(), getDOWStr() and getMonthStr()FORMAT_SHORT: 1 (полное название)FORMAT_LONG:  2 (сокращенное (3 буквенное) название)Формат датыИспользуется совместно с getDateStr()FORMAT_LITTLEENDIAN:    1  (дд.мм.гггг)FORMAT_BIGENDIAN:          2  (гггг.мм.дд)FORMAT_MIDDLEENDIAN:  3  (мм.дд.гггг)

Частота на выходе SQW

Используется совместно с setSQWRate()

SQW_RATE_1:     1  (1 Гц)

SQW_RATE_4K:  2  (4096 Гц)

SQW_RATE_8K:  3  (8192 Гц)

SQW_RATE_32K:  4  (32768 Гц)


DS1307(SDA, SCL);Инициализация библиотеки с помощью интерфейса I2CПараметры:SDA: Вывод подключения SDA-пина DS1307 (Вывод 5, данные)SCL: Вывод подключения SCL-пина DS1307 (вывод 6, тактирование)Пример: DS1307 rtc(SDA, SCL); // Инициализация библиотеки DS13071 с помощью  интерфейса I2CПримечание: DS1307 можно подключать с любым свободным выводам Arduino. Если в схеме уже используется шина I2C и Вы попытаетесь подключиться к тем же выводам, то данная библиотека работать не будет, т.к. любой TWI-совместимый протокол требует исключительного доступа к пинам.
begin();Инициализация подключения к DS1307Параметры: НетВозврат: НетПример:  rtc.begin(); //Инициализация подключения к DS1307
getTime();Считать текущие данные из DS3231.Параметры: НетВозврат: формат Time-structureПример: t = rtc.getTime(); // Считать текущую дату и время.

What is RTC or Real time Clock?

As its name suggests, a real-time clock is used to keep a record of the time and to display time. It is used in many digital electronic devices like computers, digital smartwatches, data loggers, and situations where you need to keep track of time. one of the great benefits of a real-time clock is that it also keeps a record of time even if the power supply is not available.

Now the question is how can an electronics device like real-time clockwork without the use of a power supply. Because almost all RTC modules come with small coin size 20mm 3V lithium coin cells which can work for years. Usually, CR2032 coil cells are used.

Как подключить DS1302 к Arduino (RTC)

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль DS1302, DS1307 или DS3231;
  • LCD монитор 1602 i2c;
  • провода «папа-мама».

DS1307 схема подключения к Ардуино Уно

Модули часов DS1307 и DS3231 подключаются к плате Ардуино через I2C протокол, как LCD дисплей I2C. Контакт SDA подключается к пину A4, контакт SCL к пину A5 Ардуино Уно. При подключении данных модулей к плате Arduino Mega следует использовать порты SDA (20 пин) и SCL (21 пин). При этом в скетче необходимо снять комментарий в строчке с нужным модулем, а строчку с модулем 1302 наоборот закомментировать.

Скетч. Работа с модулем ds3231 Ардуино DS1307

#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS1302,6,8,7);  // для модуля DS1302 - RST, CLK, DAT
// iarduino_RTC time(RTC_DS1307);       // для модуля DS1307 с i2C
// iarduino_RTC timeRTC_DS3231);        // для модуля DS3231 с i2C

void setup() {
   time.settime(0, 30, 18, 12, 6, 20, 5); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг

void loop() {
   // если прошла 1 секунда выводим время
   if (millis() % 1000 == 0) {
      Serial.println(time.gettime("d-m-Y, H:i:s, D"));

Пояснения к коду:

  1. для работы с программой необходимо скачать библиотеку iarduino_RTC.h.
  2. с помощью команды можно установить дату и время, которые будут выводится на монитор порта Arduino IDE каждую секунду.

Объяснение работы проекта

Как уже рассматривалось, RTC модуль имеет собственную батарейку, поэтому он всегда будет хранить точное время даже если питание схемы по каким то причинам будет пропадать.

В программе на Python мы будем считывать значение точного времени с RTC модуля DS1307 и показывать его на экране ЖК дисплея 16×2. На второй строке ЖК дисплея 16×2 мы будем отображать время срабатывания будильника и его статус (ON/ OFF – включен/выключен). Управлять работой будильника мы будем с помощью 5 кнопок, присутствующих в схеме. 2 кнопки будут использоваться для инкрементирования/декрементирования значения часов будильника, 2 кнопки – для инкрементирования/декрементирования значения минут будильника и 1 кнопка для включения/выключения будильника. Более подробно все эти процессы вы можете посмотреть на видео, приведенном в конце статьи.

Программа на Python будет непрерывно сравнивать текущее время с установленным временем будильника и при их совпадении она будет включать зуммер, подключенный к контакту GPIO 22 платы Raspberry Pi через NPN транзистор 2N2222.

Arduino CODE for RTC

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527

void setup(){

void loop(){

void setDateTime(){

  byte second =      45; //0-59
  byte minute =      40; //0-59
  byte hour =        ; //0-23
  byte weekDay =     2; //1-7
  byte monthDay =    1; //1-31
  byte month =       3; //1-12
  byte year  =       11; //0-99



  Wire.write(zero); //start 



byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val10*16) + (val%10) );

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val16*10) + (val%16) );

void printDate(){

  // Reset the register pointer

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());

  //print the date EG   3/1/11 23:59:59
  Serial.print(" ");


DS1307 RTC Module

DS1307 RTC module has all onboard components which are required for the correct functionality of a DS3107 chip. On top of that, it contains a holder to connect a 20mm 3V lithium coin cell. This holder can contain any CR2032 battery. Now let’s discuss the components of this module one by one:

At the center of the DS1307 RTC module is a chip which we have discussed earlier. This chip keeps track of seconds, minutes, hours, days, and months. At the end of every month, this chip automatically adjusts its seconds:minutes: hours, and date. It is also possible to configure time display in 12-hour with an AM and PM or 24-hour format.

32kHz Crystal Oscillator

As discussed earlier, the DS1307 chip requires 32KHz of an external crystal oscillator for its operation ( time-keeping). Therefore, the RTC module comes with 32KHz of an external crystal oscillator.

But there is one problem with this 32KHz crystal oscillator that is a change in environmental temperature affects the oscillation frequency of the crystal oscillator. This change in 32KHz of external crystal oscillation frequency is negligible. But it shows an error in the long run. It gives a clock drift of 2-3 minutes per month.

Onboard 24C32 EEPROM

DS1307 RTC module also contains onboard 24C32 EEPROM. This EEPROM can store 32 bytes and have limited read-write operations. We can use this memory to save time when we want to use an RTC module for Alarm based projects. For example, we want to set an alarm at 8:00 AM every day. We can save this time value into EEPROM and whenever the time matches with this saved value, an alarm starts.

These EEPROM chips also communicate with microcontrollers or Arduino over the I2C bus. Hence, it shares the same I2C bus as DS1307. Different slave addresses are assigned to EEPROM (o 0x50 Hex) and DS1307 chip to communicate with them on the same I2C bus.

Backup Battery

On the back side of a RTC module, there is a holder to connect CR2032 coil cell. This backup battery is used to keep track of time accurate even when the main power source which connected to DS1307 fails. This chip contains a power sensing circutry which senses main power and whenever the main power shutdown, it swithces to the backup coil cell.

In backup mode, DS1307 consumes only 300nA current. That means a backup battery based on a coin cell can work for more than 17 years. Because, generally, the capacity of CR2032 battery is 47mAh and chip consumes only 300nA when powers through a battery. Life_time = 47mAh/300nA = 156666 hours = 6527 days = 17+ years

DS18B20 Sensor

There is an empty slot available on this module to connect an external DS18B20 digital thermometer. The three empty pinouts in the bottom right corner is a place holder for the DS18B20 sensor and output of the sensor can be received from DS pin of RTC module.

DS1307 RTC Module Pinout

The following figure shows the pinout diagram. This module exposes a total of 7 pins out of which two are power supply pins and two are for SCL and SDA pins for the I2C communication bus. We have already seen the functionality of all these pins in the previous sections.

Battery Backup

The DS1307 incorporates a battery input, and maintains accurate timekeeping when main power to the device is interrupted.

The built-in power-sense circuit continuously monitors the status of VCC to detect power failures and automatically switches to the backup supply. So, you need not worry about power outages, your MCU can still keep track of time.

The bottom side of the board holds a battery holder for 20mm 3V lithium coincells. Any CR2032 battery can fit well.

Assuming a fully charged CR2032 battery with capacity 47mAh is used and chip consumes its minimum 300nA, the battey can keep the RTC running for a minimum of 17.87 years without an external 5V power supply.

47mAh/300nA = 156666.67 hours = 6527.78 days = 17.87 years

Что необходимо

  • компьютер с установленной Arduino IDE;
  • плата Arduino;
  • микросхема DS1307 или модуль RTC на ее основе;
  • перемычки;
  • макетная плата;
  • комплектующие из списка элементов.

Вы можете заменить плату Arduino на контроллер Atmel, но убедитесь, что у него достаточно входных и выходных выводов и есть аппаратная реализация интерфейса I2C. Я использую ATMega168A-PU. Если вы будете использовать отдельный микроконтроллер, то вам понадобится программатор, например, AVR MKII ISP.

Предполагается, что читатель знаком с макетированием, программированием в Arduino IDE и имеет некоторые знания языка программирования C. Обе программы, приведенные ниже, не нуждаются в дополнительном разъяснении.

DS1307 and Arduino Wiring Diagram

First make connections with DS1307 RTC module and Arduino according to this connection diagram:

Arduino UNO DS1307 RTC Module

Install DS1307 Library In Arduino IDE

To program a DS1307 RTC module, we use I2C communication pins of Arduino. If you don’t understand about I2C communication, you can read this report:

I2C Communication Arduino

But it demands an exercise to write a code from scratch. Luckily, an Arduino RTClib library is available, which implements callback functions to get time measurements from an RTC module. This library hides all the complexity to interact with an RTC module over I2C communication. We can use simple callback functions implemented by RTClib to read data from DS1307. 

Therefore, to program a DS1307  RTC module with Arduino, you will use the RTClib library available in Arduino IDE. 

To apply this library, first, we need to install this library in Arduino IDE by going to Arduino’s library manager. Open Arduino IDE, go to Tools > Manage Libraries.

After that, this window library manager window will appear. Search for “RTClib” by typing in the search bar. You will see many options for DS1307. But the one that we will use in this tutorial is RTClib by Adafruit. Select RTClib by Adafruit and click on the install button. 

When you click on the install button, you may get a message that RTClib may require other libraries dependencies which is currently not installed in your Arduino IDE. We recommend you to install all dependencies by clicking on install button. Otherwise, RTClib will not work properly.

OLED with DS1307 and Arduino

Now if you want to display time and data on OLED display, make connections according to this diagram. Connect SSD1306 OLED with the same I2C bus.