Библиотека RTClib используется для работы с часами реального времени на микросхемах PCF8523, DS1307, DS3221. Скачать библиотеку RTClib с сайта или с GitHub.
#include <Wire.h> #include "RTClib.h"
Подключение библиотек RTClib и Wire.
RTC_DS1307 rtc; // Для часов реального времени на DS1307 RTC_DS3231 rtc; // Для часов реального времени на DS3231 RTC_PCF8523 rtc; // Для часов реального времени на PCF8523
Создание объектов для работы с часами реального времени ds1307, ds3231 и pcf8523.
boolean begin(void)
Начало работы с часами реального времени. Если возвращает true, то все хорошо, связь установлена, если возвращает false, то часы не найдены.
if (! rtc.begin()) {
Serial.println("Не могу найти часы");
while (1);
}
uint8_t isrunning(void) // Для DS1307 bool lostPower(void) // Для DS3231 boolean initialized(void) // Для PCF8523
Проверяет, работают ли часы. Если вернет false, то необходимо настроить методом adjust.
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// ИЛИ ТАК
//rtc.adjust(DateTime(2020, 1, 1, 15, 51, 0));
}
static void adjust(const DateTime& dt)
Устанавливает конкретное время и дату.
rtc.adjust(DateTime(2020, 8, 19, 12, 0, 0)); // 19 августа 2020 года 12:00:00
Можно установить время и дату, когда был скомпилирован скетч:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
static DateTime now()
Получает текущее значение даты и времени. Возвращает объект класса DateTime, который имеет следующие методы:
uint16_t year()– возвращает текущий год;uint8_t month()– возвращает текущий месяц;uint8_t day()– возвращает текущий день;uint8_t hour()– возвращает текущий час;uint8_t minute()– возвращает текущие минуты;uint8_t second()– возвращает текущие секунды;uint8_t dayOfTheWeek()– возвращает текущий день недели. От 0 до 6, где 0 — это воскресенье, а 6 — суббота;long secondstime()– возвращает количество секунд, прошедших с 1 января 2000 года;uint32_t unixtime()– возвращает количество секунд, прошедших с 1 января 1970 года.
void loop () {
DateTime now = rtc.now(); // Получает текущие данные даты и времени
Serial.print(now.year(), DEC); // Год
Serial.print('/');
Serial.print(now.month(), DEC); // Месяц
Serial.print('/');
Serial.print(now.day(), DEC); // День
Serial.print(" ");
Serial.print(now.hour(), DEC); // Час
Serial.print(':');
Serial.print(now.minute(), DEC); // Минуты
Serial.print(':');
Serial.print(now.second(), DEC); // Секунды
Serial.println();
delay(3000);
}
static void writeSqwPinMode(Ds1307SqwPinMode mode)
Устанавливает режим работы для контакта SQW (CLKOUT), который является выходом прямоугольных импульсов. Для DS1307 доступны следующие режимы:
rtc.writeSqwPinMode(OFF); // Отключен rtc.writeSqwPinMode(ON); // Включен, на выходе лог. 1 rtc.writeSqwPinMode(SquareWave1HZ); // Прямоугольная волна с частотой 1 Гц rtc.writeSqwPinMode(SquareWave4kHz); // Прямоугольная волна с частотой 4096 Гц rtc.writeSqwPinMode(SquareWave8kHz); // Прямоугольная волна с частотой 8192 Гц rtc.writeSqwPinMode(SquareWave32kHz); // Прямоугольная волна с частотой 327
Режимы для DS3231:
rtc.writeSqwPinMode(DS3231_OFF); // Отключен rtc.writeSqwPinMode(DS3231_SquareWave1Hz); // Прямоугольная волна с частотой 1 Гц rtc.writeSqwPinMode(DS3231_SquareWave1kHz); // Прямоугольная волна с частотой 1024 Гц rtc.writeSqwPinMode(DS3231_SquareWave4kHz); // Прямоугольная волна с частотой 4096 Гц rtc.writeSqwPinMode(DS3231_SquareWave8kHz); // Прямоугольная волна с частотой 8192 Гц
Режимы для PCF8523:
rtc.writeSqwPinMode(PCF8523_OFF); // Отключен rtc.writeSqwPinMode(PCF8523_SquareWave1HZ); // Прямоугольная волна с частотой 1 Гц rtc.writeSqwPinMode(PCF8523_SquareWave32HZ); // Прямоугольная волна с частотой 32 Гц rtc.writeSqwPinMode(PCF8523_SquareWave1kHz); // Прямоугольная волна с частотой 1024 Гц rtc.writeSqwPinMode(PCF8523_SquareWave4kHz); // Прямоугольная волна с частотой 4096 Гц rtc.writeSqwPinMode(PCF8523_SquareWave8kHz); // Прямоугольная волна с частотой 8192 Гц rtc.writeSqwPinMode(PCF8523_SquareWave16kHz); // Прямоугольная волна с частотой 16384 Гц rtc.writeSqwPinMode(PCF8523_SquareWave32kHz); // Прямоугольная волна с частотой 32768 Гц
static Ds1307SqwPinMode readSqwPinMode()
Получает значение режима работы для контакта SQW (CLKOUT).
// Для DS1307
Ds1307SqwPinMode mode = rtc.readSqwPinMode();
switch(mode) {
case OFF: Serial.println("OFF"); break;
case ON: Serial.println("ON"); break;
case SquareWave1HZ: Serial.println("1Hz"); break;
case SquareWave4kHz: Serial.println("4.096kHz"); break;
case SquareWave8kHz: Serial.println("8.192kHz"); break;
case SquareWave32kHz: Serial.println("32.768kHz"); break;
default: Serial.println("UNKNOWN"); break;
}
// Для DS3231
Ds3231SqwPinMode mode = rtc.readSqwPinMode();
switch(mode) {
case DS3231_OFF: Serial.println("OFF"); break;
case DS3231_SquareWave1Hz: Serial.println("1Hz"); break;
case DS3231_SquareWave1kHz: Serial.println("1.024kHz"); break;
case DS3231_SquareWave4kHz: Serial.println("4.096kHz"); break;
case DS3231_SquareWave8kHz: Serial.println("8.192kHz"); break;
default: Serial.println("UNKNOWN"); break;
}
// Для PCF8523
Pcf8523SqwPinMode mode = rtc.readSqwPinMode();
switch(mode) {
case PCF8523_OFF: Serial.println("OFF"); break;
case PCF8523_SquareWave1HZ: Serial.println("1Hz"); break;
case PCF8523_SquareWave32HZ: Serial.println("32Hz"); break;
case PCF8523_SquareWave1kHz: Serial.println("1.024kHz"); break;
case PCF8523_SquareWave4kHz: Serial.println("4.096kHz"); break;
case PCF8523_SquareWave8kHz: Serial.println("8.192kHz"); break;
case PCF8523_SquareWave16kHz: Serial.println("16.384kHz"); break;
case PCF8523_SquareWave32kHz: Serial.println("32.768kHz"); break;
default: Serial.println("UNKNOWN"); break;
}
Внимание! Функции ниже относятся только к микросхеме DS1307, поскольку только она имеет 56 байт энергонезависимой ОЗУ.
uint8_t readnvram(uint8_t address)
Возвращает байт, который хранится в ОЗУ по адресу address.
uint8_t a0 = rtc.readnvram(0); // Считывание первого байта ОЗУ uint8_t a12 = rtc.readnvram(12); // Считывание 13 байта ОЗУ uint8_t a55 = rtc.readnvram(55); // Считывание последнего байта ОЗУ
void readnvram(uint8_t* buf, uint8_t size, uint8_t address)
Получает значения из ОЗУ в передаваемый буфер (массив) buf, начиная от адреса address и следующие за ним адреса в количестве size-1.
uint8_t readData[4] = {0}; // Инициализируем массив
rtc.readnvram(readData, 4, 2); // Получаем значения по адресам 2,3,4,5
Serial.println(readData[0], HEX); // Выводим значение, которое скопировали из ОЗУ по адресу 2
Serial.println(readData[1], HEX); // Выводим значение, которое скопировали из ОЗУ по адресу 3
Serial.println(readData[2], HEX); // Выводим значение, которое скопировали из ОЗУ по адресу 4
Serial.println(readData[3], HEX); // Выводим значение, которое скопировали из ОЗУ по адресу 5
void writenvram(uint8_t address, uint8_t data)
Записывает байт данных data в ОЗУ по адресу address. address может принимать значение от 0 до 55, data — от 0 до 255.
rtc.writenvram(0, 0xFE); // Записывает байт 0xFE (254) по адресу 0 rtc.writenvram(1, 237); // Записывает байт 0xED (237) по адресу 1
void writenvram(uint8_t address, uint8_t* buf, uint8_t size)
Записывает сразу несколько байтов в ОЗУ. address — с какого адреса начинается запись; size — количество байт для записи; buf — массив значений, которые необходимо записать.
uint8_t writeData[4] = { 0xBE, 0xEF, 0x01, 0x02 }; // Массив значений, которые будут записаны в ОЗУ
rtc.writenvram(2, writeData, 4); // Записывает значения из массива writeData в ОЗУ начиная с адреса 2




Изящно! Красиво!Спасибо
Озу у нее свое и из этой области пишется или озу МК?.. или у них общая . Не понятно