====== Модуль часов PCF8563 ======
===== Описание =====
Модуль часов реального времени с независимым питанием. Контроллеры Arduino/Genuino не имеют встроенных часов реального времени. Для работы со временем есть функция millis(). Однако, для проектов где требуется время и дата, возможностей данной функции недостаточно и на помощь приходят часы реального времени.

Модуль PCF8563 - это недорогие, точные, с работой по протоколу I2C часы-календарь реального времени. В отличии от других модулей часов - имеют низкое энергопотребление, поддерживают функцию таймера, имеют встроенный календарь. Устройство содержит разъём для батареи типа CR1220 (за счёт чего модуль имеет очень маленькие размеры) и поддерживает точный отсчет времени когда питание устройства прерывается. Часы поддерживают информацию о секундах, минутах, часах, дне, дне недели, месяце и годе. Дата на конец месяца автоматически корректируется, для месяцев, содержащих менее чем 31 день, включая коррекцию по високосному году. Имеют программируемый будильник.

Основные характеристики часов:
  * Часы реального времени с подсчетом секунд, минут, часов, дня, месяца и года (с корректировкой дат в т.ч. по високосному году до 2100 года)
  * Погрешность хода: ±2 минуты в год
  * Программируемый будильник
  * Поддержка функции таймера
  * Флаг века
  * Низкое энергопотребление (от 0,25 мА при питании от 3В и температуры 25°С)
  * Работа по шине I2C 

==== Технические характеристики ====
  * Рабочая температура: -40°С - +85°С
  * Температура хранения данных: -65°С - +150°С
  * Напряжение питания: 3,3 - 5 В
  * Максимальное потребление тока: 

==== Физические размеры ====
  * Модуль (Д х Ш х В): 30 х 20 х 7 мм

==== Плюсы использования ====
  * Высокая точность хода часов
  * Наличие будильника с функцией прерывания
  * Широкий диапазон рабочей температуры
  * Функция календаря
  * Функция таймера

==== Минусы использования ====
  * Дороже некоторых аналогов

==== Ресурсы для загрузки ====
  * [[http://files.smartelements.ru/datasheet/pcf8563.pdf|Даташит на часы PCF8563]]
  * [[http://files.smartelements.ru/know_libs/rtc_pcf8563.zip|Библиотека для работы с часами]]

===== Примеры подключения и использования =====
==== Пример 1 ====
В примере иллюстрируется первоначальная настройка модуля - установка времени и даты.

^ Что нужно                                                                                                               ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                |  1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor Shield]]                |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-chasov-pcf8563|Модуль часов PCF8563]]                      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h4-20-sm|Шлейф "мама-мама" х4]]  |  1           |

**Схема подключения:**
{{ :главная:модули:модуль_часов_pcf8563_пример_1_н.png?nolink |}}

**Скетч для загрузки:**

<file Arduino>
#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()
{

}
</file>

==== Пример 2 ====
В примере демонстрируется подключение часов и дисплея к Расширителю I2C. Далее происходит вывод времени, дня недели и даты на дисплей.

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                            |  1           |
| [[http://smartelements.ru/collection/shildy/product/sensor-shield|Sensor Shield]]             |  1           |
| [[http://smartelements.ru/collection/moduli/product/rasshiritel-i2c-hab|Расширитель I2C]]             |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-chasov-pcf8563|Модуль часов PCF8563]]             |  1           |
| [[http://smartelements.ru/collection/displei-i-indikatory/product/displey-lcd1602-2-strochnyy-s-i2c-modulem-2|Дисплей 2-строчный с I2C модулем]]             |  1           |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h4-20-sm|Шлейф "мама-мама" х4]]  |  3           |

**Схема подключения:**
{{ :главная:модули:модуль_часов_pcf8563_пример_2_н.png?nolink |}}

Подключение расширителя и устройств к нему происходит напрямую, для этого удобно использовать [[http://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h4-20-sm|4-ёх проводной шлейф]]. Если на устройстве выводы расположены в другом порядке, подключите к расширителю с помощью обычных проводов мама-мама (или тех, которые подходят к Вашему устройству.


**Скетч для загрузки:**
<file Arduino>
#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()); //вывод даты
}
</file>

==== Пример 3. Засыпать и просыпаться по будильнику часов ====
В данном примере формируется минипроект - часы с будильником. Часы показывают время на черырёхразрядном индикаторе. У устройства имеется кнопка - которая переводит контроллер в режим сна до следующей минуты, устанавливая на часах будильник на следующую за текущей минуту. Индикацией установки будильника служит появление на индикаторе надписи "ALAR" - от английского alarm (будильник). Для демонстрации того, что устройство находится в режиме сна, на дисплей выводится информация в виде четырёх тире (- - - -). По пробуждению, дисплей снова отображает время.

**Библиотеки**

Помимо библиотеки для работы с  часами, понадобятся библиотеки для режимов сна и модуля индикатора. Их можно загрузить со страниц в Базе Знаний: [[main:info:sleep]] и [[main:disp:4dig_indicator_m]]

**Схема подключения:**
{{ :главная:модули:модуль_часов_pcf8563_пример_3_н.png?nolink |}}

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                   |  1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor Shield]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-chasov-pcf8563|Модуль часов PCF8563]]                      |  1           |
| [[https://smartelements.ru/collection/displei-i-indikatory/product/modul-4-razryadnogo-indikatora-krasnyy|Модуль 4-разрядного индикатора ]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-knopki|Модуль кнопки]]                      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h4-20-sm|Шлейф "мама-мама" х4]]      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h3-20-sm|Шлейф "мама-мама" х3]]      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-mama-mama|Провода мама-мама]]  |  5          |

**Скетч для загрузки**
<file Arduino>
#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(); //очистить дисплей
}
</file>