Первое подключение DS1307 у меня заняло четыре минуты и стоило трёх вечеров диагностики. Провода по картинке из интернета, скетч из первого попавшегося гайда, время поставилось — красота. Назавтра часы показывали ровно 00:00:00 и не двигались. Я грешил на прошивку, перепрошил, поставил время снова — через ночь та же петля. Вторая серия ловушек ждала позже: сканер шины уверенно показывал адрес 0x68, я решил «модуль жив, дело в коде» — а часы при этом не шли, потому что чип стоял на останове после первого включения без установленного времени. Модуль у меня был типовой — Tiny RTC V1.1 с синим держателем и таблеткой из комплекта, уже подсевшей наполовину, как выяснилось много позже. Обе ловушки — классика первых вечеров с RTC: первая называется «батарейка не на месте», вторая — «бит останова». Ни одна не видна глазами и ни одна не ловится сканером шины. В этом уроке — правильная процедура подключения DS1307 с первого раза: провода, таблетка CR2032 и тест «выдернул питание на две минуты — время на месте».
Четыре провода и одна таблетка
Модулю DS1307 нужны четыре соединения: VCC на 5 В, GND на землю, SDA на A4, SCL на A5 — та же пара линий I2C, что и у всех устройств шины на Uno; механику шины я подробно разбирал в уроке про два провода I2C. Подтяжки на модуле уже стоят — пара резисторов 4,7 кОм к VCC, ничего добавлять не нужно. Скорость обмена с часами — стандартные 100 кГц, поэтому качество проводов не критично: I2C с подтяжками 4,7 кОм спокойно пробивает 20–30 сантиметров макеточных перемычек. Адрес чипа 0x68: сканер I2C-адресов должен показать ровно одну отметку. Внимание, если у вас уже есть DS3231: у обоих чипов адрес 0x68, на одну шину их не ставят — второй RTC подключают к другой плате или работают с ним по очереди.
Про питание — строго: DS1307 живёт на 4,5–5,5 В. От 3,3-вольтовых плат и от пина 3.3V модуль не обязан стартовать; в моих экспериментах с 3,3 В он иногда показывал время, но батарейка при этом не подхватывала — полусонный чип хуже честно выключенного. Резервное питание — держатель CR2032: таблетка ставится плюсом наружу, на типовых модулях Tiny RTC полярность продублирована шелкографией у держателя. Механика держателя пружинная: таблетка входит со сдвигом и иногда подпрыгивает контактом при вибрации — я подгибаю лепесток, если тест на отключение ловит сбой, а требует держатель именно CR2032: двадцать миллиметров диаметра; тонкая CR2016 проваливается и не достаёт до контакта. Пины SQW и отверстия DS на плате не трогаем: SQW — программируемый меандр, а DS — посадочное место под датчик DS18B20, которое на части модулей распаяно в общую цепь, но для часов не нужно.
| Вывод модуля | Куда на Arduino Uno | Назначение |
|---|---|---|
| VCC | 5V | питание чипа, диапазон 4,5–5,5 В |
| GND | GND | общий провод |
| SDA | A4 | линия данных I2C |
| SCL | A5 | линия тактирования I2C |
| SQW | не подключаем | меандр 1 Гц…32 кГц, пригодится позже |
| Держатель BAT | батарейка CR2032, плюс наружу | резервное питание счёта часов |
| DS (отверстия) | по желанию | посадка DS18B20, к часам отношения не имеет |
Пара слов о батарейке, потому что вокруг неё больше всего вопросов в комментариях. CR2032 — литиевая таблетка 3 В ёмкостью около 220 мА·ч. Резервный ток DS1307 по паспорту не превышает полмикроампера, и на бумаге 220 000 часов — четверть века. Реально первым умирает не заряд, а контакт в дешёвом держателе и саморазряд таблетки — один-два процента в год; поэтому честный ответ на «на сколько хватит»: годы, а контроль — тестом на отключение из конца урока. Мультиметр добавляет уверенности: свежая CR2032 — 3,2–3,3 вольта, рабочая — от 3,0; таблетка ниже 2,5 В идёт под замену, даже если часы формально тикают. Проверять удобно прямо в плате, коснувшись щупами лепестков держателя.
Второй частый вопрос — можно ли ставить аккумулятор LIR2032: можно, но бессмысленно. Цепи заряда на DS1307-модулях обычно нет вовсе, таблетка никогда не подзарядится, а стоит вдвое дороже CR2032. Ставьте обычную литиевую и не платите за функцию, которой нет.
Из монтажных граблей — три стандартные. Первая: макеточные провода-перемычки с тугими пружинками дают пропадающий контакт на SCL, и сканер молчит, будто модуля нет — шевелите провода перед диагнозами; о спорных контактах земли я писал в уроке про общий GND. Вторая: перепутанные местами SDA и SCL — сканер пуст, провода симметричны, глаза устали; проверяется перестановкой за десять секунд. Третья: попытка запитать модуль от 3.3V «на пробу» — симптом полусонного чипа описан выше.
Часы после выключения: бит CH и lostPower
Внутри DS1307 в регистре секунд сидит флаг CH — clock halt, бит останова. При самом первом включении нового модуля (и после глубокой разрядки батарейки) часы стоят: счёт не идёт, пока время не установлено. Библиотека RTClib прячет это за методом lostPower(): он возвращает true, когда основное питание пропадало и время под вопросом. Правильный скетч выглядит так: в setup() проверяем lostPower(), и только при потере вызываем adjust с временем компиляции. Строка adjust, разобранная в первом уроке про DS3231, здесь работает так же — перезаписывает время каждой загрузкой, поэтому после первой прошивки её убирают.
Полная процедура приёмки нового модуля, которую я делаю теперь вместо трёх вечеров. Шаг первый: подключить провода и запустить сканер — жду отметку 0x68. Шаг второй: залить скетч с lostPower() и adjust, убедиться, что время встало и тикает. Шаг третий: убрать строку adjust и перезалить. Шаг четвёртый — главный тест: выдернуть питание платы на две минуты, включить, сверить секунды. Если время продолжилось с той же точки — батарейка и держатель исправны. Диагностика по симптомам, если тест провален: время совпадает с моментом последней прошивки — вы забыли убрать adjust; на экране 00:00:00 или январь 2000-го — батарейка, её полярность или контакт держателя; время идёт, но уползает на минуты в неделю — это уже кварц, тема урока-сравнения DS1307 и DS3231.
Логи приёмки пишите в Serial с префиксами-парами: lost=1 или lost=0 перед показаниями. Через полгода вопрос «а пропадал ли тогда свет?» решается поиском по строкам lost=1 — каждая перезаводка оставляет след, и история питания проекта читается как сводка погоды.
#include <Wire.h>#include <RTClib.h> RTC_DS1307 rtc; void setup() { Serial.begin(9600); if (rtc.begin() == false) { Serial.println("RTC ne otvechaet: provoda? skaner I2C!"); while (1) { } } if (rtc.lostPower()) { // основное питание пропадало: заводим время компиляции (один раз!) rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Serial.println("lost=1, vremya zavedeno"); } else { Serial.println("lost=0, chasy zhivut"); }} 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 подключается четырьмя проводами: VCC→5V (строго 4,5–5,5 В), GND, SDA→A4, SCL→A5, адрес 0x68
- Подтяжки I2C уже на модуле; DS1307 и DS3231 оба 0x68 — на одну шину их не ставят
- CR2032 плюсом наружу; цепи заряда у DS1307-модулей нет, LIR2032 ставить бессмысленно
- Сканер I2C показывает 0x68 даже с мёртвой батарейкой — живость резерва проверяется только отключением основного питания
- Бит CH останавливает часы нового модуля; RTClib проверяет это через lostPower() в setup()
- Приёмка за четыре шага: сканер → скетч с adjust → убрать adjust → тест «две минуты без питания»
- 1. От какого пина Arduino Uno питают модуль DS1307?
- 2. Что означает lostPower() из RTClib?
- 3. Почему сканер I2C не может проверить батарейку?
- 4. Время после включения совпадает с моментом последней прошивки. Диагноз?
- 5. Почему на DS1307-модуле не ставят аккумулятор LIR2032?
Модуль принят, время переживает отключение — дальше с часами можно строить настоящую логику. Собрать будильник, который звенит раз в сутки и не застревает на минуте, я показывал в уроке про часы с LCD; а если цель — журнал датчика с честными таймштампами на карте памяти, двигайтесь в урок про логирование на SD: часы из этого урока будут ставить метки каждой строке. И если точность DS1307 со временем перестанет устраивать — возвращайтесь к сравнительному уроку: у DS3231 подключение то же самое, меняется одна строка класса. Батарейку заодно внесите в список расходников: та же CR2032 живёт в напольных весах и материнских платах, держите запас — пригодится.
Частые вопросы по теме урока
- От какого пина Arduino Uno питают модуль DS1307?
- Паспортный диапазон DS1307 — 4,5–5,5 В. От 3,3 В чип не гарантированно стартует и не подхватывает батарейку. 5V
- Что означает lostPower() из RTClib?
- Метод сообщает о пропадании основного питания (включая флаг останова CH нового модуля) — сигнал перезавести время. Основное питание пропадало и время могло потеряться
- Почему сканер I2C не может проверить батарейку?
- Пока есть 5 В на VCC, чип отвечает по шине с любой батарейкой. Проверка резерва — только тест с отключением питания. При основном питании чип отвечает независимо от состояния резервной батарейки
- Время после включения совпадает с моментом последней прошивки. Диагноз?
- adjust перезаписывает часы каждой загрузкой. После первой прошивки строку убирают — иначе время всегда вчерашнее. Строка rtc.adjust с временем компиляции осталась в setup()
- Почему на DS1307-модуле не ставят аккумулятор LIR2032?
- Без зарядной цепи LIR2032 никогда не подзарядится и просто дороже CR2032. Ставьте обычную литиевую таблетку. На модулях нет цепи заряда, подзаряд не происходит