Часы реального времени · разбор

Часы реального времени и Arduino: DS3231, DS1307 и RTClib

Плата не знает, который час. Выключили питание — и время начинается с нуля. Разбираем модуль, который решает это раз и навсегда: чем DS3231 отличается от DS1307, почему время откатывается после каждой прошивки, сколько на самом деле живёт батарейка и когда модуль не нужен вовсе. Схемы на странице живые, все числа — из даташитов и карточек наших модулей.

Короткий ответ для нетерпеливых. Берите модуль на DS3231: четыре провода, адрес на шине 0x68, библиотека RTClib. Время ставится один раз — и главная ошибка новичка в том, что строку установки времени забывают убрать, поэтому после каждой прошивки часы возвращаются в прошлое.

Зачем вообще отдельный модуль

Микроконтроллер умеет считать миллисекунды с момента включения — этим и пользуются, когда делают таймер или секундомер. Но у такого счёта две беды. Первая очевидна: пропало питание — счёт начался заново. Вторая коварнее.

На плате Arduino Uno частоту процессору задаёт не кварц, а керамический резонатор. Его паспортный допуск — ±0,5 %, и ещё ±0,3 % добавляет температура. Половина процента от суток — это семь минут двенадцать секунд. Конкретный экземпляр обычно ведёт себя гораздо лучше, но гарантии нет никакой, и от платы к плате уход разный. Любопытная деталь: настоящий кварц на плате есть — он стоит у микросхемы, которая отвечает за USB, потому что связи с компьютером точность нужна, а вашему скетчу, по мнению разработчиков платы, не очень.

Модуль часов решает обе беды сразу: у него своя микросхема, свой задающий элемент и своя батарейка. Плата просто спрашивает: «который час?»

Счётчик внутри платыМодуль с батарейкойВремя из интернетаМодуль реального времениКак работаетОтдельная микросхема считает время сама и хранит его в своихрегистрах. Плата только спрашивает: «который час?»Переживёт выключениеДа. Батарейка держит счёт годами, даже когда плата обесточена.Насколько точноОколо минуты в год у DS3231 и около десяти минут в год у DS1307.Что нужно купитьМодуль и батарейка-таблетка, два провода на шину.Обычный ответ для часов, будильника, логгера и таймера полива
Три способа знать время. Счётчик внутри платы бесплатен, но сбрасывается и сильно врёт; модуль с батарейкой держит время сам; сеть даёт точность, пока она есть.

Насколько уходят разные часы

Точность принято мерить в миллионных долях — ppm. Одна миллионная доля за год даёт около 31 секунды. Дальше простая арифметика, и она выглядит внушительно.

Прошли сутки — насколько разошлись часыСчётчик платыкерамический резонатор, допуск 0,5 %7 мин 12 сDS1307обычный часовой кварц, ±20 ppm2 сDS3231кварц с термокомпенсацией, ±2 ppmменьше секундыДлина полос сжата: иначе первая была бы в две с половиной тысячи раз длиннее последней.
Тот же расчёт, что делает любой производитель: доля ухода умножается на прошедшее время. За год счётчик платы уйдёт почти на двое суток, DS1307 — на десять минут, DS3231 — на минуту.

У DS3231 внутри не просто кварц, а кварц с поправкой: микросхема раз в 64 секунды измеряет собственную температуру и подстраивает генератор по встроенной таблице. Именно это, а вовсе не «кварц внутри корпуса», и даёт минуту в год. Паспорт обещает уложиться в две минуты в год даже в диапазоне от минус сорока до плюс восьмидесяти пяти градусов.

У DS1307 своей точности нет вообще: в его даташите в разделе про точность нет ни одной цифры — там написано, что всё зависит от внешнего кварца, от того, совпала ли его нагрузочная ёмкость, и от температуры. Обычный часовой кварц имеет допуск ±20 ppm при комнатной температуре, а при отходе от неё частота падает по параболе. Отсюда и практические «минута в месяц».

Есть и третья составляющая, о которой почти не пишут, — старение. Кварц медленно меняет частоту просто от времени: даташит DS3231 нормирует ±1 ppm за первый год и до ±5 ppm за десять лет. То есть десятилетние часы будут уходить заметнее новых, и это тоже норма.

Какую микросхему выбрать

МикросхемаТочностьПитаниеЧто ещё умеетКогда брать
DS3231Около минуты в год: внутри поправка на температуру3,3 или 5 вольтДва будильника, термометр, выход опорной частотыКогда время должно быть точным и подводить его некому
DS1307Около десяти минут в год: обычный кварц снаружиТолько 5 вольтВыход прямоугольного сигналаКогда часы под рукой и раз в месяц их не жалко подвести
RX-8025TМежду двумя предыдущими, с температурной поправкой3,3 или 5 вольтБудильник, таймер, выход сигналаКогда нужен запас по точности, но не по цене
DS1302Как у DS1307: всё зависит от кварца2…5,5 вольтаСвои три провода вместо общей шины, будильников нетПочти не берут: занимает три ножки и не живёт на общей шине

Одно ограничение стоит запомнить заранее: у DS1307 и DS3231 один и тот же адрес на шине — 0x68, и поменять его нечем. Два модуля часов на одну шину не повесить, даже если микросхемы разные.

И ещё одно, важное для плат с Wi-Fi: DS1307 по паспорту требует от 4,5 до 5,5 вольта. Хуже того, когда питание опускается ниже примерно 3,75 вольта, он считает, что основного питания больше нет, переходит на батарейку и перестаёт отвечать по шине. Время при этом идёт, но прочитать его нельзя. Поэтому с ESP8266 и ESP32, где логика трёхвольтовая, берут DS3231.

Что на модуле и где ловушка

Модуль с четырьмя контактамиМодуль покрупнее, с гребёнкойGNDVCCSDASCLDS3231CR1220DS3231памятьCR2032Сами часы — одна микросхемаОна считает секунды, минуты, часы, дату и день недели и отвечает по шине на адрес 0x68.У DS3231 внутри есть поправка на температуру, поэтому уход около минуты в год; у DS1307её нет.
Два исполнения одного и того же. Слева — компактный модуль на четыре контакта, справа — плата покрупнее, где рядом с часами живут память и цепь подзарядки. Именно из-за неё в такой модуль нельзя ставить обычную батарейку-таблетку.

Про цепь подзарядки стоит сказать отдельно, потому что это единственное место, где ошибка может закончиться не «не работает», а испорченной батарейкой. На части модулей рядом с держателем распаяны диод и резистор на 200 ом — это зарядное устройство для аккумулятора LIR2032, который внешне не отличается от обычной батарейки CR2032. Если в такой модуль поставить обычную таблетку и запитать модуль пятью вольтами, её начнут заряжать. Производитель CR2032 нормирует предельно допустимый зарядный ток как 1 микроампер — то есть заряжать её нельзя вообще. Приятная деталь: при питании модуля от 3,3 вольта диод в этой цепи не открывается, и заряда нет.

На модулях линейки Trema, которые продаём мы, батарейка указана в паспорте прямо: CR1220 или CR1225 — обычные, не аккумуляторы. Если модуль пришёл откуда-то ещё, сверьтесь с его паспортом, прежде чем вставлять таблетку.

Как подключить

Модуль живёт на шине I2C — это два провода на любое количество устройств. Подробно про саму шину, адреса и сканер написано в разборе «Шина I2C в Arduino»; здесь только то, что относится к часам.

Вывод модуляUno, Nano, MegaESP32 и ESP8266Зачем
VCC5V3V3Модулю на DS1307 нужны именно 5 вольт
GNDGNDGNDОбщая земля обязательна, без неё шина молчит
SDAA4GPIO 21 у ESP32, D2 у ESP8266Линия данных
SCLA5GPIO 22 у ESP32, D1 у ESP8266Линия тактов
SQW / INTЛюбой вывод с прерыванием: 2 или 3Любой свободныйНужен только для будильника
32KНе подключаютНе подключаютОтдельный выход 32 768 колебаний в секунду

Обязательных проводов четыре, и первый признак, что всё собрано верно, — сканер шины видит адрес 0x68. Если модуль покрупнее, рядом появится ещё 0x57: это отдельная микросхема памяти на четыре килобайта, часам она не нужна, но на шине видна.

Первый скетч: показать время

Здесь сразу правильный порядок: время ставится не всегда, а только если часы теряли питание. Библиотека сама хранит этот признак в микросхеме.

// Часы, которые не сбиваются. Время ставится ОДИН раз: при первом запуске
// или после того, как села батарейка. Дальше модуль считает секунды сам —
// хоть с выключенной платой.

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

const char *WEEKDAYS[] = {"воскресенье", "понедельник", "вторник", "среда",
                          "четверг", "пятница", "суббота"};

void setup() {
  Serial.begin(9600);
  if (!rtc.begin()) {
    Serial.println("Модуль часов не отвечает. Проверьте SDA, SCL и питание");
    while (true) {
      ;
    }
  }
  // Флаг взводится только когда часы теряли питание совсем:
  // батарейка села или её ещё не ставили.
  if (rtc.lostPower()) {
    Serial.println("Часы сбились — ставлю время момента компиляции");
    rtc.adjust(DateTime(__DATE__, __TIME__));
  } else {
    Serial.println("Часы идут своим ходом, время не трогаю");
  }
}

void loop() {
  DateTime now = rtc.now();
  Serial.print(now.day());
  Serial.print(".");
  Serial.print(now.month());
  Serial.print(".");
  Serial.print(now.year());
  Serial.print(" ");
  Serial.print(now.hour());
  Serial.print(":");
  if (now.minute() < 10) {
    Serial.print("0");
  }
  Serial.print(now.minute());
  Serial.print(":");
  if (now.second() < 10) {
    Serial.print("0");
  }
  Serial.print(now.second());
  Serial.print(", ");
  Serial.print(WEEKDAYS[now.dayOfTheWeek()]);
  Serial.print(", в корпусе ");
  Serial.print(rtc.getTemperature());
  Serial.println(" градусов");
  delay(1000);
}

Строка с установкой времени подставляет момент, когда скетч был скомпилирован. Это удобно ровно один раз, и именно она — источник самой частой жалобы: «загружаю скетч, а часы показывают вчерашнее». Разгадка в том, что при повторной загрузке того же файла в микросхему снова уезжает старый момент компиляции. Пока признак потери питания проверяется, беды нет; уберите проверку — и часы будут отматываться назад при каждой прошивке.

Про термометр в скетче. DS3231 действительно умеет отдавать температуру, но нужна она ему для собственной поправки, а паспортная погрешность — около трёх градусов. Как термометр комнаты он не годится: для этого есть DS18B20 и DHT22.

Будильник, который не зависит от программы

Обычно будильник пишут так: каждую секунду сравнить текущее время с заданным. Работает, но пока скетч занят чем-то долгим, момент можно пропустить. У DS3231 будильники встроены: микросхема сама сравнивает время и прижимает свою ножку, когда совпало. Плате остаётся заметить это.

// Будильник живёт в самом модуле часов. Плата не считает время и не сравнивает
// его каждую секунду — она просто ждёт, когда модуль прижмёт свою ножку INT.
// Так будильник срабатывает точно в секунду, даже если скетч занят другим.

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

const int ALARM_PIN = 2;  // ножка INT/SQW модуля, подтяжка включается внутри платы
const int BUZZER_PIN = 8;
const int ALARM_HOUR = 7;
const int ALARM_MINUTE = 30;

void setup() {
  Serial.begin(9600);
  pinMode(ALARM_PIN, INPUT_PULLUP);
  pinMode(BUZZER_PIN, OUTPUT);

  if (!rtc.begin()) {
    Serial.println("Модуль часов не отвечает");
    while (true) {
      ;
    }
  }

  // Прямоугольный сигнал на выходе нам не нужен: ножка должна работать
  // как сигнал будильника, иначе она всё время дёргается сама.
  rtc.writeSqwPinMode(DS3231_OFF);
  rtc.disableAlarm(2);
  rtc.clearAlarm(1);
  // Совпадать должны часы и минуты, дата не важна — значит, каждый день.
  rtc.setAlarm1(DateTime(2026, 1, 1, ALARM_HOUR, ALARM_MINUTE, 0),
                DS3231_A1_Hour);
  Serial.println("Будильник заведён");
}

void loop() {
  if (rtc.alarmFired(1)) {
    Serial.println("Подъём!");
    for (int i = 0; i < 10; i++) {
      tone(BUZZER_PIN, 2000, 200);
      delay(400);
    }
    // Пока не сбросим признак, модуль держит ножку прижатой и молчит дальше.
    rtc.clearAlarm(1);
  }
  delay(200);
}

Будильников два. Первый умеет совпадать вплоть до секунды, второй — до минуты. Признак срабатывания нужно сбрасывать вручную: пока он взведён, ножка остаётся прижатой, и следующего сигнала не будет.

Расписание: полив и свет

Самое частое, ради чего покупают модуль, — не показывать время, а действовать по нему. Здесь важна деталь: свет включается по промежутку часов, а полив — один раз в сутки, и чтобы он не повторился шестьдесят раз за минуту, плата запоминает день, в который уже поливала.

// Расписание: свет включается вечером и гаснет ночью, полив идёт утром.
// Плата ничего не считает и не запоминает — она просто спрашивает у модуля,
// который час, и сравнивает с расписанием. После отключения света расписание
// продолжает работать с той же минуты, потому что время не терялось.

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

const int LIGHT_PIN = 7;
const int PUMP_PIN = 8;

const int LIGHT_ON_HOUR = 19;
const int LIGHT_OFF_HOUR = 23;
const int PUMP_HOUR = 7;
const int PUMP_MINUTE = 0;
const unsigned long PUMP_SECONDS = 20;

int lastPumpDay = -1;

// Правда ли, что текущий час попадает в промежуток между двумя часами.
bool betweenHours(int hour, int from, int to) {
  if (from < to) {
    return hour >= from && hour < to;
  }
  // Расписание через полночь: например, с 22 до 6.
  return hour >= from || hour < to;
}

void setup() {
  Serial.begin(9600);
  pinMode(LIGHT_PIN, OUTPUT);
  pinMode(PUMP_PIN, OUTPUT);

  if (!rtc.begin()) {
    Serial.println("Модуль часов не отвечает. Проверьте SDA, SCL и питание");
    while (true) {
      ;
    }
  }
  if (rtc.lostPower()) {
    Serial.println("Часы сбились: поставьте время и прошейте ещё раз");
  }
}

void loop() {
  DateTime now = rtc.now();

  digitalWrite(LIGHT_PIN, betweenHours(now.hour(), LIGHT_ON_HOUR, LIGHT_OFF_HOUR));

  // Полив ровно один раз в сутки: запоминаем день, в который уже поливали.
  bool pumpTime = now.hour() == PUMP_HOUR && now.minute() == PUMP_MINUTE;
  if (pumpTime && now.day() != lastPumpDay) {
    lastPumpDay = now.day();
    Serial.println("Полив");
    digitalWrite(PUMP_PIN, HIGH);
    delay(PUMP_SECONDS * 1000);
    digitalWrite(PUMP_PIN, LOW);
  }

  delay(1000);
}

Наша библиотека: то же самое короче

В каталоге есть iarduino_RTC — она знает четыре микросхемы сразу и выдаёт время готовой строкой, где буква означает часть даты. И у неё есть особенность, на которой спотыкаются все.

// То же самое, но нашей библиотекой iarduino_RTC. Она знает несколько
// микросхем сразу и выдаёт время готовой строкой: буква означает часть даты.
// ВАЖНО: Wire.h подключается ВЫШЕ, иначе библиотека не увидит шину I2C
// и компилятор скажет, что у класса нет метода begin.

#include <Wire.h>
#include <iarduino_RTC.h>

iarduino_RTC clockModule(RTC_DS3231);

void setup() {
  Serial.begin(9600);
  delay(300);
  clockModule.begin();
  // Порядок: секунды, минуты, часы, день, месяц, год, день недели.
  // Эту строку оставляют лишь на одну прошивку: иначе при каждой перезагрузке
  // часы будут возвращаться в один и тот же момент.
  clockModule.settime(0, 30, 12, 24, 8, 26, 0);
}

void loop() {
  // d — день, m — месяц, Y — год, H — часы, i — минуты, s — секунды, D — день недели.
  Serial.println(clockModule.gettime("d-m-Y, H:i:s, D"));
  delay(1000);
}

Порядок подключения здесь важен. Строка с Wire обязана стоять выше строки с iarduino_RTC: библиотека смотрит, доступна ли аппаратная шина, в момент разбора заголовка. Если поменять строки местами, компилятор напишет, что у класса нет метода begin — сообщение, по которому догадаться о причине невозможно. Мы это специально воспроизвели на сборке.

Какие библиотеки бывают

БиблиотекаЧто подключаютМикросхемыОсобенности
RTClibRTClib.hDS3231, DS1307, PCF8523, PCF8563Самая ходовая. Умеет будильники DS3231, даёт удобный тип «дата и время»
iarduino_RTCiarduino_RTC.hDS1302, DS1307, DS3231, RX-8025Наша. Выдаёт время готовой строкой; подключается строго после Wire
uRTCLibuRTCLib.hDS1307, DS3231Экономит память платы: пригодится, когда скетч уже не влезает
DS1307RTC + TimeLibDS1307RTC.hDS1307, DS3231Старая связка из двух библиотек, встречается в чужих примерах
Rtc by MakunaRtcDS3231.hDS1302, DS1307, DS3231Подробная работа с признаками и будильниками, разные заголовки под чипы

Все пять есть в каталоге библиотек, и искать их можно прямо по строке подключения. Как поставить библиотеку — разобрано в «Библиотеки Arduino».

Сколько живёт батарейка

Считается делением: ёмкость батарейки на ток, который часы берут без питания платы. По даташиту DS3231 берёт от батарейки около 0,84 микроампера, DS1307 — и вовсе десятые доли микроампера. Наши карточки указывают предельные значения: до 3,5 микроампера у DS3231 и до 0,8 у DS1307.

БатарейкаЁмкостьПри типовом токе DS3231При предельном токе из паспорта модуля
CR1220около 35 мА·чоколо четырёх с половиной летчуть больше года
CR2032около 220 мА·чдольше, чем живёт сама батарейкаоколо семи лет

На практике верхнюю границу задаёт не расход, а саморазряд литиевой таблетки — около процента в год. Поэтому «пять лет» и «двадцать лет» на бумаге на деле означают одно и то же: батарейку меняют раз в несколько лет. А вот если она садится за пару месяцев — это неисправность, и первое, что стоит проверить, — нет ли на модуле цепи подзарядки.

Когда модуль не нужен

Если у платы есть Wi-Fi, время можно спросить у сервера точного времени, и тогда часы не нужно ни заводить, ни подводить — это разобрано в статье «Wi-Fi для Arduino». Модуль остаётся нужен там, где сети может не быть: теплица, дача, прибор, который включают в поле. Лучший вариант — оба сразу: сеть подводит часы, когда доступна, модуль держит время, когда сети нет.

И наоборот, модуль не спасёт, если задача — просто отмерять промежутки: «раз в пять секунд», «через минуту после нажатия». Для этого достаточно счётчика платы, и как им пользоваться, написано в «millis и delay».

Что делать, если не работает

Что видноПочему такЧто сделать
После каждой прошивки время откатывается назадВ скетче осталась безусловная установка времениСтавить время только по признаку «часы теряли питание» или один раз, отдельным скетчем
Время сбрасывается после выключения платыБатарейки нет, она села или вставлена не той сторонойПлюс таблетки смотрит вверх, к пружинке прижимается минус; проверьте напряжение — должно быть около 3 вольт
Модуль не отвечает вовсеПерепутаны SDA и SCL или нет питанияЗапустите сканер шины: часы обязаны отозваться на 0x68
Сканер находит 0x57 и 0x68На модуле рядом с часами стоит микросхема памятиТак и должно быть, это не поломка
Модуль на DS1307 молчит на плате ESPЕму нужно 5 вольт, а плата даёт 3,3Взять модуль на DS3231 или запитать DS1307 от пяти вольт, согласовав уровни
Часы уходят на минуту в месяцЭто DS1307 — нормальный результат для обычного кварцаЕсли нужна точность, ставьте DS3231; подводить время программно бессмысленно
Часы уходят, хотя стоит DS3231Модуль греется рядом с чем-то тёплым или это не DS3231Прочитайте маркировку на микросхеме и отодвиньте модуль от стабилизатора и радиомодуля
Батарейка садится за пару месяцевБатарейка старая, либо модуль пытается её заряжатьПроверьте, нет ли на плате цепи подзарядки под аккумулятор, и что написано в паспорте модуля
Компилятор пишет, что у класса нет метода beginСтрока с подключением Wire стоит ниже строки с библиотекой часовПоменять две строки местами: Wire подключается первой
Компилятор не находит RTClib.hБиблиотека не установленаПоставить её из каталога прямо в среде — по имени файла из строки подключения
Термометр модуля показывает не то, что термометр в комнатеОн меряет температуру собственного кристалла, погрешность около трёх градусовДля измерения комнаты взять отдельный датчик
Два модуля часов на одной шине конфликтуютИ у DS1307, и у DS3231 адрес намертво зашит один и тот жеВторой модуль на ту же шину не повесить: адрес не меняется

Что понадобится

Всё перечисленное есть у нас; цены и наличие проверены 24.08.2026, ссылки ведут в магазин iarduino.ru.

Часы реального времени DS3231 (Trema-модуль)

Главный герой страницы: точность около минуты в год, питание и 3,3, и 5 вольт, адрес на шине 0x68. Плата 30×30 мм, батарейка CR1220 — обычная, не аккумулятор, так что подзаряжать её никто не пытается.

486 ₽
Открыть карточку
арт. 877 · цена и наличие на 24.08.2026

Часы реального времени DS1307Z (Trema-модуль)

Вдвое дешевле, тот же адрес и та же библиотека, но без поправки на температуру: уход около минуты в месяц. Питание — ровно 5 вольт, поэтому с платами ESP напрямую он не дружит. Зато резервную батарейку тратит вчетверо экономнее.

280 ₽
Открыть карточку
арт. 643 · цена и наличие на 24.08.2026

Часы реального времени DS1307Z с памятью

Тот самый «модуль покрупнее» со схемы: рядом с часами стоит микросхема памяти на четыре килобайта с адресом 0x57 — в неё удобно складывать показания датчиков с отметкой времени. Крепится монтажными отверстиями.

252 ₽
Открыть карточку
арт. 58 · цена и наличие на 24.08.2026

Батарейка CR1220

Та самая таблетка для модулей Trema: три вольта, около 35 мА·ч. Часы от неё идут годами, но раз в несколько лет её всё-таки меняют — иначе однажды утром время окажется нулевым.

89 ₽
Открыть карточку
арт. 562 · цена и наличие на 24.08.2026

Четырёхразрядный индикатор, красный

Чтобы часы стали часами, а не строчками в мониторе порта. Индикатор садится на ту же шину, что и модуль времени, — двумя проводами и с двоеточием посередине, как на будильнике.

378 ₽
Открыть карточку
арт. 1312 · цена и наличие на 24.08.2026

Зуммер (Trema-модуль)

Для будильника из второго скетча. Умеет не пищать одной нотой, а играть мелодию: резонансная частота 2048 герц, громкость от 85 децибел — поднимет.

131 ₽
Открыть карточку
арт. 610 · цена и наличие на 24.08.2026

Соединительные провода «папа-мама», 40 штук

Ровно то, чем модуль соединяется с платой: «мама» садится на штырьки модуля, «папа» — в гнёзда платы. Длина 20 см, десять цветов по четыре провода.

161 ₽
Открыть карточку
арт. 361 · цена и наличие на 24.08.2026

Что для этого нужно в среде

  • Каталог библиотек внутри программыRTClib и iarduino_RTC ставятся из окна библиотек по названию или прямо по строке подключения, без походов на чужие сайты.
  • Русские карточки ошибок — «библиотека не найдена» объясняется по-русски и сразу предлагает поставить нужную.
  • Монитор порта — время из первого скетча видно там же, где и всё остальное, без отдельной программы.
  • Сканер шины — готовый пример в разделе полезных скетчей: он и покажет, отвечает ли модуль на 0x68.

Вопросы и ответы

Коротко о главном

Если чего-то не хватает — напишите нам через форму поддержки, мы дополняем страницы по реальным вопросам.

Почему после каждой прошивки часы показывают старое время?

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

Сканер шины находит два адреса вместо одного — модуль бракованный?

Нет, это нормально. Сами часы отвечают на адрес 0x68. На модулях покрупнее рядом с часами распаяна отдельная микросхема памяти на четыре килобайта, у неё свой адрес — 0x57. Часам она не нужна, но на шине видна. Если адресов вообще не видно, дело обычно в питании или в перепутанных SDA и SCL.

Какую батарейку ставить в модуль часов и надолго ли её хватает?

Литиевую таблетку на три вольта того размера, который указан в паспорте модуля. Считается просто: ёмкость батарейки делят на ток, который часы берут без питания платы. Маленькая CR1220 на 35 миллиампер-часов при токе 3,5 микроампера тянет чуть больше года, крупная CR2032 на 220 миллиампер-часов — несколько лет. Важно: на части модулей стоит цепь подзарядки под аккумулятор, и обычную батарейку в такой модуль ставить нельзя.

DS1307 или DS3231 — что выбрать?

DS3231, если время должно быть точным: у него внутри поправка на температуру, и уход составляет около минуты в год против примерно десяти минут в год у DS1307. DS1307 дешевле, экономнее расходует резервную батарейку и вполне годится, когда время подводят вручную раз в месяц. Ещё одно различие важно для плат ESP: модулю на DS1307 нужно ровно пять вольт, а модуль на DS3231 работает и от 3,3 вольта.

Нужен ли модуль часов, если плата умеет выходить в интернет?

Не всегда. Плата с Wi-Fi может спросить точное время у сервера точного времени, и тогда часы не нужно ни заводить, ни подводить. Модуль нужен там, где сети может не быть: в теплице, на даче, в приборе, который включают в поле. Хорошее решение — оба сразу: сеть подводит часы, когда доступна, а модуль держит время, когда сети нет.

Часы уходят на минуту в месяц — это брак?

Смотря какая микросхема. Для DS1307 это нормальный результат: он считает импульсы обычного часового кварца, а тот заметно зависит от температуры. Для DS3231 минута в месяц — уже перебор: заявленная точность даёт около минуты в год. Проверьте, действительно ли на модуле стоит DS3231, и не грелся ли он рядом с чем-то тёплым.

Компилятор пишет, что у класса нет метода begin. Что не так?

Скорее всего, перепутан порядок подключения библиотек. Библиотеке iarduino_RTC нужно, чтобы строка с подключением Wire стояла выше строки с подключением самой библиотеки: она смотрит, доступна ли аппаратная шина I2C, в момент разбора заголовка. Поменяйте две строки местами — и метод появится. Это один из немногих случаев в Arduino, где порядок подключения действительно важен.

Дальше по теме

Часы-будильник без модуля, на счётчике платы — урок 31. Как устроена шина, на которой живёт модуль — Шина I2C. Время из интернета без всякого модуля — Wi-Fi для Arduino. Как поставить библиотеку — Библиотеки Arduino. Куда сложить показания с отметкой времени — Память Arduino. Какие ещё бывают модули — Модули для Arduino.