Обзор
DS1307 — это классический модуль часов реального времени (RTC) с интерфейсом I2C. Он предназначен для ведения календаря и времени в электронных устройствах, даже при отключении основного питания.
DS1307 выделяется на фоне аналогов наличием 56 байт энергонезависимой памяти SRAM, в которой можно хранить пользовательские настройки или флаги состояния системы. В отличие от DS1302, работающего по 3-проводной шине, DS1307 использует стандартный I2C, что упрощает масштабирование проекта. По сравнению с высокоточным DS3231, данный чип требует внешний кварц и более зависим от температуры, но является максимально бюджетным решением.
Быстрая навигация
Примеры кода
Характеристики DS1307
Ключевые технические параметры модуля.
Распиновка 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).
- Питание 3.3В: Если подать 3.3В на VCC, чип может либо не отвечать по I2C, либо “зависнуть” в режиме питания от батареи. Для стабильной работы всегда питайте модуль от 5В.
- Логические уровни: Если ваш модуль имеет встроенные подтягивающие резисторы (pull-up) к VCC (5В), используйте преобразователь логических уровней для защиты входов ESP32.
- Кварц: Если вы собираете схему на голом чипе, используйте кварц 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)
Время "уплывает" на несколько секунд в день
Примеры программирования DS1307
Arduino (RTClib)
C++
Arduino (RTClib)
#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-памяти контроллера.