// Библиотека для работы с часами реального времени: (на чипе DS1302) http://iarduino.ru/shop/Expansion-payments/rtc-modul-ds1302.html // (на чипе DS1307) http://iarduino.ru/shop/Expansion-payments/chasy-realnogo-vremeni-rtc-trema-modul.html // (на чипе DS3231) http://iarduino.ru/shop/Expansion-payments/chasy-realnogo-vremeni-ds3231.html // Версия: 1.3.4 // Последнюю версию библиотеки Вы можете скачать по ссылке: http://iarduino.ru/file/235.html // Подробное описание функции бибилиотеки доступно по ссылке: http://wiki.iarduino.ru/page/chasy-realnogo-vremeni-rtc-trema-modul/ // Библиотека является собственностью интернет магазина iarduino.ru и может свободно использоваться и распространяться! // При публикации устройств или скетчей с использованием данной библиотеки, как целиком, так и её частей, // в том числе и в некоммерческих целях, просим Вас опубликовать ссылку: http://iarduino.ru // Автор библиотеки: Панькин Павел // Если у Вас возникли технические вопросы, напишите нам: shop@iarduino.ru #ifndef iarduino_RTC_h // #define iarduino_RTC_h // // #define RTC_UNDEFINED 0 // Модуль часов реального времени не определён // #if defined(ARDUINO) && (ARDUINO >= 100) // #include // #else // #include // #endif // // #define RTC_ENABLE_DS3231 // class iarduino_RTC_BASE{ // Объявляем полиморфный класс public: // virtual void begin (void); // Объявляем функцию инициализации модуля (без параметров) virtual uint8_t funcReadTimeIndex (uint8_t); // Объявляем функцию чтения 1 значения из регистров даты и времени (0-секунды / 1-минуты / 2-часы / 3-день / 4-месяц / 5-год / 6-день недели) virtual void funcWriteTimeIndex (uint8_t, uint8_t); // Объявляем функцию записи 1 значения в регистры даты и времени (0-секунды / 1-минуты / 2-часы / 3-день / 4-месяц / 5-год / 6-день недели, значение) }; // #include "iarduino_RTC_DS3231.h" // Подключаем файл iarduino_RTC_DS3231.h // class iarduino_RTC{ // public: // /** Конструктор класса **/ // iarduino_RTC(uint8_t i, uint8_t j=SS, uint8_t k=SCK, uint8_t n=MOSI){ // Конструктор основного класса (название [, вывод SS/RST [, вывод SCK/CLK [, вывод MOSI/DAT]]]) switch(i){ // Тип выбранного модуля #ifdef RTC_ENABLE_DS1302 // case RTC_DS1302: objClass = new iarduino_RTC_DS1302(j,k,n); break; // Если используется модуль на базе чипа DS1302, то присваеиваем указателю objClass ссылку на новый объект производного класса iarduino_RTC_DS1302 переопределяя на него все виртуальные функции полиморфного класса iarduino_RTC_BASE #endif // #ifdef RTC_ENABLE_DS1307 // case RTC_DS1307: objClass = new iarduino_RTC_DS1307; break; // Если используется модуль на базе чипа DS1307, то присваеиваем указателю objClass ссылку на новый объект производного класса iarduino_RTC_DS1307 переопределяя на него все виртуальные функции полиморфного класса iarduino_RTC_BASE #endif // #ifdef RTC_ENABLE_DS3231 // case RTC_DS3231: objClass = new iarduino_RTC_DS3231; break; // Если используется модуль на базе чипа DS3231, то присваеиваем указателю objClass ссылку на новый объект производного класса iarduino_RTC_DS3231 переопределяя на него все виртуальные функции полиморфного класса iarduino_RTC_BASE #endif // } // } // /** Пользовательские функции **/ // void begin (void) {objClass -> begin(); gettime();} // Определяем функцию инициализации модуля (без параметров) void period (uint8_t i) {valPeriod=i; valPeriod*=60000;} // Определяем функцию задания минимального периода обращения к модулю (i = период в минутах) void blinktime (uint8_t i, float j=1) {valBlink=i; valFrequency=uint32_t(1000/j);} // Определяем функцию позволяющую мигать одним из параметров времени (i = 0-нет / 1-сек / 2-мин / 3-час / 4-день / 5-мес / 6-год / 7-день_недели / 8-полдень , j = частота мигания в Гц) void gettime (void) {gettime("");} // Определяем функцию получения даты и времени из переменных (без параметров) char* gettime (String); // Объявляем функцию «дублёр» получения даты и времени из переменных (строка с параметрами) char* gettime (const char*); // Объявляем функцию получения даты и времени ввиде строки (строка с параметрами) void settime (int, int=-1, int=-1, int=-1, int=-1, int=-1, int=-1); // Объявляем функцию установки даты и времени (сек, мин, час, день, мес, год, день_недели) uint32_t gettimeUnix (void) {gettime(""); return Unix;} // Определяем функцию получения cекунд прошедших с начала эпохи Unix (без параметров) void settimeUnix (uint32_t); // Объявляем функцию установки cекунд прошедших с начала эпохи Unix (сек) // /** Переменные доступные для пользователя **/ // uint8_t seconds = 0; // Секунды 0-59 uint8_t minutes = 0; // Минуты 0-59 uint8_t hours = 1; // Часы 1-12 uint8_t Hours = 0; // Часы 0-23 uint8_t midday = 0; // Полдень 0-1 (0-am, 1-pm) uint8_t day = 1; // День месяца 1-31 uint8_t weekday = 0; // День недели 0-6 (0-воскресенье, 1-понедельник, ... , 6-суббота) uint8_t month = 1; // Месяц 1-12 uint8_t year = 0; // Год 0-99 (без учёта века) uint32_t Unix = 0; // Секунды прошедшие с начала эпохи Unix (01.01.1970 00:00:00 GMT) // /** Внутренние переменные **/ // iarduino_RTC_BASE* objClass; // Объявляем указатель на объект полиморфного класса (функции данного класса будут переопределены, т.к. указателю будет присвоена ссылка на производный класс) char* charReturn = (char*) malloc(1); // Определяем указатель на символьную область памяти в 1 байт (указатель будет ссылаться на строку вывода времени) const char* charInput = "waAdhHimsyMDY"; // Определяем константу-строку с символами требующими замены (данные символы заменяются функцией gettime на значение времени) const char* charMidday = "ampmAMPM"; // Определяем константу-строку для вывода полудня (am / pm / AM / PM) const char* charDayMon = "SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec"; // Определяем константу-строку для вывода дня недели или месяца (Mon ... Sun / Jan ... Dec) uint8_t arrCalculationTime[7]; // Объявляем массив для рассчёта времени без обращения к модулю (для хранения последних, прочитанных из модуля, значений даты и времени) uint8_t valBlink = 0; // Определяем параметр времени, который должен мигать (1-сек / 2-мин / 3-час / 4-день / 5-мес / 6-год / 7-день_недели / 8-полдень) uint32_t valFrequency = 1000; // Определяем частоту мигания параметра времени для функции blinktime (по умолчанию 1 Гц) uint8_t valCentury = 21; // Определяем переменную для хранения текущего века (по умолчанию 21 век) uint16_t valPeriod = 0; // Определяем минимальный период опроса модуля (в минутах, от 00 до 255) uint32_t valRequest = 0; // Определяем время последнего чтения регистров времени private: // /** Внутренние функции **/ // void funcReadTime (void); // Объявляем функцию чтения даты и времени из регистров модуля (без параметров) void funcWriteTime (int, int, int, int, int, int, int); // Объявляем функцию записи даты и времени в регистры модуля (без параметров) uint8_t funcConvertCodeToNum (uint8_t i) {return (i >> 4)*10 + (i & 0x0F);} // Определяем функцию преобразования двоично-десятичного кода в число (код) uint8_t funcConvertNumToCode (uint8_t i) {return ((i/10) << 4) + (i%10);} // Определяем функцию преобразования числа в двоично-десятичный код (число) void funcSetMoreTime (void){hours=(Hours%12)?(Hours%12):12; midday=(Hours<12)?0:1;} // Корректировка переменных не читаемых из модуля (без параметров) void funcCalculationTime (void); // Объявляем функцию расчёта времени без обращения к модулю (без параметров) uint32_t funcCalculationUnix (void); // Объявляем функцию расчёта cекунд прошедших с начала эпохи Unix (без параметров) void funcFillChar (uint8_t, uint8_t, uint8_t, uint8_t); // Объявляем функцию заполнения строки вывода времени (данные, тип данных, позиция для вставки, мигание) }; // // #endif //