Это библиотека DS1302 RTC (Real Time Clock) с интерфейсом на 3 провода для Arduino.

- Совместима с библиотекой libc
<time.h> - Чтение/запись даты/времени в структуру
struct tm - Установка/получение Unix эпохи UTC
time_t - Установка/получение времени (часы, минуты, секунды)
- Установка/получение даты и времени (час, мин, сек, число, месяц, год, день недели)
- Чтение/запись 31 байта батарейно-запоминаемой RTC памяти.
- Программируемое зарядное устройство для батареек/конденсаторов.
- Оптимизированный интерфейс для взаимодействия с Atmel AVR платформой.
ВАЖНЫЕ ЗАМЕЧАНИЯ:
- Время DS1302 RTC может отклоняться на более чем 1 минуту в день, поэтому этот девайс не рекомендуется для использования в проектах с высокими требованиями к точности.
- Для новых проектов рекомендуется использовать высокоточные DS3231 I2C RTC.
- Интерфейс на 3 провода НЕ совместим с SPI.
Arduino IDE | Файл | Примеры | Alash-electronics DS1302 RTC:
- Alarm: Программирование одного или нескольких программных будильников
- RAM: Чтение/запись RTC RAM.
- SetGetDateTime: Установка/получение даты и времени
- Terminal и скрипт Python для установки даты и времени
Инициализация
#include <Alash_DS1302.h>
/*
DS1302 IC Atmel AVR ESP8266 ESP32
GND GND GND GND
VCC2 5V(или 3.3V) 3V3 3V3
SCLK (CLK) 2(цифровой пин) D4 0
I/O (DAT) 3(цифровой пин) D2 5
CE (RST) 4(цифровой пин) D2 4
*/
// Подключение пина данных DS1302 к цифровому пину Arduino
#define DS1302_CLK_PIN 2
#define DS1302_IO_PIN 3
#define DS1302_CE_PIN 4
// Создание объекта RTC
Alash_DS1302 rtc = Alash_DS1302(DS1302_CLK_PIN, DS1302_IO_PIN, DS1302_CE_PIN);
void setup()
{
// Инициализация RTC
while (!rtc.begin()) {
Serial.println(F("RTC not found"));
delay(3000);
}
}Проверка состояния осциллятора при старте
// Проверка состояния осциллятора
if (!rtc.isRunning()) {
// Ошибка: Остановлен осциллятор RTC. Дата/время не может быть доверенным.
// Необходимо установить новую дату/время перед чтением.
// Включение осциллятора
rtc.clockEnable(true);
}Установка времени
// Запись времени в RTC
if (!rtc.setTime(12, 0, 0)) {
// Ошибка: Не удалось установить время
}Получение времени
uint8_t hour;
uint8_t minute;
uint8_t second;
// Чтение времени из RTC
if (!rtc.getTime(&hour, &minute, &second)) {
// Ошибка: Не удалось прочитать время RTC
}Установка даты и времени
// Запись даты/времени в RTC: 13:45:09 31 декабря 2019 0=Воскресенье, 2=Вторник
if (!rtc.setDateTime(13, 45, 9, 31, 12, 2019, 2) {
// Ошибка: Не удалось записать дату/время
}Получение даты и времени
uint8_t hour;
uint8_t min;
uint8_t sec;
uint8_t mday;
uint8_t mon;
uint16_t year;
uint8_t wday;
// Чтение даты/времени из RTC
if (!rtc.getDateTime(&hour, &min, &sec, &mday, &mon, &year, &wday) {
// Ошибка: Не удалось прочитать дату/время RTC
}
// hour: 0..23
// min: 0..59
// sec: 0..59
// mday: 1..31
// mon: 1..12
// year: 2000..2099
// wday: 0..6 (0=Воскресенье .. 6=Суббота)Запись/чтение структуры времени struct tm
struct tm dt;
dt.tm_hour = 12;
dt.tm_min = 34;
dt.tm_sec = 56;
dt.tm_mday = 29;
dt.tm_mon = 1; // 0=Январь
dt.tm_year = 2024-1900;
dt.tm_wday = 6; // 0=Воскресенье
if (!rtc.write(&dt)) {
// Ошибка: Не удалось записать RTC
}struct tm dt;
// Чтение даты/времени из RTC
if (!rtc.read(&dt)) {
// Ошибка: Не удалось прочитать дату/время RTC
}Чтение Unix эпохи UTC
time_t t;
// Чтение Unix эпохи UTC из RTC
if (!rtc.getEpoch(&t)) {
// Ошибка: Не удалось прочитать UTC эпоху RTC
}Запись Unix эпохи UTC
// Запись Unix эпохи UTC в RTC
if (!rtc.setEpoch(1599416430UL)) {
// Ошибка: Не удалось установить эпоху
}Запись в RTC RAM
// Запись байта в RTC RAM
rtc.writeByteRAM(0x02, 0xA9);
// Запись буфера в RTC RAM
uint8_t buf[NUM_DS1302_RAM_REGS] = { 0x00 };
rtc.writeBufferRAM(buf, sizeof(buf));Чтение из RTC RAM
// Чтение байта из RTC RAM
uint8_t dataByte = rtc.read
ByteRAM(0x02);
// Чтение буфера из RTC RAM
uint8_t buf[NUM_DS1302_RAM_REGS];
rtc.readBufferRAM(buf, sizeof(buf));Установка зарядного устройства
Пожалуйста, обратитесь к даташиту, чтобы узнать, как настроить зарядное устройство.
// Отключение (по умолчанию)
rtc.writeRegister(DS1302_REG_TC, DS1302_TCS_DISABLE);
// Минимум 2 диода, 8кОм
rtc.writeRegister(DS1302_REG_TC, 0xAB);
// Максимум 1 диод, 2кОм
rtc.writeRegister(DS1302_REG_TC, 0xA5);Установка даты и времени RTC с использованием Python
Запустите Python скрипт:
// Установите Pyserial
python3 pip -m pyserial
// Установка даты и времени RTC
python3 Terminal.pyПримечание: Пин D4 на ESP8266 высокий во время перезагрузки/сброса/программирования, что может повредить регистры RTC. По этой причине пины D2 и D4 поменяны местами.
| Чип DS1302 | Atmel AVR | ESP8266 | ESP32 |
|---|---|---|---|
| GND | GND | GND | GND |
| VCC2 | 5V (или 3.3V) | 3V3 | 3V3 |
| SCLK (CLK) | 2 (Цифровой пин) | D4 | 0 |
| I/O (DAT) | 3 (Цифровой пин) | D2 | 5 |
| CE (RST) | 4 (Цифровой пин) | D2 | 4 |
Wire.hTerminal.inoтребует библиотекуAlashSerialTerminal.