DS3231 — микросхема часов реального времени I²C со встроенным термокомпенсированным кварцевым генератором (TCXO), резервным питанием, двумя будильниками и программируемым меандром. Фиксированный адрес I²C — 0x68. Точность микросхемы: ±2 ppm при 0…+40 °C и ±3,5 ppm при −40…+85 °C; EEPROM, светодиод, стабилизатор и зарядная схема на модуле не входят в DS3231.
Что такое модуль RTC DS3231?
Модуль DS3231 RTC — это популярный модуль реального времени (RTC), который широко используется в электронных проектах. Это небольшое недорогое устройство, обеспечивающее точные функции хронометража и календаря. Модуль DS3231 RTC основан на чипе DS3231, который представляет собой чрезвычайно точный RTC со встроенным кварцевым генератором с температурной компенсацией. Он способен предоставлять информацию о времени и дате с точностью до ±2 ppm.
Модуль DS3231 RTC широко используется в таких приложениях, как регистрация данных, временные метки и системы сигнализации. Он также часто используется в электронных устройствах, требующих точного отсчета времени, таких как камеры, аудиорекордеры и промышленные контроллеры. Модуль прост в использовании и может подключаться к микроконтроллерам, таким как Arduino и Raspberry Pi.
В целом, модуль DS3231 RTC является надежным и точным часовым модулем, который широко используется в различных электронных проектах.
Параметры модуля RTC DS3231
| Параметр DS3231 | Значение datasheet |
|---|---|
| Основное питание | 2,3–5,5 В |
| Резервный вход | 2,3–5,5 В |
| Адрес RTC | фиксированный 0x68 |
| Скорость I²C | до 400 кГц |
| Точность | ±2 ppm (0…+40 °C); ±3,5 ppm (−40…+85 °C) |
| Температурный выход | ±3 °C |
| Функции | два будильника; меандр; високосный год до 2100 |
| Зависит от модуля | размеры, AT24C32, LED, стабилизатор и зарядная схема различаются |
Структура микросхемы часов DS3231
Часовой чип DS3231 состоит из восьми модулей, разделенных на четыре функциональные группы: TCXO, управление питанием, кнопка сброса и RTC.

DS3231 TCXO
TCXO включает в себя датчик температуры, генератор и логику управления. Контроллер считывает выходные данные датчика температуры на микросхеме, использует таблицу поиска для определения требуемой емкости, добавляет поправку на старение из регистра AGE, а затем устанавливает регистр выбора емкости. Новые значения, включая изменения в регистре AGE, загружаются только при изменении температуры или по завершении инициированного пользователем преобразования температуры. Значение температуры считывается при включении питания VCC, а затем каждые 64 секунды.
Управление питанием DS3231
Опорный источник и компаратор контролируют VCC. Ниже порога сбоя доступ блокируется, ход часов переключается на VBAT, а RST становится низким. При первом подключении только VBAT генератор ждёт подачи VCC или записи допустимого адреса I²C; после событий питания проверяйте Oscillator Stop Flag.
Кнопка сброса DS3231
DS3231 имеет функцию кнопочного переключателя, подключенную к выводу RST. Если DS3231 не находится в цикле сброса, он непрерывно контролирует нисходящий фронт сигнала RST. При обнаружении перехода фронта DS3231 завершает дебаунсинг переключателя, опуская RST вниз. После истечения времени внутреннего таймера DS3231 продолжает контролировать сигнал RST. Если сигнал остается на низком уровне, DS3231 продолжает контролировать сигнальную линию для обнаружения нарастающего фронта. Как только кнопка отпускается, DS3231 принудительно устанавливает RST в низкий уровень и поддерживает tRST. RST также может использоваться для индикации сигналов тревоги о сбое питания. Когда VCC ниже VPF, генерируется внутренний сигнал тревоги о сбое питания, и RST переводится в низкий уровень. Если генератор не работает при нагрузке VCC, tREC пропускается, и RST немедленно переходит в высокий уровень.
DS3231 Часы и календарь RTC
Информацию о часах и календаре можно получить, прочитав соответствующие байты регистра. Данные часов и календаря можно установить или инициализировать, записав соответствующие байты регистра. Содержимое регистров часов и календаря представлено в двоично-десятичном кодированном формате (BCD). DS3231 работает в 12-часовом или 24-часовом режиме. Шестой бит регистра часов определяет выбор 12-часового или 24-часового режима. Когда этот бит имеет высокий уровень, выбирается 12-часовой режим. В 12-часовом режиме пятый бит является битом индикатора AM/PM, который имеет высокий логический уровень для PM.
Внутренние регистры и функции DS3231
Адреса регистров DS3231 — 00h~12h, которые используются для хранения секунд, минут, часов, недель, дат и информации о настройках будильника соответственно. При многобайтовом доступе, если адрес достигает 12h в конце пространства ОЗУ, происходит перемотка. В это время происходит переход в начальную позицию, которая является единицей 00h.
Информация о времени и календаре DS3231 устанавливается и инициализируется путем чтения соответствующих регистров. Вспомогательный буфер пользователя используется для предотвращения возможных ошибок при обновлении внутренних регистров. При чтении регистров времени и календаря буфер пользователя находится в любом состоянии START. Или синхронизируйте с внутренним регистром, когда указатель регистра возвращается в нулевое положение.
Информация о времени считывается из этих вспомогательных регистров, и часы продолжают работать в это время, так что можно избежать повторного считывания регистров, когда обновление главного регистра происходит во время операции чтения. На примере регистра управления (адрес 0EH) можно управлять часами реального времени, будильником и выходом прямоугольных импульсов.
Схема выводов DS3231

| Название пина | Функция |
|---|---|
| 32 kHz | Выход частоты 32 кГц |
| VCC | Используется для пина постоянного тока основного источника питания |
| /INT/SQW | Прерывание с активным низким уровнем или выход прямоугольного сигнала |
| RST | Пин сброса (Reset) |
| N.C. | Означает отсутствие подключения; внешне должен быть заземлен |
| GND | Земля (Общий) |
| VBAT | Вход резервного питания |
| SDA | Последовательный вход и выход данных |
| SCL | Последовательный вход тактового сигнала |
Блок-схема DS3231

Программирование модуля RTC DS3231 с Arduino Uno
Необходимые инструменты:
- Arduino Uno x1
- Модуль RTC DS3231 x1
- Перемычка (линия DuPont)
Инструкции по подключению

| Пин на модуле RTC DS3231 | Пин на Arduino Uno |
|---|---|
| SCL | A5 |
| SDA | A4 |
| VCC | 5V |
| GND | GND |
Установка библиотеки RTClib
В этом примере используется библиотека RTClib, написанная Adafruit. Сначала установите эту библиотеку.
Проект — Загрузить библиотеки — Управление библиотеками — Введите «RTClib» в поле поиска.
Программирование DS3231
Сначала необходимо загрузить только что установленную библиотеку RTClib.
#include "RTClib.h"
После этого вы можете создать экземпляр DS3231 с именем rtc и вызвать функцию RTC_DS3231.
RTC_DS3231 rtc;
Для настройки времени используются функции rtc.adjust, например:
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
Он используется для rtc.now() получения времени DS3231, и возвращаемые данные имеют тип DateTime, который содержит данные года, месяца, дня, часа, минуты и секунды, например:
DateTime now = rtc.now();
// Display the current time of DS3231 through the serial port output
Serial.print(now.year(), DEC); // display the year in decimal
Serial. print('/');
Serial.print(now.month(), DEC);// Display the month in decimal
Serial. print('/');
Serial.print(now.day(), DEC);// Display the day in decimal
Serial. print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial. print(") ");
Serial.print(now.hour(), DEC);// display in decimal
Serial. print(':');
Serial.print(now.minute(), DEC);// Display minutes in decimal
Serial. print(':');
Serial.print(now.second(), DEC);// Display seconds in decimal
Serial. println();
Полный код программы
// by lingshunlab.com
// Load the library of DS3231
#include "RTClib.h"
// create rtc instance
RTC_DS3231 rtc;
String input_string; // Declare the variable input_string to store the data input by the serial port
// Declare a two-dimensional array variable daysOfTheWeek, which is used to match the corresponding week name through the index (index) of the array
char daysOfTheWeek[7][12] = {"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"};
// get serial port data function
void GetSerialStuff(String& input_string) {
String temp_string = ""; // Declare the variable temp_string to temporarily store the data input by the serial port
while(Serial.available()) { // When the serial port has data, loop execution
temp_string += (char)Serial.read(); // Combine the read serial data into the inStr variable one by one
delay(2);
}
input_string = temp_string; // Assign the reference pointer variable to tempStr
}
void setup() {
Serial.begin(9600);
// Initialize rtc,
if (! rtc.begin()) { // If initialization fails, then
Serial.println("Couldn't find RTC");
Serial. flush();
abort(); // program stops
}
}
void loop() {
GetSerialStuff(input_string); // Get the data of the serial port
if(input_string != "") { // If the serial port is not empty, then
int to_year = input_string.substring(0, 4).toInt(); // Intercept year data from string and convert to int data type
int to_month = input_string.substring(5, 7).toInt(); // Intercept the month data from the string and convert it to int data type
int to_day = input_string.substring(8, 10).toInt(); // Intercept the day data from the string and convert it to int data type
int to_hours = input_string.substring(11, 13).toInt(); // Intercept the hour data from the string and convert it to int data type
int to_minute = input_string.substring(14, 16).toInt(); // Intercept minute data from the string and convert it to int data type
int to_second = input_string.substring(17, 19).toInt(); // Intercept the second data from the string and convert it to int data type
// Reset the time of the DS3231 module
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
delay(100);
}
// Get the time of DS3231
DateTime now = rtc.now();
// Display the current time of DS3231 through the serial port output
Serial.print(now.year(), DEC); // display the year in decimal
Serial. print('/');
Serial.print(now.month(), DEC);// Display the month in decimal
Serial. print('/');
Serial.print(now.day(), DEC);// Display the day in decimal
Serial. print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial. print(") ");
Serial.print(now.hour(), DEC);// display in decimal
Serial. print(':');
Serial.print(now.minute(), DEC);// Display minutes in decimal
Serial. print(':');
Serial.print(now.second(), DEC);// Display seconds in decimal
Serial. println();
// Display the temperature sensor data of DS3231 through the serial port output
Serial. print("Temperature: ");
Serial.print(rtc.getTemperature());
Serial. println("C");
delay(1000);
}
DS3231 Применение
- Системы сбора данных
- Промышленные системы управления
- Резервное питание от аккумулятора
- Контроль температуры
- Системы контроля доступа
- Медицинские устройства
Встроенные заметки интеграции для модуля DS3231 RTC
Проверка модуля: уточните его схему, подтяжки I²C, логическое напряжение, тип батареи и наличие зарядной цепи. AT24C32, размеры, LED и зарядные компоненты зависят от платы и не являются частью DS3231. Для RTC используйте 0x68, добавленную EEPROM ищите отдельно. Источники: Analog Devices DS3231, datasheet Rev. 10 и руководство Adafruit.




