Библиотека RTClib

Библиотека 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
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Владимир
1 месяц назад

Изящно! Красиво!Спасибо