Модуль часов реального времени с независимым питанием. Контроллеры Arduino/Genuino не имеют встроенных часов реального времени. Для работы со временем есть функция millis(). Однако, для проектов где требуется время и дата, возможностей данной функции недостаточно и на помощь приходят часы реального времени.
Модуль PCF8563 - это недорогие, точные, с работой по протоколу I2C часы-календарь реального времени. В отличии от других модулей часов - имеют низкое энергопотребление, поддерживают функцию таймера, имеют встроенный календарь. Устройство содержит разъём для батареи типа CR1220 (за счёт чего модуль имеет очень маленькие размеры) и поддерживает точный отсчет времени когда питание устройства прерывается. Часы поддерживают информацию о секундах, минутах, часах, дне, дне недели, месяце и годе. Дата на конец месяца автоматически корректируется, для месяцев, содержащих менее чем 31 день, включая коррекцию по високосному году. Имеют программируемый будильник.
Основные характеристики часов:
В примере иллюстрируется первоначальная настройка модуля - установка времени и даты.
Что нужно | Кол-во, шт |
---|---|
Контроллер Smart UNO | 1 |
Sensor Shield | 1 |
Модуль часов PCF8563 | 1 |
Шлейф "мама-мама" х4 | 1 |
Схема подключения:
Скетч для загрузки:
#include <Wire.h> //библиотека для работы с I2C
#include <Rtc_Pcf8563.h> //библиотека для работы с часами
Rtc_Pcf8563 rtc; //инициализация часов
void setup()
{
//очистка регистров часов
rtc.initClock();
//Установка даты:
//день месяца, день недели, месяц, век(1=1900, 0=2000), год(0-99)
//установим дату 30 - (суббота) - ноября - 0 века - 2025 года
rtc.setDate(30, 6, 11, 0, 25);
//Установка времени
//часы, минуты, секунды
//установим время 15 часов 45 минут 0 секунд
rtc.setTime(15, 45, 0);
}
void loop()
{
}
В примере демонстрируется подключение часов и дисплея к Расширителю I2C. Далее происходит вывод времени, дня недели и даты на дисплей.
Что нужно | Кол-во, шт |
---|---|
Контроллер Smart UNO | 1 |
Sensor Shield | 1 |
Расширитель I2C | 1 |
Модуль часов PCF8563 | 1 |
Дисплей 2-строчный с I2C модулем | 1 |
Шлейф "мама-мама" х4 | 3 |
Схема подключения:
Подключение расширителя и устройств к нему происходит напрямую, для этого удобно использовать 4-ёх проводной шлейф. Если на устройстве выводы расположены в другом порядке, подключите к расширителю с помощью обычных проводов мама-мама (или тех, которые подходят к Вашему устройству.
Скетч для загрузки:
#include <LiquidCrystal_I2C.h> //подключение библиотеки для работы с дисплеем
#include <Wire.h> //библиотека для работы с I2C
#include <Rtc_Pcf8563.h> //библиотека для работы с часами
LiquidCrystal_I2C lcd(0x27, 16, 2); //создание объекта дисплея с адресом и количеством символов/строк
Rtc_Pcf8563 rtc; //создание объекта для работы с часами
void setup() {
lcd.init(); //инициализация дисплея
}
void loop() {
lcd.home(); //установка курсора в верхний левый угол
lcd.print(rtc.formatTime()); //вывод текущего времени на дисплее
lcd.setCursor(0, 1); //установка курсора на вторую строку
lcd.print(rtc.getWeekday()); //вывод текущего дня недели
lcd.setCursor(2, 1); //установка курсора на третью ячейку
lcd.print(rtc.formatDate()); //вывод даты
}
В данном примере формируется минипроект - часы с будильником. Часы показывают время на черырёхразрядном индикаторе. У устройства имеется кнопка - которая переводит контроллер в режим сна до следующей минуты, устанавливая на часах будильник на следующую за текущей минуту. Индикацией установки будильника служит появление на индикаторе надписи «ALAR» - от английского alarm (будильник). Для демонстрации того, что устройство находится в режиме сна, на дисплей выводится информация в виде четырёх тире (- - - -). По пробуждению, дисплей снова отображает время.
Библиотеки
Помимо библиотеки для работы с часами, понадобятся библиотеки для режимов сна и модуля индикатора. Их можно загрузить со страниц в Базе Знаний: Режимы сна и энергосбережение и Модуль 4 - разрядного индикатора
Схема подключения:
Что нужно | Кол-во, шт |
---|---|
Контроллер Smart UNO | 1 |
Sensor Shield | 1 |
Модуль часов PCF8563 | 1 |
Модуль 4-разрядного индикатора | 1 |
Модуль кнопки | 1 |
Шлейф "мама-мама" х4 | 1 |
Шлейф "мама-мама" х3 | 1 |
Провода мама-мама | 5 |
Скетч для загрузки
#include "SevenSegmentTM1637.h" //подключение библиотеки для работы с дисплеем
#include "SevenSegmentExtended.h" //подключение расширенных функций дисплея
#include <Wire.h> //библиотека для работы с I2C
#include <Rtc_Pcf8563.h> //библиотека для работы с часами
#include <Sleep_n0m1.h> //подключение библиотеки для режимов сна
const int wakeUpPin = 3; //вывод прерывания
const int button = 6; //вывод подключения кнопки
Rtc_Pcf8563 rtc; //инициализация часов
SevenSegmentExtended display(13, 12); //создание объекта дисплея
Sleep sleep; //объект для ввода контроллера в сон
void setup() {
display.begin(); //инициализация дисплея
display.setBacklight(100); //установка яркости в 100%
display.print("INIT"); //отображение надписи INIT (инициализация) на дисплее
delay(1000); //задержка в 1 секунду
pinMode(button, INPUT); //режим вывода кнопки
}
void loop() {
rtc.getTime(); //получение времени с часов
byte hour = rtc.getHour(); //запись в переменную количество часов
byte minute = rtc.getMinute(); //запись в переменную количество минут
display.printTime(hour, minute, false); //вывод времени
if (digitalRead(button)) { //была нажата кнопка
set_alarm(minute); //установить будильник
display.print("----"); //вывести четыре тире, означающие что контроллер спит
sleep.pwrDownMode(); //установка режима сна PWR_DOWN
//сон будет продолжаться пока на выводе wakeUpPin не поменяется уровень сигнала
//в данном случае с "HIGH" на "LOW"
sleep.sleepPinInterrupt(wakeUpPin, FALLING); //(номер вывода прерывания, состояние прерывания)
//очистка будильника
clr_alarm();
}
}
/* Процедура очищает регистры будильника на часах.
* Требуется для корректной работы модуля часов.
*/
void clr_alarm() {
detachInterrupt(1); //отключить прерывание номер 1 (вывод контроллера - 3)
rtc.clearAlarm(); //очистить будильник
delay(1000); //секундная задержка
}
/* Процедура устанавливает будильник на часах на одну минуту больше.
* Здесь можно устанавливать будильник на любое время методом setAlarm(),
* который принимает четыре параметра:
* - минуты будильника
* - часы будильника
* - день будильника
* - день недели будильника
* Если любое из значений равно 99 - значит берется значение текущего времени.
*/
void set_alarm(const int& minute) {
rtc.setAlarm(minute + 1, 99, 99, 99); //установка будильника на одну минуту
display.clear(); //очистить дисплей
display.print("ALAR"); //вывести надпись ALAR (ALARM)
delay(1000); //подождать секунду
display.clear(); //очистить дисплей
}