DS1307 Часы реального времени (RTC)

Подробное руководство по DS1307: сравнение с DS3231 и DS1302, характеристики SQW/OUT, 56 байт SRAM, схемы подключения к ESP32 и Arduino, примеры кода для ESP-IDF, MicroPython и ESPHome.

RTC I2C Электроника

Обзор

DS1307 — это классический модуль часов реального времени (RTC) с интерфейсом I2C. Он предназначен для ведения календаря и времени в электронных устройствах, даже при отключении основного питания.

DS1307 выделяется на фоне аналогов наличием 56 байт энергонезависимой памяти SRAM, в которой можно хранить пользовательские настройки или флаги состояния системы. В отличие от DS1302, работающего по 3-проводной шине, DS1307 использует стандартный I2C, что упрощает масштабирование проекта. По сравнению с высокоточным DS3231, данный чип требует внешний кварц и более зависим от температуры, но является максимально бюджетным решением.

Модуль RTC DS1307
Спецификации

Характеристики DS1307

Ключевые технические параметры модуля.

Интерфейс и Адрес I2C (0x68), до 100/400 кГц
Напряжение питания 4.5В – 5.5В (VCC) / 2.0В – 3.5В (VBAT)
Выход SQW (Меандр) 1Гц, 4.096кГц, 8.192кГц, 32.768кГц
Энергонезависимая память 56 байт SRAM (неограниченная перезапись)
Скачать полный Datasheet
Конфигурация

Распиновка DS1307

Пин Тип Описание Примечание
VCC Питание Основной вход питания Требуется строго 5В
GND Земля Общий минус -
SDA I2C Serial Data Двунаправленная линия
SCL I2C Serial Clock Тактирование шины
VBAT Резерв Питание от батарейки CR2032 или литиевая 3В
SQW / OUT Выход Программируемый меандр Открытый сток
Подключение

Подключение и нюансы питания

Чип DS1307 спроектирован для работы при VCC = 5В. Это создает определенные сложности при подключении к контроллерам с логикой 3.3В (ESP32, STM32, Raspberry Pi Pico).

  1. Питание 3.3В: Если подать 3.3В на VCC, чип может либо не отвечать по I2C, либо “зависнуть” в режиме питания от батареи. Для стабильной работы всегда питайте модуль от 5В.
  2. Логические уровни: Если ваш модуль имеет встроенные подтягивающие резисторы (pull-up) к VCC (5В), используйте преобразователь логических уровней для защиты входов ESP32.
  3. Кварц: Если вы собираете схему на голом чипе, используйте кварц 32.768 кГц с нагрузочной емкостью 12.5 пФ.
DS1307 Пин ESP32 (GPIO) Arduino (Uno/Nano) Описание
VCC 5V / Vin 5V Питание
GND GND GND Земля
SDA GPIO 21 A4 Данные I2C
SCL GPIO 22 A5 Такты I2C
Отладка

Устранение неполадок DS1307

Бит CH (Clock Halt)
Самая частая причина "остановки" времени. В регистре 00h есть бит CH. Если он равен 1, генератор выключен. Библиотеки обычно проверяют это через `rtc.isrunning()`. При первом включении обязательно выполните `rtc.adjust()`.
Время "уплывает" на несколько секунд в день
DS1307 крайне чувствителен к температуре и качеству кварца. Если нужна точность 2ppm (пара минут в год), рекомендуем заменить на DS3231. Также проверьте, нет ли рядом с кварцем источников сильных помех или нагрева.
Код

Примеры программирования DS1307

Arduino Arduino (RTClib)
C++
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;

void setup() {
  Serial.begin(115200);
  if (!rtc.begin()) {
    Serial.println("RTC не найден!");
    while (1);
  }
  if (!rtc.isrunning()) {
    Serial.println("RTC остановлен, устанавливаем время...");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  // Настройка SQW на 1Гц
  rtc.writeSqwPinMode(DS1307_SquareWave1HZ);
}

void loop() {
  DateTime now = rtc.now();
  Serial.printf("%02d:%02d:%02d\n", now.hour(), now.minute(), now.second());
  delay(1000);
}
ESP-IDF
C
#include "ds1307.h"

void app_main() {
    i2c_dev_t dev;
    ds1307_init_desc(&dev, I2C_NUM_0, SDA_GPIO, SCL_GPIO);

    struct tm time = {
        .tm_year = 2024 - 1900,
        .tm_mon  = 4, // Май
        .tm_mday = 20,
        .tm_hour = 12,
        .tm_min  = 0,
        .tm_sec  = 0
    };
    ds1307_set_time(&dev, &time);

    while (1) {
        ds1307_get_time(&dev, &time);
        printf("Time: %02d:%02d:%02d\n", time.tm_hour, time.tm_min, time.tm_sec);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
ESPHome
YAML
i2c:
  sda: GPIO21
  scl: GPIO22

time:
  - platform: ds1307
    id: rtc_time
MicroPython
Python
from machine import I2C, Pin
import ds1307

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
rtc = ds1307.DS1307(i2c)

# Установка: год, месяц, число, день_недели, часы, минуты, секунды, мс
# rtc.datetime((2024, 5, 20, 1, 12, 0, 0, 0))

print("Current time:", rtc.datetime())
PlatformIO (config)
INI
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
    adafruit/RTClib @ ^2.1.3

Итоги

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

Для точности

Если проект будет работать на улице или в условиях смены температур, используйте DS3231.

Для памяти

Используйте встроенные 56 байт SRAM для сохранения счетчиков без износа Flash-памяти контроллера.

Посмотреть примеры кода Скачать Datasheet