Мой первый заказ с маркетплейса учил экономить: партия из десяти модулей DS1307 по семьдесят рублей против DS3231 по сто пятьдесят — разница в два раза, бери и радуйся. Радовался я около месяца. Собрал три метеостанции на этих модулях, а потом повесил рядом четвёртую — контрольную, с DS3231. Через месяц расхождение внутри партии составило от двух до семи минут: каждая плата врала по-своему, и согласовать их журналы между собой не получалось. Контрольный DS3231 за те же четыре недели уполз на считаные секунды. Разборка трёх дешёвых модулей показала три разных кварца, и два из них даже не из одного цеха. Этот урок — про то, почему DS1307 не врёт сам по себе, а врёт его кварц, чем отвечает DS3231, и есть ли третий игрок по имени DS1302.
Кварц снаружи против кварца внутри
DS1307 — это только счётчик-календарь. Генератора у чипа нет: на модуле стоит внешний кварцевый цилиндр 32768 Гц с двумя конденсаторами нагрузки, и вся точность часов равна точности этого внешнего набора. В паспорте DS1307 вы не найдёте ppm — там честно написано, что точность определяется кварцем. Дешёвые модули собирают с кварцами без подгонки ёмкости нагрузки, и уход получается в минуты за месяц, у каждой платы свой. Температура усугубляет: у стандартного кварца частота плавает по параболе, и в холодном гараже мои платы врали заметно сильнее, чем на столе в комнате.
DS3231 построен иначе: термокомпенсированный генератор спрятан внутрь чипа. Микросхема раз в 64 секунды меряет собственную температуру и подстраивает частоту, поэтому держит ±2 ppm в диапазоне 0…+40 °C — это около минуты ошибки за год, и разброс между экземплярами исчезающе мал. В моей контрольной четвёрке все три DS3231 шли вровень друг с другом и с телефоном. Плата за точность не переплачивает — она платит за отсутствие ручной подгонки каждого экземпляра.
Логичный вопрос: а если впаять в DS1307 кварц получше? Уход действительно подрастёт, но кварц 32768 Гц требует конденсаторов нагрузки, подобранных под конкретный экземпляр, а на типовых модулях стоят два фиксированных конденсатора «для всех сразу». Я пробовал уговорить один модуль заменой кварца: уход снизился с семи минут до трёх за месяц, но врагом номер один осталась температура — зимний гараж и летняя веранда давали разный ход, а подстроечных конденсаторов на плате отродясь не было. Способность чипа компенсировать то, что он не меряет, ограничена здравым смыслом: DS1307 просто не знает, холодно ли вокруг.
| Параметр | DS1307 | DS3231 |
|---|---|---|
| Генератор | внешний кварц на модуле | термокомпенсированный, внутри чипа |
| Точность | равна кварцу модуля, минуты в месяц | ±2 ppm (0…+40 °C), около минуты в год |
| Питание | 4,5–5,5 В, только 5-вольтовые платы | 2,97–5,5 В, Uno и ESP32 |
| Будильники | нет | два аппаратных с прерыванием |
| Датчик температуры | нет | есть, getTemperature() |
| Выход SQW | 1 Гц / 4 / 8 / 32 кГц | 1 Гц / 1,024 / 4,096 / 8,192 кГц, плюс 32K |
| Адрес I2C | 0x68 | 0x68 — вместе на шину не ставить |
| Цена модуля (маркетплейсы, цены плавают) | 60–90 руб. | 120–180 руб. |
Остальная разница — по мелочи, но именно она решает судьбу проекта. Питание: DS1307 требует 4,5–5,5 В и на 3,3-вольтовых ESP32 или ESP8266 напрямую не живёт; DS3231 — 2,97–5,5 В, одинаково счастлив и на Uno, и на трёхвольтовой логике. Будильники: у DS3231 два аппаратных будильника с выводом прерывания — основа часов с будильником из соседнего урока; у DS1307 будильников нет вообще. Датчик температуры: у DS3231 он есть и читается из RTClib методом getTemperature() — бесплатный комнатный термометр с точностью по корпусу чипа. Выход SQW есть у обоих: у DS1307 четыре фиксированные частоты от 1 Гц до 32 кГц. Оба сидят на I2C по адресу 0x68 — механику шины я разобрал в уроке про два провода I2C, а найти чип на шине помогает сканер I2C-адресов: одна отметка 0x68 на чистой шине.
Практический метод измерить уход без лаборатории: поставьте на обе платы время по одному источнику, запишите показания и забудьте на месяц. Потом сравните с точным источником — телефонная синхронизация по NTP достаточно честна. Мой замер трёх DS1307 дал 2, 4 и 7 минут в месяц; DS3231 за полгода — 11 секунд. Числа с условием: это мои экземпляры из конкретных партий, у вас кварцы будут другими — но порядок ухода сохранится, потому что он определяется не лотереей, а конструкцией.
Справедливости ради: хвосты есть и у DS3231. Вне комфортабельного диапазона 0…+40 °C паспортный допуск расширяется до ±3,5 ppm (это −40…+85 °C), а первые минуты после подачи питания генератор выходит на режим. На бытовые проекты эти оговорки не влияют: даже ±3,5 ppm — меньше двух минут в год, то есть около одной перезаводки за срок жизни проекта.
DS1302 и мой итоговый выбор
В наборах «всё в одном» попадается и DS1302 — он втрое дешевле, и этим всё сказано. Интерфейс у него трёхпроводный, не I2C: отдельные выводы CLK, DAT и RST, класс в RTClib называется RTC_DS1302, но код с I2C-платами переносится лишь частично — шина другая, сканер адресов бесполезен, подтяжки не нужны, зато нужны резисторы на трёх сигнальных линиях. Кварц у DS1302 тоже внешний, так что точность — та же лотерея, что у DS1307; питается он тоже от 5 В. Мой вердикт: если он уже лежит в стартовом наборе — поиграться хватит; в проект, который обязан тикать годами, я его не ставил ни разу, и журнал двух его плат у меня до сих пор расходится с остальными на минуты за сезон.
Отсюда мой выбор с границей применимости. По умолчанию — DS3231: переплата в восемьдесят рублей окупается одной перезаводкой времени, которую вы не сделали. Исключение первое: DS1307 уже лежит в ящике — он честно поработает в проектах, где время переподводится регулярно: настольные часы, на которые человек смотрит глазами и сверяет с телефоном раз в месяц. Исключение второе: проект на 3,3-вольтовой плате — тут выбора нет вообще, DS1307 отпадает по питанию, берите DS3231. Схема выбора по таблице с ценами и диапазонами — тот же навык, что и в уроке про выбор между DHT11 и DHT22; а сравнение плат по вольтажу и обвязке подробно разобрано в уроке про выбор ESP32 или ESP8266.
Цена перезаводки, которую DS3231 экономит, считается просто: выключить проект, дождаться загрузки, залить служебный скетч с adjust, вернуть боевую прошивку. Для настольных часов это терпимо; для логгера на даче — поездка за триста километров. Поэтому распределённые журналы, которые должны сшиваться между собой, я вяжу только к DS3231: расхождение таймштампов в минуты делает сшивку невозможной, а расхождение в доли секунды — незаметной.
Проверить базу можно прямо в симуляторе ниже: он запускает класс RTC_DS1307 — тот же код без изменений работает с RTC_DS3231, потому что RTClib прячет разницу чипов за одним интерфейсом begin/now.
#include <Wire.h>#include <RTClib.h> RTC_DS1307 rtc; // чтобы перейти на DS3231, меняем только эту строку void setup() { Serial.begin(9600); if (rtc.begin() == false) { Serial.println("RTC ne otvechaet: SDA=A4, SCL=A5?"); while (1) { } } // время компиляции -> в часы (один раз, потом строку убрать) rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Serial.println("Vremya ustanovleno");} void loop() { DateTime now = rtc.now(); Serial.print("h="); Serial.print(now.hour()); Serial.print(" m="); Serial.print(now.minute()); Serial.print(" s="); Serial.println(now.second()); delay(1000);}- DS1307 не содержит генератора: точность равна внешнему кварцу модуля, мои платы ушли на 2–7 минут в месяц
- DS3231 держит ±2 ppm (около минуты за год) за счёт термокомпенсации: меряет свою температуру раз в 64 секунды
- DS1307 живёт только на 4,5–5,5 В; DS3231 — 2,97–5,5 В и работает с ESP32 без обвязки
- У DS3231 два аппаратных будильника и датчик температуры (getTemperature()); у DS1307 нет ни того, ни другого
- Оба чипа отвечают на адрес 0x68 — два RTC на одну шину I2C не ставят
- DS1302 — трёхпроводная шина, не I2C: дешевле, но код не переносится, точность та же лотерея
- 1. Чем определяется точность часов на DS1307?
- 2. Почему DS3231 точнее на порядок?
- 3. Что произойдёт при попытке запитать DS1307 от 3,3 В на ESP32?
- 4. Какой метод RTClib читает температуру с DS3231?
- 5. Можно ли повесить DS1307 и DS3231 на одну шину I2C?
Если остановились на DS1307 — модуль уже в ящике или проект строго 5-вольтовый — следующий урок по нему практический: четыре провода, батарейка CR2032 и приёмочная процедура «выдернул питание на две минуты — время на месте». Разъёмы там простые, но две ловушки — с полярностью таблетки и битом останова — я в первый вечер прошёл зря; покажу, как пройти их за минуту.
Частые вопросы по теме урока
- Чем определяется точность часов на DS1307?
- Генератора в чипе нет — точность целиком зависит от кварца модуля. У дешёвых плат это минуты ухода в месяц. Внешним кварцем и конденсаторами нагрузки на модуле
- Почему DS3231 точнее на порядок?
- Термокомпенсированный генератор меряет температуру и подстраивает частоту — отсюда ±2 ppm в диапазоне 0…+40 °C. Генератор внутри чипа с подстройкой по температуре каждые 64 секунды
- Что произойдёт при попытке запитать DS1307 от 3,3 В на ESP32?
- Диапазон DS1307 — 4,5–5,5 В. Для 3,3-вольтовых плат нужен DS3231 с диапазоном 2,97–5,5 В. Чип не гарантированно заведётся: паспортное питание 4,5–5,5 В
- Какой метод RTClib читает температуру с DS3231?
- rtc.getTemperature() возвращает температуру с чипа; у DS1307 такого датчика нет. rtc.getTemperature()
- Можно ли повесить DS1307 и DS3231 на одну шину I2C?
- Адрес обоих чипов — 0x68 без вариантов. Второй RTC на шине потребует либо другой шины, либо поочерёдной работы. Нет: у обоих жёсткий адрес 0x68, конфликт