Общие сведения:
Trema-модуль RTC (DS1307Z) и Trema-модуль RTC (DS3231) - высокоточные энергонезависимые модули, которые можно использовать в таких проектах как часы, будильник, секундомер и т.д., а также, с его помощью, можно запускать Ваши процессы по расписанию.
Trema-модуль RTC (DS1307Z) построен на базе чипа DS1307Z, который снабжен: интерфейсом I2C (частота 100 кГц, адрес 0x68), 64 однобайтными регистрами (56 из которых доступны для хранения данных пользователя), компаратором (для переключения между основным и резервным питанием), блоком подзарядки аккумуляторной батареи. Модуль позволяет считывать: секунды, минуты, часы, дни, дни недели, месяц и год.
Trema-модуль RTC (DS3231) - построен на базе чипа DS3231, который снабжен: интерфейсом I2C, кварцевым резонатором на 32,768 кГц, датчиком температуры (для температурной компенсации кварцевого резонатора), регистрами данных, двумя будильниками, компаратором (контролирующим уровень заряда батареи), блоком подзарядки аккумуляторной батареи и выходами меандра (с фиксированной 32,768 кГц, и программируемой частотой 1,0 Гц - 8,192 кГц). Модуль позволяет устанавливать и считывать: секунды, минуты, часы, дни, дни недели, месяц, год и состояние. Считывать температуру и устанавливать: секунды, минуты, часы, и дни будильников
Видео
Спецификация для чипа DS1307Z:
- Питание модуля: 5 В.
- Напряжение питания батареи: 2,0 .. 3,5 В (номинально 3 В).
- Потребляемый ток (в режиме ожидания): до 200 мкА.
- Потребляемый ток (во время передачи данных): до 1,5 мА.
- Потребляемый ток (во время резервного питания): 300 ... 800 нА.
- Тактовая частота шины I2C: до 100 кГц.
- Уровень «0» на шине I2C: -0,5 ... 0,8 В.
- Уровень «1» на шине I2C: 2,2 ... VСС 0,3 В.
- Рабочая температура: 0 ... 70 °C.
- Габариты 30x30 мм.
Спецификация для чипа DS3231:
- Питание модуля: 3,3 В или 5 В (оба напряжения входят в диапазон допустимых значений).
- Потребляемый ток (в режиме ожидания): до 170 мкА.
- Потребляемый ток (во время передачи данных): до 300 мкА.
- Потребляемый ток (во время резервного питания, без передачи данных): до 3,5 мкА.
- Тактовая частота шины I2C: до 400 кГц.
- Уровень «0» на шине I2C: -0,3 ... 0,3 * Vcc В.
- Уровень «1» на шине I2C: 0,7 * Vcc ... Vcc + 0,3 В.
- Напряжение питания батареи: 2,3 .. 5,5 В (номинально 3,0 В).
- Рабочая температура: 0 ... 70 °C.
- Точность хода: ±2 ppm (примерно ± 1 минута в год)
- Габариты 30x30 мм.
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Модуль подключается к аппаратной или программной шине I2C Arduino и имеет адрес 0x68.
Для удобства подключения, предлагаем воспользоваться TremaShield.
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ - 1 : Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
Способ - 2 : Используя Trema Set Shield
Модуль можно подключить к любому из I2C входов Trema Set Shield.
Способ - 3 : Используя проводной шлейф и Shield
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
При подключении RTC модулей на базе чипов DS1302, DS1307, DS3231 к другим платам, например, WEMOS D1 mini или WEMOS D1 mini Pro на базе микроконтроллера ESP8266, и т.д. перед подключением библиотеки iarduino_RTC нужно подключить библиотеку Wire, как это описано в разделе Wiki - расширенные возможности библиотек iarduino для шины I2C.
Питание:
- При наличии основного (Vcc = 5 В) и резервного (Vbat = 3 В) источника питания, модули работают от основного источника питания.
- При отсутствии резервного питания, модули работают от основного источника питания.
- При отсутствии основного питания, модули работают от резервного (продолжает отсчитывать время, но не отвечает на запросы по шине I2C).
- При отсутствии основного и резервного питания, модули отключаются и все их регистры сбрасываются.
Подробнее о модулях:
Для работы с RTC модулями на базе чипов DS1302, DS1307, DS3231, ... , предлагаем воспользоваться библиотекой iarduino_RTC,
Преимуществом данной библиотеки является удобная реализация получения времени.
Вы можете получать время не только через переменные (для сек., мин., часов., ...), но и одной строкой, указав, что именно в ней должно быть.
Подробнее про установку библиотеки читайте в нашей инструкции..
Примеры:
Вывод времени в Монитор последовательного порта:
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC watch(RTC_DS1307); // Объявляем объект watch для модуля на базе чипа DS1307 void setup() { Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта watch.begin(); // Инициируем RTC модуль } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // выводим время в монитор, одной строкой delay(2); // приостанавливаем скетч на 2 мс. } }
Установка времени модуля:
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC watch(RTC_DS1307); // Объявляем объект watch для модуля на базе чипа DS1307 void setup() { Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта watch.begin(); // Инициируем RTC модуль watch.settime(0,51,21,27,10,15,2); // Устанавливаем время: 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // выводим время в монитор, одной строкой delay(2); // приостанавливаем скетч на 2 мс. } }
Получение времени в переменные и вывод их в монитор:
#include <iarduino_RTC.h> // Подключаем библиотеку. iarduino_RTC watch(RTC_DS1307); // Объявляем объект watch для модуля на базе чипа DS1307. uint8_t D, M, Y, h, m, s, W; // Объявляем переменные для получения даты и времени: D-день, M-месяц, Y-год, h-часы, m-минуты, s-секунды, W-день недели. void setup() { Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта. watch.begin(); // Инициируем RTC модуль. } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда watch.gettime(); // Считываем текущее время из модуля. D = watch.day; // Получаем текущий день месяца 1-31. M = watch.month; // Получаем текущий месяц 1-12. Y = watch.year; // Получаем текущий год 0-99. h = watch.Hours; // Получаем текущие часы 0-23. m = watch.minutes; // Получаем текущие минуты 0-59. s = watch.seconds; // Получаем текущие секунды 0-59. W = watch.weekday; // Получаем текущий день недели 0-6. Serial.println((String) D+"-"+M+"-"+Y+", "+h+":"+m+":"+s+", "+W); // Выводим время в монитор, одной строкой. delay(2); // приостанавливаем скетч на 2 мс. } }
Установка системного времени в модуль (времени компьютера):
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC watch(RTC_DS1307); // Объявляем объект watch для модуля на базе чипа DS1307 // // Определяем системное время: // Время загрузки скетча. const char* strM="JanFebMarAprMayJunJulAugSepOctNovDec"; // Определяем массив всех вариантов текстового представления текущего месяца. const char* sysT=__TIME__; // Получаем время компиляции скетча в формате "SS:MM:HH". const char* sysD=__DATE__; // Получаем дату компиляции скетча в формате "MMM:DD:YYYY", где МММ - текстовое представление текущего месяца, например: Jul. // Парсим полученные значения sysT и sysD в массив i: // Определяем массив «i» из 6 элементов типа int, содержащий следующие значения: секунды, минуты, часы, день, месяц и год компиляции скетча. const int i[6] {(sysT[6]-48)*10+(sysT[7]-48), (sysT[3]-48)*10+(sysT[4]-48), (sysT[0]-48)*10+(sysT[1]-48), (sysD[4]-48)*10+(sysD[5]-48), ((int)memmem(strM,36,sysD,3)+3-(int)&strM[0])/3, (sysD[9]-48)*10+(sysD[10]-48)}; // void setup() { Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта watch.begin(); // Инициируем RTC модуль watch.settime(i[0],i[1],i[2],i[3],i[4],i[5]); // Устанавливаем время в модуль: i[0] сек, i[1] мин, i[2] час, i[3] день, i[4] месяц, i[5] год, без указания дня недели. // watch.settime(i[0],i[1],i[2],i[3],i[4],i[5], 2); // Можно установить время с указанием дня недели, где последний параметр, это день недели (указывается вручную) в формате: 0-воскресенье, 1-понедельник, ... , 6-суббота. } void loop(){ if(millis()%1000==0){ // Если прошла 1 секунда Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // Выводим время в монитор, одной строкой delay(2); // Приостанавливаем скетч на 2 мс. } }
Будильник:
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC watch(RTC_DS1307); // Объявляем объект watch для модуля на базе чипа DS1307 void setup() { Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта watch.begin(); // Инициируем RTC модуль } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // выводим время в монитор, одной строкой if(watch.Hours==7 && watch.minutes==0 && watch.seconds==0 && watch.weekday!=0 && watch.weekday!=6){ // Действия внутри оператора if, будут выполняться только по будням в 07:00 Serial.println("07:00 nopa na pa6oty"); // выводим сообщение } delay(2); // приостанавливаем скетч на 2 мс. } }
В библиотеке реализовано 7 функций: 3 основных (begin, settime, gettime) и 4 дополнительных (blinktime, period, settimeUnix, gettimeUnix).
Описание основных функций библиотеки:
Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C.
О том как выбрать тип шины I2C рассказано в статье Wiki - расширенные возможности библиотек iarduino для шины I2C.
Подключение библиотеки:
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC watch(RTC_DS3231); // Создаём объект watch, если модуль создан на базе чипа DS3231 iarduino_RTC watch(RTC_DS1307); // Создаём объект watch, если модуль создан на базе чипа DS1307 iarduino_RTC watch(RTC_DS1302, RST, CLK, DAT); // Создаём объект watch, если модуль создан на базе чипа DS1302
Функция begin();
- Назначение: инициализация RTC модуля
- Синтаксис: begin();
- Параметры: Нет.
- Возвращаемые значения: Нет.
- Примечание:
- Функция вызывается 1 раз в коде setup.
- Проверяет регистры модуля, запускает генератор модуля и т.д.
- Пример:
watch.begin(); // Инициируем работу с модулем реального времени
Функция settime();
- Назначение: Установка времени.
- Синтаксис: settime( СЕКУНДЫ [, МИНУТЫ [, ЧАСЫ [, ДЕНЬ [, МЕСЯЦ [, ГОД [, ДЕНЬ_НЕДЕЛИ ]]]]]] );
- Параметры:
- СЕКУНДЫ - число от 0 до 59, или -1.
- МИНУТЫ - число от 0 до 59, или -1.
- ЧАСЫ - число от 0 до 23, или -1.
- ДЕНЬ - число от 1 до 31, или -1.
- МЕСЯЦ - число от 1 до 12, или -1.
- ГОД - число от 0 до 99 (без учёта века), или -1.
- ДЕНЬ_НЕДЕЛИ - число от 0 (воскресение) до 6 (суббота), или -1.
- Возвращаемые значения: Нет.
- Примечание:
- Значение параметров -1 означает, что данный параметр устанавливать не нужно.
- Все параметры, кроме секунд, являются необязательными.
- Пример:
watch.settime(-1, -1, 10); // установить 10 часов, а секунды, минуты и дату, оставит без изменений. watch.settime(30, -1, -1, 2) // установить 30 секунд и 2 день месяца, остальные данные оставит без изменений
Функция gettime();
- Назначение: Чтение времени.
- Синтаксис: gettime( [ "СТРОКА_ШАБЛОН" ] );
- Параметры:
- СТРОКА_ШАБЛОН - задаёт шаблон для вывода строки времени, как у функции date() в PHP:
s - секунды от 00 до 59 (два знака)
i - минуты от 00 до 59 (два знака)
h - часы в 12-часовом формате от 01 до 12 (два знака)
H - часы в 24-часовом формате от 00 до 23 (два знака)
d - день месяца от 01 до 31 (два знака)
w - день недели от 0 до 6 (один знак: 0-воскресенье, 6-суббота)
D - день недели наименование от Mon до Sun (три знака: Mon Tue Wed Thu Fri Sat Sun)
m - месяц от 01 до 12 (два знака)
M - месяц наименование от Jan до Dec (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
Y - год от 2000 до 2099 (четыре знака)
y - год от 00 до 99 (два знака)
a - полдень am или pm (два знака, в нижнем регистре)
A - полдень AM или PM (два знака, в верхнем регистре)
- СТРОКА_ШАБЛОН - задаёт шаблон для вывода строки времени, как у функции date() в PHP:
- Возвращаемые значения: Строка шаблона, указанные символы которой заменены на время.
- Примечание:
- Строка не должна превышать 50 символов.
- Функцию можно вызывать без параметра, это приведёт к выводу пустой строки и обновлению переменных (см. ниже).
- Пример:
Serial.println( watch.gettime("d-m-Y, H:i:s, D") ); // выведет строку "01-10-2015, 14:00:05, Thu" и обновит значение переменных. Serial.println( watch.gettime("s") ); // выведет строку "05" и обновит значение переменных. // если сейчас 5 секунд третьего, 1 октября 2015 года.
- Любое обращение к функции gettime(), даже без параметра, приводит к обновлению значений следующих переменных библиотеки:
Переменная seconds
- Значение: Содержит количество секунд, от 0 до 59;
- Тип данных: uint8_t.
Переменная minutes
- Значение: Содержит количество минут, от 0 до 59;
- Тип данных: uint8_t.
Переменная hours
- Значение: Содержит количество часов, от 1 до 12;
- Тип данных: uint8_t.
Переменная Hours
- Значение: Содержит количество часов, от 0 до 23;
- Тип данных: uint8_t.
Переменная midday
- Значение: Содержит значение 0 или 1 (0-am, 1-pm);
- Тип данных: uint8_t.
Переменная day
- Значение: Содержит день месяца, от 1 до 31;
- Тип данных: uint8_t.
Переменная weekday
- Значение: Содержит день недели, от 0 до 6 (0-воскресенье, 6-суббота);
- Тип данных: uint8_t.
Переменная month
- Значение: Содержит текущий месяц, от 1 до 12;
- Тип данных: uint8_t.
Переменная year
- Значение: Содержит текущий год, от 0 до 99;
- Тип данных: uint8_t.
Переменная Unix
- Значение: Содержит секунды с начала эпохи Unix, от 0 до 4'294'967'295 (06:28:15, 06.02.2106);
- Тип данных: uint32_t.
watch.gettime(); // читаем время, обновляя значения всех переменных. Serial.println( watch.seconds ); // выводим количество секунд Serial.println( watch.minutes ); // выводим количество минут Serial.println( watch.hours ); // выводим количество часов в 12 часовом формате Serial.println( watch.Hours ); // выводим количество часов в 24 часовом формате Serial.println( watch.midday ); // выводим 0 (до полудня), или 1 (после полудня) Serial.println( watch.day ); // выводим текущий день месяца Serial.println( watch.weekday ); // выводим текущий день недели: 0 (воскресение), 1 (понедельник), ... , 5 (пятница), 6 (суббота) Serial.println( watch.month ); // выводим текущий месяц Serial.println( watch.year ); // выводим текущий год Serial.println( watch.Unix ); // выводим количество секунд прошедших с начала эпохи Unix
Описание дополнительных функций библиотеки:
Функция blinktime();
- Назначение: мигание одним из параметров времени.
Указывает функции gettime(), мигать одним из параметров времени (периодически заменять параметр пробелами).
Может быть полезна, для отображения устанавливаемого параметра времени на дисплее. - Синтаксис: blinktime( ПАРАМЕТР_ВРЕМЕНИ [, ЧАСТОТА_МИГАНИЯ ] );
- Параметры:
- ПАРАМЕТР_ВРЕМЕНИ - число от 0 до 8:
0 не мигать
1 мигают секунды
2 мигают минуты
3 мигают часы
4 мигает день
5 мигает месяц
6 мигает год
7 мигает день недели
8 мигает полдень (AM/PM) - ЧАСТОТА_МИГАНИЯ - число типа float определяющее частоту мигания в Гц (по умолчанию 1 Гц).
- ПАРАМЕТР_ВРЕМЕНИ - число от 0 до 8:
- Возвращаемые значения: Нет.
- Примечание: Значение по умолчанию 0.
- Пример:
void setup(){ Serial.begin( 9600 ); // Инициируем передачу данных в монитор последовательного порта watch.begin(); // Инициируем работу с модулем RTC watch.blinktime( 2 ); // Заставляем функцию gettime мигать минутами с частотой по умолчанию //watch.blinktime( 2 , 5 ); // Заставляем функцию gettime мигать минутами с частотой 5 Гц (5 раз в секунду) } void loop(){ Serial.println( watch.gettime("H:i:s") ); // Выводим время, в котором будут мигать минуты }
Функция period();
- Назначение: Установка минимального периода обращения к модулю в минутах (от 0 до 255).
Данная функция указывает функции gettime() откуда брать текущее время: из модуля (не чаще заданного периода), или рассчитать в библиотеке (без обращения к модулю).
Функция может быть полезна, если шина передачи данных сильно нагружена другими устройствами. - Синтаксис: period( ПЕРИОД );
- Параметры:
- ПЕРИОД - количество минут от 0 до 255, в течении которого к модулю может быть отправлен только 1 запрос. Если указан 0, значит каждый вызов функции gettime() генерирует запрос к модулю.
- Возвращаемые значения: Нет.
- Примечание: Значение по умолчанию 0.
- Пример:
void setup(){ Serial.begin( 9600 ); // Инициируем передачу данных в монитор последовательного порта watch.begin(); // Инициируем работу с модулем RTC watch.period( 1 ); // Указываем обращаться к модулю RTC не чаще чем один раз в минуту } void loop(){ Serial.println( watch.gettime("H:i:s") ); // будет выводить время как обычно, но на самом деле, обращение к модулю и сверка времени происходит 1 раз в минуту }
Функция settimeUnix();
- Назначение: Установка времени.
- Синтаксис: settimeUnix( СЕКУНДЫ );
- Параметры:
- СЕКУНДЫ - количество секунд прошедшее с начала эпохи Unix.
- Возвращаемые значения: Нет.
- Примечание: Данная функция выполняет действия аналогичные функции settime(), но в качестве параметра получает только секунды прошедшие с даты 01.01.1970 00:00:00.
- Пример:
watch.settimeUnix(1577836800); // установить время = 01.01.1970 00:00:00 + 1577836800 сек = 01.01.2020 00:00:00.
Функция gettimeUnix();
- Назначение: Чтение количества секунд прошедших с начала эпохи Unix.
- Синтаксис: gettimeUnix();
- Параметры: Нет.
- Возвращаемые значения: Количество секунд прошедшее с начала эпохи Unix.
- Примечание: Данная функция выполняет действия аналогичные чтению переменной Unix после обращения к функции gettime() без параметров.
- Пример:
Serial.println( watch.gettimeUnix() ); // выведет количество секунд прошедших с даты 01.01.1970 00:00:00.
Применение:
- Часы, будильник, секундомер и т.д.
- Запуск процессов по расписанию.
Ссылки:
- Часы реального времени все модули.
- Часы реального времени на базе чипа DS1302.
- Часы реального времени на базе чипа DS1307 (Trema-модуль).
- Часы реального времени на базе чипа DS1307.
- Часы реального времени на базе чипа DS3231.
- Часы реального времени на базе чипа DS3231 (Trema-модуль).
- Библиотека iarduino_RTC.
- Расширенные возможности библиотек iarduino для шины I2C.
- Wiki - Установка библиотек в Arduino IDE.
Обсуждение