Библиотека 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
Изящно! Красиво!Спасибо
Озу у нее свое и из этой области пишется или озу МК?.. или у них общая . Не понятно