Термостат в мастерской я собирал дважды, и дважды часы вели себя по-разному. Первый модуль на DS1307 за три зимних месяца ушёл на одиннадцать минут, второй из той же партии — на четыре. Оба были подключены по одной схеме, оба честно держали время от батарейки, но обещание «точные часы» каждый экземпляр выполнял по-своему. Паспорт микросхемы и поведение вашей платы — разные числа, и пока вы их не свели, любое расписание строится на слухах. Здесь разбираюсь, как за неделю измерить фактический уход конкретного модуля и что делать с измеренным.
Устройство обоих чипов мы уже разложили по полкам в сравнении DS1307 и DS3231 — там архитектура, питание и батарейки. Здесь остаётся метрология: эталон, два замера, арифметика в три действия. На выходе — факт, с которым можно идти дальше: смириться, подводить по расписанию или калибровать через служебный регистр. Ничего из этого не требует осциллографа или лаборатории: достаточно телефона с интернетом и скетча из десяти строк, который печатает отметку.
Слово «дрейф» я буду писать без страха, потому что измеренный дрейф — уже не проблема, а параметр. Неприятен только неизвестный: расписание, которое сдвигается на непредсказуемые минуты, невозможно ни починить, ни обойти — его даже обсудить не с кем. Поэтому первый шаг любого узла с часами у меня теперь стандартный: неделя на стенде, число в блокноте, вердикт по таблице.
Финал урока — стенд в симуляторе: живые часы на шине I2C, скетч считает уход против собственного эталона и выносит вердикт по таблице. Месяц работы модуля сжимается в одну кнопку на виджете.
Паспорт и экземпляр: откуда берётся разница
У DS3231 генератор живёт внутри чипа: микросхема раз в 64 секунды меряет собственную температуру и подстраивает частоту кварца, поэтому паспорт обещает стабильность ±2 ppm в диапазоне 0…+40 °C — около 63 секунд за год. Как устроен компенсатор и где лежат его регистры, я разбирал в уроке про точность DS3231; для замера важно одно: разброс между экземплярами мал, но не нулевой, и у вашей платы своя подпись. Её и будем снимать.
У DS1307 кварц внешний, и его частота зависит от подгонки конденсаторов нагрузки, пайки и температуры в корпусе. Паспорт — ±20 ppm при 25 °C; на реальных модулях я и коллеги видели уход от 20 до 60 секунд в месяц, а неудачные экземпляры с недогруженным кварцем уезжают на две минуты. Две минуты в месяц — это полчаса за сезон: настольным часам всё равно, а открыванию теплицы по часам — уже нет.
Отдельный случай — DS3231M: тот же корпус, тот же адрес на шине, но резонатор MEMS вместо кварца. Паспорт шире — ±5 ppm, зато нет чувствительности к тряске и жаре паяльника. Если ваш модуль стабильно держит около 13 секунд ухода в месяц — взгляните на маркировку: возможно, это он, и жаловаться не на что. И не путайте уход с прыжками на целые минуты: прыжки — это потеря питания и потерянный осциллятор, а не метрология.
Методика: эталон, два замера, арифметика
Эталон — любой источник с NTP: телефон, компьютер, домашний роутер. Их собственная погрешность — доли секунды, на фоне недельного замера это шум. Первый замер: снимаете unixtime модуля через rtc.now() и рядом фиксируете эталонное время в тот же момент. Пишу обе цифры в блокнот с датой и местом замера — через неделю блокнот из одной строки превращается в прибор. Удобнее всего завести скетч-паспорт, который печатает отметку сам, — он ниже, и он же пишет температуру чипа как свидетель условий замера.
Через семь суток — второй замер, и разность в секундах превращается в ppm делением на 0,6: уход 3 секунды за неделю даёт около 5 ppm. Прогноз на месяц — умножением на 2,59: те же 5 ppm обещают 13 секунд за тридцать дней. Арифметика работает в обе стороны: модуль, который по паспорту DS1307 уходит на 20 ppm, за неделю наберёт около 12 секунд — если ваш лог показывает меньше, у вас удачный экземпляр. Полный переводной курс с проверкой на здравый смысл я приводил в уроке про ppm и секунды — здесь только рабочие прикидки для вердикта.
Слагаемые бюджета ухода — температура, старение, конденсаторы — уже посчитаны в уроке про drift, пересказывать не буду. Добавлю правило методики: обе отметки снимайте на одном месте и при близкой температуре. Модуль с подоконника зимой и у роутера летом — два разных прибора; его температурный ход легко принять за систематический уход и лечить не то, что болит.
#include <Wire.h>#include <RTClib.h> // Паспорт модуля. Методика: запишите отметку START и эталонное время// с телефона в один момент. Через 7 суток снимите вторую пару и// посчитайте: ppm = секунды ухода / 0,6 при недельном замере.// Прогноз за месяц: ppm x 2,59. RTC_DS3231 rtc;unsigned long poslednyayaMetka = 0; void setup() { Serial.begin(9600); rtc.begin(); DateTime now = rtc.now(); Serial.print("START unix="); Serial.println(now.unixtime()); // рядом - эталон с NTP poslednyayaMetka = millis();} void loop() { if (millis() - poslednyayaMetka >= 3600000UL) { // раз в час poslednyayaMetka = millis(); DateTime now = rtc.now(); Serial.print("METKA unix="); Serial.print(now.unixtime()); Serial.print(" t="); Serial.println(rtc.getTemperature(), 1); // условия замера }}| Замер за 7 суток | Фактический ppm | Прогноз за месяц | Что делаю |
|---|---|---|---|
| до 1 с | до 1,7 | до 4 с | норма, ничего не трогаю |
| 1-5 с | 1,7-8 | 4-22 с | подводка раз в месяц |
| 5-20 с | 8-33 | 22-85 с | NTP-подводка или регистр aging offset |
| больше 20 с | 33 и выше | минуты и выше | проверить батарейку и кварц, модуль под замену |
Ступени лечения идут по дешевизне. Первая — ничего: расписание полива переживёт и десять секунд в месяц. Вторая — подводка по будильнику собственной руки: раз в месяц выставить точное время, минуты уходят на это меньше, чем на чтение логов. Третья — автоматическая синхронизация: узел с сетью берёт время по NTP, и готовый скетч с configTime на ESP32 делает это без вас; в разделе есть и перевод времени с NTP на модуль через adjust.
Четвёртая ступень — тонкая ручка внутри чипа: регистр aging offset по адресу 0x12 сдвигает ход кварца, шаг — порядка 0,1 ppm на единицу регистра по даташиту, то есть на два порядка тоньше, чем ваша рука с кнопкой. Это инструмент для узла, который живёт без сети годами и должен держать секунды в месяц. Пятая — замена модуля: если уход измеряется минутами при нормальной батарейке, чинить нечего, экземпляр просто плохой.
Для DS1307 отдельная оговорка: внутри него подстройки нет вовсе — только внешний кварц с двумя конденсаторами нагрузки. Тонкая ручка из предыдущего абзаца на него не распространяется, и единственные честные лекарства — подводка по расписанию или замена модуля на DS3231. Конденсаторы можно перепаять, но подбирать их по фактическому уходу — ремесло для отдельного вечера с паяльной станцией и без гарантий.
Стенд в симуляторе: месяц за одну кнопку
Движок книги держит живые часы на шине I2C — SDA на A4, SCL на A5, — rtc.now() читает их в любой проход loop(), а время на виджете подводится кнопками: плюс-минус минута, плюс-минус час, возврат к браузерному. Трафик по шине виден в логе симулятора: каждый rtc.now() — это честный запрос регистров у чипа, как и на плате. Договоримся о масштабе: одна подводка на минуту — это месяц работы модуля с уходом в 60 секунд. Такой темп даёт около 23 ppm, и до такого ухода дисциплинированный DS3231 добирается года за три, а DS1307 с плохим кварцем — за месяц.
Скетч стенда держит эталон: отметку unixtime при старте плюс секунды от millis(). Пока часы честные, разница с rtc.now() равна нулю; модуль уплыл — разница растёт, скетч печатает её и вердикт по строкам таблицы. Нажмите плюс минуту на виджете и смотрите, как приговор меняется прямо в логе. После возврата кнопкой синхронизации стенд возвращается к нулю — как будто в модуль поставили новый кварц.
- 1. Паспорт DS3231 — стабильность ±2 ppm. Сколько это секунд за год?
- 2. Почему у двух DS1307 из одной партии уход может отличаться втрое?
- 3. Замер показал 3 секунды ухода за 7 суток. Каков фактический ppm модуля?
- 4. Модуль ушёл на 40 секунд за месяц. Какой вердикт по таблице урока?
- 5. Первый замер дал 5 ppm, повторный через месяц — 1,5 ppm. Что произошло?
- ±2 ppm у DS3231 — паспорт диапазона 0…+40 °C, около 63 с за год; у DS1307 паспорт ±20 ppm, а модули реально уходят на 20-60 с в месяц
- 1 ppm — это 0,0864 с в сутки: секундный уход за 7 суток делите на 0,6, получаете ppm, умножаете на 2,59 — прогноз за месяц
- Эталон для теста — NTP-время телефона или ПК; отметку модуля снимайте как unixtime из rtc.now(), рядом пишите температуру чипа
- Первые недели кварц устаканивается: приговор выносят по двум замерам с интервалом в месяц при близкой температуре
- Ступени лечения: ничего, подводка раз в месяц, NTP, aging offset с шагом около 0,1 ppm, замена модуля
Частые вопросы по теме урока
- Паспорт DS3231 — стабильность ±2 ppm. Сколько это секунд за год?
- 2 ppm — это две миллионные доли секунды на каждую секунду; за год из 31,5 млн секунд набирается около 63 секунд ухода. Батарейка на ход не влияет: она хранит память, а не темп. примерно 63 секунды, меньше минуты
- Почему у двух DS1307 из одной партии уход может отличаться втрое?
- У DS1307 нет термокомпенсатора: частоту задаёт внешний кварц с обвязкой, и подгонка каждого экземпляра своя. Отсюда и разброс от 20 до 60 секунд в месяц на одинаковых модулях. Потому что кварц внешний: ход зависит от конденсаторов нагрузки, пайки и температуры конкретной платы
- Замер показал 3 секунды ухода за 7 суток. Каков фактический ppm модуля?
- Неделя равна 0,6 секунды на ppm: делим 3 на 0,6, получаем 5 ppm. Прогноз на месяц — 5 x 2,59, около 13 секунд. около 5 ppm
- Модуль ушёл на 40 секунд за месяц. Какой вердикт по таблице урока?
- 40 секунд за месяц — около 15 ppm, третья строка таблицы. Для узла с сетью это уже NTP, для автономного — тонкая подстройка регистром 0x12 с шагом порядка 0,1 ppm. NTP-подводка или регистр aging offset
- Первый замер дал 5 ppm, повторный через месяц — 1,5 ppm. Что произошло?
- Это нормальный график старения: первый месяц ход нестабилен, потом выравнивается. Поэтому приговор выносят по двум замерам с интервалом в месяц, а не по одному. Кварц свежего экземпляра ещё устаканивался: старение в первые недели быстрое