Подключение RTC часы реального времени DS1302, DS1307, DS3231 к Arduino
Для подключения RTC часов реального времени DS1302, DS1307, DS3231, была разработана универсальная библиотека.
Подключение:
Подключение DS1307 к Arduino :
RTC DS1307 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
SDA | A4 |
SCL | A5 |
Подключение DS1302 к Arduino :
RTC DS1302 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
RST | 10 (Можно изменить на другие в скетче) |
CLK | 13 (Можно изменить на другие в скетче) |
DAT | 12 (Можно изменить на другие в скетче) |
Подключение DS3231 к Arduino :
RTC DS3231 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
SDA | A4 |
SCL | A5 |
Программа:
В зависимости от того какой модуль Вы подключаете, необходимо в программе указать
Для DS1307:
time.begin(RTC_DS1307);
Для DS1302 :
time.begin(RTC_DS1302,10,13,12);
Для DS3231 :
time.begin(RTC_DS3231);
Пример установки текущего времени в RTC модуль (DS1307):
#include iarduino_RTC time(RTC_DS1307); void setup() < delay(300); Serial.begin(9600); time.begin(); time.settime(0,51,21,27,10,15,2); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник >void loop() < if(millis()%1000==0)< // если прошла 1 секунда Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс >>
Пример считывания текущего времени с RTC модуля (DS1307) и вывод в «Последовательный порт» :
#include iarduino_RTC time(RTC_DS1307); void setup() < delay(300); Serial.begin(9600); time.begin(); >void loop() < if(millis()%1000==0)< // если прошла 1 секунда Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс >>
Преимущества библиотеки:
— библиотека имеет внутренние функции аппаратной обработки протоколов передачи данных I2C и SPI, а следовательно не требует подключения дополнительных библиотек, но и не конфликтует с ними, если таковые всё же подключены.
— библиотека имеет внутренние функции программой обработки протокола передачи данных 3-Wire
— для инициализации модуля необходимо вызвать функцию begin с названием модуля.
— подключение модулей осуществляется к аппаратным выводам arduino используемой шины (за исключением 3-Wire)
— простота установки и чтения времени функциями settime и gettime
функция settime может устанавливать дату и время, как полностью, так и частично (например только минуты, или только день, и т.д.)
функция gettime работает как функция date в php, возвращая строку со временем, но если её вызвать без параметра, то функция ничего не вернёт, а время можно прочитать из переменных в виде чисел.
— библиотека расширяемая, то есть для того, чтоб она работала с новым модулем, нужно указать параметры этого модуля в уже существующих массивах файла RTC.h (тип шины, частота шины в кГц, режимы работы, адреса регистров и т.д.), как всё это сделать, описано в файле extension.txt
Таким образом добавив новый модуль в библиотеку, мы лишь увеличим область занимаемой динамической памяти на ~ 36 байт, при этом не затронув область памяти программ.
— при вызове функции begin, библиотека читает флаги регистров модуля и при необходимости устанавливает или сбрасывает их так, чтоб модуль мог работать от аккумуляторной батареи, а на программируемом выводе меандра (если таковой у модуля есть) установилась частота 1Гц, тогда этот вывод можно использовать в качестве внешнего посекундного прерывания.
— при работе с модулем DS1302 не нужны никакие резисторы на выводе GND (которые нужны для его работы с другими библиотеками этого модуля), это достигнуто тем, что для шины 3-Wire указана конкретная частота 10кГц, не зависимо от частоты CPU arduino.
— в библиотеке реализована еще одна не обязательная функция period, принимающая в качестве единственного аргумента — количество минут (от 1 до 255)
если в течении указанного времени была вызвана функция gettime несколько раз, то запрос к модулю по шине будет отправлено только в первый раз, а ответом на все остальные запросы будет сумма времени последнего ответа модуля и времени прошедшего с этого ответа.
Функцию period достаточно вызвать один раз.
Подробное описание:
>// ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ: // // Подключение библиотеки: // #include // iarduino_RTC time(название модуля [, вывод SS/RST [, вывод CLK [, вывод DAT]]]); // если модуль работает на шине I2C или SPI, то достаточно указать 1 параметр, например: iarduino_RTC time(RTC_DS3231); // если модуль работает на шине SPI, а аппаратный вывод SS занят, то номер назначенного вывода SS для модуля указывается вторым параметром, например: iarduino_RTC time(RTC_DS1305,22); // если модуль работает на трехпроводной шине, то указываются номера всех выводов, например: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT // // Для работы с модулями, в библиотеке реализованы 5 функции: // инициировать модуль begin(); // указать время settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]); // получить время gettime("строка с параметрами"); // мигать времем blinktime(0-не_мигать / 1-мигают_сек / 2-мигают_мин / 3-мигают_час / 4-мигают_дни / 5-мигают_мес / 6-мигает_год / 7-мигают_дни_недели / 8-мигает_полдень) // разгрузить шину period (минуты); // // Функция begin(): // функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д. // // Функция settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]): // записывает время в модуль // год указывается без учёта века, в формате 0-99 // часы указываются в 24-часовом формате, от 0 до 23 // день недели указывается в виде числа от 0-воскресенье до 6-суббота // если предыдущий параметр надо оставить без изменений, то можно указать отрицательное или заведомо большее значение // пример: settime(-1, 10); установит 10 минут, а секунды, часы и дату, оставит без изменений // пример: settime(0, 5, 13); установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений // пример: settime(-1, -1, -1, 1, 10, 15); установит дату 01.10.2015 , а время и день недели оставит без изменений // // Функция gettime("строка с параметрами"): // функция получает и выводит строку заменяя описанные ниже символы на текущее время // пример: gettime("d-m-Y, H:i:s, D"); ответит строкой "01-10-2015, 14:00:05, Thu" // пример: gettime("s"); ответит строкой "05" // указанные символы идентичны символам для функции 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 (два знака, в верхнем регистре) // строка не должна превышать 50 символов // // если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных // seconds секунды 0-59 // minutes минуты 0-59 // hours часы 1-12 // Hours часы 0-23 // midday полдень 0-1 (0-am, 1-pm) // day день месяца 1-31 // weekday день недели 0-6 (0-воскресенье, 6-суббота) // month месяц 1-12 // year год 0-99 // // Функция blinktime(параметр): // указывает функции gettime мигать одним из параметров времени (заменять параметр пробелами) // функция может быть полезна, для отображения на дисплее, устанавливаемого параметра времени // функция получает один параметр в виде числа от 0 до 8 // 0 не мигать // 1 мигают сек // 2 мигают мин // 3 мигают час // 4 мигают дни // 5 мигают мес // 6 мигает год // 7 мигают дни недели // 8 мигает полдень // // Функция period(минуты): // устанавливает минимальный период обращения к модулю в минутах (от 0 до 255) // функция может быть полезна, если шина сильно нагружена, на ней имеются несколько устройств // period(10); период 10 минут, означает что каждые 10 минут к модулю может быть отправлен только 1 запрос на получение времени // ответом на все остальные запросы будет результат последнего полученного от модуля времени + время прошедшее с этого запроса
Урок 18. Подключение RTC часы реального времени с кнопками
В этом уроке мы научимся не только выводить, но и устанавливать время RTC модуля при помощи трёх кнопок.
Нам понадобится:
- Arduino х 1шт.
- RTC модуль Trema на базе чипа DS1307 х 1шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
- Trema Shield х 1шт.
- Trema-модуль i2C Hub х 1шт.
- Trema-модуль кнопка c проводами х 3шт.
- Шлейф «мама-мама»для шины I2С х 2шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .
Видео
Схема подключения:
Подключение модулей RTC и LCD, данного урока, осуществляется к аппаратным выводам SDA, и SCL.
RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 | Arduino Uno |
---|---|
GND | GND |
Vcc | +5V |
SDA (Serial DAta) | A4 |
SCL (Serial CLock) | A5 |
подключение кнопок: кнопка «SET» к выводу 2, кнопка «UP» к выводу 3 и копка «DOWN» к выводу 4.
Код программы:
При подключении библиотеки «iarduino_RTC» нужно указать, с каким модулем ей работать, в данном случае это модуль Trema на базе чипа DS1307:
#include // подключаем библиотеку для работы с RTC модулем iarduino_RTC time(RTC_DS1307); // объявляем переменную time для работы с библиотекой, указывая название модуля RTC_DS1307 void setup() < time.begin(); // инициируем RTC модуль >
Аналогичный алгоритм действий при подключении библиотеки «LiquidCrystal_I2C» для работы с LCD дисплеем LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) :
#include // подключаем библиотеку для работы с шиной I2C #include // подключаем библиотеку для работы с LCD дисплеем LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную lcd для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) void setup() < lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея >
Осталось подключить 3 кнопки: «SET», «UP» и «DOWN» . Для этого им нужно назначить номера выводов и указать, что эти выводы работают как вход:
const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN void setup() < pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" >
В библиотеке «iarduino_RTC», для работы с датой и временем реализованы две функции: settime() — установка и gettime() — получение времени.
time.settime(0,1,2,3,4,5,6); // установить время: 00 сек, 01 мин, 02 часа, 03 день, 04 месяц, 05 год, 06 день недели - суббота // Если указать отрицательное значение, то соответствующий параметр останется без изменений. // Например: time.settime(10,20,-1,-1,-1,-1,-1); приведёт к изменению секунд и минут, а часы и дата останутся без изменений
time.gettime("d-m-Y, H:i:s, D"); // получить время в виде строки. Получим: "03-04-2005, 02:01:00, Sat" // Функция получает строку с символами, заменяет символы на дату и время, и возвращает строку // Какие символы на что заменяются можно посмотреть в файле iarduino_RTC.h
В библиотеке «iarduino_RTC» доступны 9 числовых переменных: seconds, minutes, hours, Hours, midday, day, weekday, month и year, значения которых обновляются после каждого вызова функции gettime(). Эти переменные мы будим использовать для изменения даты и времени.
int i = time.month; // если в часах установлен месяц май, то i будет равно 5 (пятый месяц)
Еще одна функция библиотеки «iarduino_RTC», которая нам понадобится, это blinktime(), она заставляет функцию gettime(), мигать одним из параметров времени (0 — не мигать, 1 — мигать секундами, 2 — мигать минутами, 3 — мигать часами, 4 — мигать днями и т.д.).
time.blinktime(4); // функция gettime() будет выводить строки с "мигающими" днями
И последнее, о чем надо позаботиться перед созданием кода программы — это алгоритм работы кнопок и определение переменных
Алгоритм работы кнопок следующий:
- В режиме вывода даты или времени (обычный режим):
- Кратковременное нажатие на кнопку SET переключает вывод даты и вывод времени
- Удержание кнопки SET переводит часы в режим установки даты или времени (зависит от того, что было на дисплее, дата или время)
- Кнопки UP и DOWN неактивны.
- Кратковременное нажатие на кнопку SET — переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.)
- Удержание кнопки SET выводит часы из режима установки
- Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
- Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени
Исходя из алгоритма, нам понадобятся две переменные, назовем их: VAR_mode_SHOW и VAR_mode_SET . Первая будет указывать режим вывода (1-выводим_время, 2-выводим_дату). Вторая, будет указывать режим установки времени (0-нет, 1-сек, 2-мин, 3-час, 4-день, 5-мес, 6-год, 7-д.н.).
Теперь всё готово для создания полного кода:
// Подключаем библиотеки: #include // подключаем библиотеку для работы с шиной I2C #include // подключаем библиотеку для работы с LCD дисплеем #include // подключаем библиотеку для работы с RTC модулем LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля // Объявляем переменные и константы: const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN uint8_t VAR_mode_SHOW = 1; // режим вывода: 1-время 2-дата uint8_t VAR_mode_SET = 0; // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели void setup() < pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" delay(300); // ждем 300мс time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея >void loop() < if(millis()%1000==0)< // если прошла 1 секунда lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("iArduino.ru"); // выводим текст "iArduino.ru" lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 if(VAR_mode_SHOW==1)< // если установлен режим вывода времени lcd.print(time.gettime("H:i:s")); // выводим время >if(VAR_mode_SHOW==2) < // если установлен режим вывода даты lcd.print(time.gettime("d-m-Y D")); // выводим дату >delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс > Func_buttons_control(); // передаём управление кнопкам > // Функция управления кнопками: void Func_buttons_control() < uint8_t i=0; time.blinktime(VAR_mode_SET); // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0) //Если часы находятся в режиме установки даты/времени if(VAR_mode_SET)< // Если нажата кнопка UP if(digitalRead(PIN_button_UP ))< while(digitalRead(PIN_button_UP))// ждём пока мы не отпустим кнопку UP switch (VAR_mode_SET) < // инкремент (увеличение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break; >> // Если нажата кнопка DOWN if(digitalRead(PIN_button_DOWN)) < while(digitalRead(PIN_button_DOWN))// ждём пока мы её не отпустим switch (VAR_mode_SET) < // декремент (уменьшение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break; >> // Если нажата кнопка SET if(digitalRead(PIN_button_SET))< while(digitalRead(PIN_button_SET))< // ждём пока мы её не отпустим delay(10); if(i<200)else // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран > if(i<200)< // если кнопка SET удерживалась меньше 2 секунд VAR_mode_SET++; // переходим к следующему устанавливаемому параметру if(VAR_mode_SHOW==1 && VAR_mode_SET>3) // возвращаемся к первому устанавливаемому параметру if(VAR_mode_SHOW==2 && VAR_mode_SET>7) // возвращаемся к первому устанавливаемому параметру >else < // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени VAR_mode_SET=0; // выходим из режима установки даты/времени >> //Если часы находятся в режиме вывода даты/времени >else< // Если нажата кнопка SET if(digitalRead(PIN_button_SET))< while(digitalRead(PIN_button_SET))else // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран > if(i<200)< // если кнопка SET удерживалась меньше 2 секунд lcd.clear(); // стираем экран VAR_mode_SHOW=VAR_mode_SHOW==1?2:1; // меняем режим вывода: дата/время >else < // если if(VAR_mode_SHOW==1)// если установлен режим вывода времени, то устанавливаемый параметр - секунды if(VAR_mode_SHOW==2) // если установлен режим вывода даты, то устанавливаемый параметр - день > > > >
Разберемся в данном коде:
- сначала мы подключили библиотеки Wire.h, LiquidCrystal_I2C.h и iarduino_RTC.h
- далее объявили константы: PIN_button_SET=2, PIN_button_UP=3, PIN_button_DOWN=4, указав им номера выводов с кнопками
- объявили две переменные: VAR_mode_SHOW=1 (режим вывода времени) и VAR_mode_SET=0 (без установки времени)
- в функции setup(): указали выводам с кнопками работать как вход, инициировали модули LCD и RTC, включили подсветку дисплея
- в функции loop(): циклически выполняем следующую последовательность:
- каждую секунду выводим текст «iArduino»
- каждую секунду, если переменная VAR_mode_SHOW равна 1, то выводим время: lcd.print(time.gettime(«H:i:s»));
- каждую секунду, если переменная VAR_mode_SHOW равна 2, то выводим дату: lcd.print(time.gettime(«d-m-Y D»));
- каждую секунду, приостанавливаем выполнение на 1мс
- при каждом цикле вызываем функцию Func_buttons_control(); которая следит за нажатием кнопок
- если VAR_mode_SET больше 0, то мигаем устанавливаемым параметром time.blinktime(VAR_mode_SET);
- проверяем не находимся ли мы в режиме установки даты/времени
- в любом случае проверяем не нажаты ли кнопки: if(digitalRead(PIN_button_. ))
- если кнопки нажаты, то ждем пока они не будут отпущены: while(digitalRead(PIN_button_. ))
- после того как кнопка была отпущена, выполняем действия связанные с её предназначением в текущем режиме
Ссылки:
- Код программы.
- Библиотека iarduino_RTC.
- Библиотека LiquidCrystal_I2C_V112.
- Wiki — Установка библиотек в Arduino IDE .
- WiKi — Работа с символьными ЖК дисплеями.
- Wiki — Часы реального времени, RTC (Trema-модуль) .
- Wiki — Trema Shield.
Часы реального времени RTC: руководство по использованию
Линейка часов реального времени поможет вашему устройству стать пунктуальным и выполнять задачи по расписанию. Часы высчитают время для подачи еды питомцу из автоматической кормушки, внесут в график переворачивания яиц в инкубаторе или зажгут ёлку на новый год.
Часы реального времени (RTC — англ. Real Time Clock) служат для получения текущей секунды, минуты, часа, дня, месяца и года без затрат ресурсов микроконтроллера. Модуль пригодиться для создания будильников, сигнализаций и снятия показаний с датчиков по графику.
Видеообзор
Обзор часов DS1307Z
Сердце часов — микросхема RTC DS1307Z, которая занимается подсчётом времени.
На плате также расположен слот для часовой батарейки размера CR1220 на 3 вольта. Благодаря дополнительному автономному питанию от таблетки, при отключении электропитания часы продолжат идти. Перед началом использования текущие дата и время устанавливаются единожды, а затем они могут быть прочитаны пока жива батарейка.
Плата с часами спроектирована в форм-факторе Trema-модулей — это унифицированный формат, который облегчает подключение датчика к внешним контроллерам, например Arduino или Raspberry Pi.
С подробностями разобрались, теперь можете смело переходить к подключению часов DS1307Z к контроллеру и примерам работы.
RTC DS3231 (Trema-модуль)
Сердце часов — микросхема RTC DS3231, которая занимается подсчётом времени.
На плате также расположен слот для часовой батарейки размера CR1220 на 3 вольта. Благодаря дополнительному автономному питанию от таблетки, при отключении электропитания часы продолжат идти. Перед началом использования текущие дата и время устанавливаются единожды, а затем они могут быть прочитаны пока жива батарейка.
Плата с часами спроектирована в форм-факторе Trema-модулей — это унифицированный формат, который облегчает подключение датчика к внешним контроллерам, например Arduino или Raspberry Pi.
С подробностями разобрались, теперь можете смело переходить к подключению часов DS3231 к контроллеру и примерам работы.
RTC RX8025 (Trema-модуль)
Сердце часов — микросхема RTC RX8025, которая занимается подсчётом времени.
На плате также расположен слот для часовой батарейки размера CR1220 на 3 вольта. Благодаря дополнительному автономному питанию от таблетки, при отключении электропитания часы продолжат идти. Перед началом использования текущие дата и время устанавливаются единожды, а затем они могут быть прочитаны пока жива батарейка.
Плата с часами спроектирована в форм-факторе Trema-модулей — это унифицированный формат, который облегчает подключение датчика к внешним контроллерам, например Arduino или Raspberry Pi.
С подробностями разобрались, теперь можете смело переходить к подключению часов RX8025 к контроллеру и примерам работы.
Подключение и настройка
Рассмотрим подключение различных модулей часов реального времени.
- RTC DS1307Z (Trema-модуль)
- RTC DS3231 (Trema-модуль)
- RTC RX8025 (Trema-модуль)
RTC DS1307Z (Trema-модуль)
Часы RTC DS1307Z подключается к управляющей электронике через группу из четырёх контактов.
Контакт Функция Подключение SDA Линия данных шины I²C Подключите к пину SDA микроконтроллера. SCL Линия тактирования шины I²C Подключите к пину SCL микроконтроллера. VCC Питание Подключите к питанию микроконтроллера. GND Земля Подключите к земле микроконтроллера. Что понадобится
- 1× RTC DS1307Z (Trema-модуль)
- 1× Arduino Uno
- 1× Соединительные провода «папа-мама»
- 1× Кабель USB (A — B)
Рекомендуем также обратить внимание на дополнительные платы расширения:
- Trema Shield поможет подключить модуль к Arduino с помощью аккуратного шлейфа.
- Trema Set Shield поможет подключить модуль к Arduino без проводов вовсе.
Схема устройства
Схема устройства с Trema Shield
Схема устройства с Trema Set Shield
Программная настройка
- Настройте плату Arduino Uno в среде Arduino IDE.
- Скачайте и установите библиотеку iarduino_RTC . Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
- Переходите к примерам работы.
RTC DS3231 (Trema-модуль)
Часы RTC DS3231 подключается к управляющей электронике через группу из четырёх контактов.
Контакт Функция Подключение SDA Линия данных шины I²C Подключите к пину SDA микроконтроллера. SCL Линия тактирования шины I²C Подключите к пину SCL микроконтроллера. VCC Питание Подключите к питанию микроконтроллера. GND Земля Подключите к земле микроконтроллера. Что понадобится
- 1× RTC DS3231 (Trema-модуль)
- 1× Arduino Uno
- 1× Соединительные провода «папа-мама»
- 1× Кабель USB (A — B)
Рекомендуем также обратить внимание на дополнительные платы расширения:
- Trema Shield поможет подключить модуль к Arduino с помощью аккуратного шлейфа.
- Trema Set Shield поможет подключить модуль к Arduino без проводов вовсе.
Схема устройства
Схема устройства с Trema Shield
Схема устройства с Trema Set Shield
Программная настройка
- Настройте плату Arduino Uno в среде Arduino IDE.
- Скачайте и установите библиотеку iarduino_RTC . Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
- Переходите к примерам работы.
RX8025 (Trema-модуль)
Часы RTC RX8025 подключается к управляющей электронике через группу из четырёх контактов.
Контакт Функция Подключение SDA Линия данных шины I²C Подключите к пину SDA микроконтроллера. SCL Линия тактирования шины I²C Подключите к пину SCL микроконтроллера. VCC Питание Подключите к питанию микроконтроллера. GND Земля Подключите к земле микроконтроллера. Что понадобится
- 1× RTC RX8025 (Trema-модуль)
- 1× Arduino Uno
- 1× Соединительные провода «папа-мама»
- 1× Кабель USB (A — B)
Рекомендуем также обратить внимание на дополнительные платы расширения:
- Trema Shield поможет подключить модуль к Arduino с помощью аккуратного шлейфа.
- Trema Set Shield поможет подключить модуль к Arduino без проводов вовсе.
Схема устройства
Схема устройства с Trema Shield
Схема устройства с Trema Set Shield
Программная настройка
- Настройте плату Arduino Uno в среде Arduino IDE.
- Скачайте и установите библиотеку iarduino_RTC . Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
- Переходите к примерам работы.
Примеры работы
В зависимости от модели часов RTC, используйте соответствующий объект в конструкторе. Весь остальной код подойдёт для всех чипов.
- RTC DS1307Z (Trema-модуль)
- RTC DS3231 (Trema-модуль)
- RTC RX8025 (Trema-модуль)
RTC DS1307Z (Trema-модуль)
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307);
RTC DS3231 (Trema-модуль)
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS3231 iarduino_RTC watch(RTC_DS3231);
RTC RX8025 (Trema-модуль)
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_RX8025 iarduino_RTC watch(RTC_RX8025);
Установка времени
Для начала установим дату и время в RTC-модуль.
Исходный код
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307); // В параметрах указываем тип микросхемы — RTC_DS3231 // iarduino_RTC watch(RTC_DS3231); // В параметрах указываем тип микросхемы — RTC_RX8025 // iarduino_RTC watch(RTC_RX8025); void setup() < // Открываем Serial-порт Serial.begin(9600); // Инициализируем работу с RTC-модулем watch.begin(); // Устанавливаем время в модуль: 12:30:00 25 октября 2022 года // 00 сек, 30 мин, 12 час, 25 число, октябрь, 2022 год, вторник watch.settime(0, 30, 12, 25, 10, 22, 2); >void loop() < // Если прошла одна секунда if (millis() % 1000 == 0) < // Выводим временную отметку одной строкой Serial.println(watch.gettime("d-m-Y, H:i:s, D")); >>
Результат работы
После прошивки устройства, в модуль запишется дата и время указанные в коде программы. Далее «часы затикают» и временная отметка будет выводится в консоль.
Обратите внимание на то, что повторная загрузка скетча, нажатие кнопки Reset на плате Arduino, закрытие и открытие монитора последовательного порта, отключение и подача питания, приведут к тому что код в теле функции setup() так же повторно выполнится и в RTC-модуль вновь запишется указанное время. Если вы не желаете повторной перезаписи времени, сразу после выполнения данного скетча, загрузите скетч вывода времени в котором нет функции settime() .
Установка времени автоматически
Время и дату также можно получить из компьютера при компиляции программы.
Исходный код
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307); // В параметрах указываем тип микросхемы — RTC_DS3231 // iarduino_RTC watch(RTC_DS3231); // В параметрах указываем тип микросхемы — RTC_RX8025 // iarduino_RTC watch(RTC_RX8025); void setup() < // Открываем Serial-порт Serial.begin(9600); // Инициализируем работу с RTC-модулем watch.begin(); // Устанавливаем время компиляции скетча: watch.settime(__TIMESTAMP__); >void loop() < // Если прошла одна секунда if (millis() % 1000 == 0) < // Выводим временную отметку одной строкой Serial.println(watch.gettime("d-m-Y, H:i:s, D")); >>
Результат работы
После прошивки устройства, в модуль запишется дата и время полученные из компьютера при компиляции программы. Далее «часы затикают» и временная отметка будет выводится в консоль.
В скетче использован препроцессорный макрос __TIMESTAMP__ который передаёт функции settime() строку вида: «Tue Oct 25 12:30:00 2022» . Вместо макроса можно использовать строку соблюдая последовательность указания временных меток через пробелы: три символа названия дня недели, три символа названия месяца, две цифры текущего дня в месяце, время в формате ЧЧ:ММ:СС и четыре цифры года.
Вывод времени строкой
Выведем время и дату в консоль одной текстовой строкой.
Исходный код
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307); // В параметрах указываем тип микросхемы — RTC_DS3231 // iarduino_RTC watch(RTC_DS3231); // В параметрах указываем тип микросхемы — RTC_RX8025 // iarduino_RTC watch(RTC_RX8025); void setup() < // Открываем Serial-порт Serial.begin(9600); // Инициируем работу с RTC-модулем watch.begin(); >void loop() < // Если прошла одна секунда if (millis() % 1000 == 0) < // Выводим время одной строкой согласно указанному шаблону Serial.println(watch.gettime("d-m-Y, H:i:s, D")); >>
Результат работы
После прошивки устройства, «часы затикают» и временная отметка будет выводится в консоль.
Вывод времени числами
Выведем время и дату в консоль через целочисленные переменные.
Исходный код
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307); // В параметрах указываем тип микросхемы — RTC_DS3231 // iarduino_RTC watch(RTC_DS3231); // В параметрах указываем тип микросхемы — RTC_RX8025 // iarduino_RTC watch(RTC_RX8025); // Объявляем переменные для получения значений: // day - день, mon - месяц, year - год, // hour - часы, min - минуты, sec - секунды, week - день недели uint8_t day, month, year, hour, minute, second, week; void setup() < // Открываем Serial-порт Serial.begin(9600); // Инициируем работу с RTC-модулем watch.begin(); >void loop() < // Если прошла одна секунда if (millis() % 1000 == 0) < // Считываем текущее время из модуля в буфер библиотеки. watch.gettime(); // Получаем из буфера библиотеки → текущий день месяца: от 1 до 31 day = watch.day; // Получаем из буфера библиотеки → текущий месяц: от 1 до 12 month = watch.month; // Получаем из буфера библиотеки → текущий год: от 0 до 99 (от 2000 до 2099) year = watch.year; // Получаем из буфера библиотеки → текущие часы: от 0 до 23 hour = watch.Hours; // Получаем из буфера библиотеки → текущие минуты: от 0 до 59 minute = watch.minutes; // Получаем из буфера библиотеки → текущие секунды: от 0 до 59 second = watch.seconds; // Получаем из буфера библиотеки → текущий день недели: от 0 до 6 (0-ВС, 1-ПН. 6-СБ) week = watch.weekday; // Выводим временную отметку через целочисленные переменные Serial.print(day); Serial.print("-"); Serial.print(month); Serial.print("-"); Serial.print(year); Serial.print(", "); Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.print(second); Serial.print(", "); Serial.println(week); >>
Результат работы
После прошивки устройства, «часы затикают» и временная отметка будет выводится в консоль.
Будильник
Не засиделся ли ты за компьютером, может завтра на работу? Заведём будильник на 7:00 утра в будний день.
Исходный код
// Подключаем библиотеку для работы с RTC #include // Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307); // В параметрах указываем тип микросхемы — RTC_DS3231 // iarduino_RTC watch(RTC_DS3231); // В параметрах указываем тип микросхемы — RTC_RX8025 // iarduino_RTC watch(RTC_RX8025); void setup() < // Открываем Serial-порт Serial.begin(9600); // Инициируем работу с RTC-модулем watch.begin(); >void loop() < // Если прошла одна секунда if (millis() % 1000 == 0) < // Выводим временную отметку одной строкой Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // Если на часах 7 утра в будний день if (watch.Hours == 7 && watch.minutes == 0 && watch.seconds == 0 && watch.weekday!=0 && watch.weekday != 6) < // Выводим сообщение: «07:00 пора на работу!» Serial.println("07:00 пора на работу!"); >> >
Результат работы
После прошивки устройства, «часы затикают» и временная отметка будет выводится в консоль. А при достижении 7:00 по будням, сработает будильник с призывом идти на работу.
Библиотека для Arduino
Для работы с линейкой часов реального времени с контроллерами Arduino мы разработали библиотеку iarduino_RTC.
Поддерживаемые модели
- RTC DS1307Z
- RTC DS3231
- RTC DS1307Z (Trema-модуль)
- RTC DS3231 (Trema-модуль)
- RTC RX8025 (Trema-модуль)
Установка
Для старта скачайте и установите библиотеку iarduino_RTC. Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
Подключение
- Назначение: подключение библиотеки.
- Синтаксис: #include
- Примечания:
- Библиотека подключается в самом начале программы.
- Подключение библиотеки обязательное действие, иначе функции работать не будут.
// Подключаем библиотеку для работы с RTC-модулем #include
Конструктор
- Назначение: создание объекта для работы с функциями библиотеки iarduino_RTC .
- Синтаксис: iarduino_RTC watch(uint8_t chipRTC, uint8_t pinSS, uint8_t pinSCK, uint8_t pinMOSI)
- Параметры:
- chipRTC : модель выбранных часов реального времени.
- RTC_DS1302 : указывайте для часов на базе чипа DS1302. Обмен данными будет на шине SPI.
- RTC_DS1307Z : указывайте для часов на базе чипа DS1307Z. Обмен данными будет на шине I²C.
- RTC_DS3231 : указывайте для часов на базе чипа DS3231. Обмен данными будет на шине I²C.
- RTC_RX8025 : указывайте для часов на базе чипа RX8025. Обмен данными будет на шине I²C.
- pinSS : пин выбора устройства на шине SPI. Параметр необходимо указывать, только для устройств на шине SPI, в нашем случае при создании объекта модели DS1302 .
- pinSCK : тактовый сигнал на шине SPI. Параметр необходимо указывать, только для устройств на шине SPI, в нашем случае при создании объекта модели DS1302 .
- pinMOSI : пин выходных данных на шине SPI. Параметр необходимо указывать, только для устройств на шине SPI, в нашем случае при создании объекта модели DS1302 .
- Конструктор вызывается в самом начале программы.
- Вызов конструктора обязателен, иначе функции работать не будут.
- Для часов на базе микросхем DS1307 , DS3231 и RX8025 — указывать дополнительные сигнальные пины не нужно.
При использовании RTC-модуля на микросхеме DS1302
// Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1302 const int pinSS = 10; const int pinSCK = 13; const int pinMOSI = 11; iarduino_RTC watch(RTC_DS1302, pinSS, pinSCK, pinMOSI);
При использовании RTC-модуля на микросхеме DS1307Z
// Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS1307 iarduino_RTC watch(RTC_DS1307);
При использовании RTC-модуля на микросхеме DS3231
// Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_DS3231 iarduino_RTC watch(RTC_DS3231);
При использовании RTC-модуля на микросхеме RX8025
// Создаём объект watch для работы с функциями библиотеки iarduino_RTC // В параметрах указываем тип микросхемы — RTC_RX8025 iarduino_RTC watch(RTC_RX8025);
Функция begin()
- Назначение: инициализация работы с модулем.
- Синтаксис: void begin()
- Параметры: нет
- Возвращаемое значение: нет
- Примечания:
- Вызов функции begin() обязателен, иначе часы работать не будут.
- Функция begin() достаточно вызвать один раз.
// Инициируем работу с RTC-модулем watch.begin();
Функция settime()
В библиотеке доступны две перегруженных функции settime() :
- Функция settime() с указанием даты и времени числами
- Функция settime() с указанием даты и времени строкой
Функция settime() с указанием даты и времени числами
- Назначение: установка даты и времени.
- Синтаксис: void settime(int second, int minute, int hour, int day, int month, int year, int weekday)
- Параметры:
- second : секунды. Доступный диапазон значений от 0 до 59 .
- minute : минуты. Доступный диапазон значений от 0 до 59 . Если параметр устанавливать не нужно, указывайте значение -1 .
- hour : часы. Доступный диапазон значений от 0 до 23 . Если параметр устанавливать не нужно, указывайте значение -1 .
- day : число. Доступный диапазон значений от 1 до 31 . Если параметр устанавливать не нужно, указывайте значение -1 .
- month : месяц. Доступный диапазон значений от 1 до 12 . Если параметр устанавливать не нужно, указывайте значение -1 .
- year : год без учёта века. Доступный диапазон значений от 1 до 99 . Если параметр устанавливать не нужно, указывайте значение -1 .
- weekday : день недели. Доступный диапазон от 0 до 6 , где 0 ВС, 1 ПН . 6 СБ. Если параметр устанавливать не нужно, указывайте значение -1 .
- Все параметры, кроме second , можно не указывать.
- Если параметр устанавливать не нужно, указывайте значение -1 . Подходит для всех параметров, кроме second .
- Время и дату также можно указать одной строкой или установить через количество секунд прошедших с начала эпохи Unix с помощью функции settimeUnix() .
// Устанавливаем временную отметку в модуль: 12:30:00 25 октября 2022 года Вторник // 00 сек, 30 мин, 12 час, 25 число, октябрь, 2022 год, вторник watch.settime(0, 30, 12, 25, 10, 22, 1);
// Устанавливаем временную отметку в модуль: 12:30:00 watch.settime(0, 30, 12); // Равносильная запись watch.settime(0, 30, 12, -1, -1, -1, -1);
// Устанавливаем временную отметку в модуль: 25 октября 2022 года watch.settime(-1, -1, -1, 25, 10, 22); // Равносильная запись watch.settime(-1, -1, -1, 25, 10, 22, -1);
// Устанавливаем временную отметку в модуль: 25 октября 2022 года Вторник watch.settime(-1, -1, -1, 25, 10, 22, 1);
Функция settime() с указанием даты и времени строкой
- Назначение: установка даты и времени.
- Синтаксис:
- void settime(String time)
- void settime(const char* time)
- time : Строка устанавливаемого времени в формате «Www Mmm DD HH:MM:SS YYYY»
- Www : Сокращённое название дня недели (анг.) указывается тремя символами
( Sun =Вс, Mon =Пн, Tue =Вт, Wed =Ср, Thu =Чт, Fri =Пт, Sat =Сб) - Mmm : Сокращённое название месяца (анг.) указывается тремя символами
( Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec ) - DD : День месяца, указывается двумя цифрами от 01 до 31 .
- HH:MM:SS : Время в 24 часовом формате от 00:00:00 до 23:59:59 .
- YYYY : Год, указывается четырьмя цифрами от 0000 до 9999 .
- В качестве параметра можно использовать препроцессорным макрос __TIMESTAMP__ , который возвращает строку описанного выше формата с указанием даты и времени последней компиляции скетча.
- Время и дату также можно указать числами или установить через количество секунд прошедших с начала эпохи Unix с помощью функции settimeUnix() .
// Устанавливаем временную отметку в модуль: Вторник 25 октября 2022 года 12:30:00 watch.settime("Tue Oct 25 12:30:00 2022");
// Устанавливаем в модуль текущее время с компьютера watch.settime(__TIMESTAMP__);
Функция gettime()
В библиотеке доступны две перегруженных функции gettime() :
- Функция gettime() без параметров
- Функция gettime() с параметром
Функция gettime() без параметров
- Назначение: чтение даты и времени.
- Синтаксис: void gettime()
- Параметры: нет
- Возвращаемое значение: нет
- Примечания:
- Функция обновляет значения приватных переменных: seconds , minutes , hours , Hours , midday , day , weekday , month , year и Unix . Подробности смотрите в описании конкретных переменных.
- Функцию gettime() можно вызывать с параметром time , тогда чтение даты и времени будет происходить по шаблону функции date из PHP. Подробности описаны в функции gettime() с параметром.
// Считываем текущее время из модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий день месяца day = watch.day; // Получаем из буфера библиотеки → текущий месяц month = watch.month; // Получаем из буфера библиотеки → текущий год year = watch.year; // Получаем из буфера библиотеки → текущие часы hour = watch.Hours; // Получаем из буфера библиотеки → текущие минуты minute = watch.minutes; // Получаем из буфера библиотеки → текущие секунды second = watch.seconds; // Получаем из буфера библиотеки → текущий день недели week = watch.weekday;
Функция gettime() с параметром
- Назначение: чтение даты и времени по шаблону функции date из PHP.
- Синтаксис:
- void gettime(String time)
- void gettime(const char* time)
- time — строка шаблон, по которой будет составлена возвращаемая строка.
- s : секунды от 00 до 59
- i : минуты от 00 до 59
- h : часы в 12-часовом формате от 00 до 12
- H : часы в 24-часовом формате от 00 до 24
- d : день месяца от 00 до 31
- w : день недели от 0 до 6 ( 0 -ВС, 1 -ПН, . , 6 -СБ )
- D : день недели в текстовом виде: Mon , Tue , Wed , Thu , Fri , Sat и Sun
- m : месяц от 01 до 12
- M : месяц в текстовом виде: Jan , Feb , Mar , Apr , May , Jun , May , Jul , Aug , Sep , Oct , Nov и Dec
- Y : год от 2000 до 2099
- y : год от 00 до 99
- a : полдень am или pm
- A : полдень AM или PM
- Строка time не должна превышать 50 символов.
- Функция не только возвращает время, но и обновляет значения приватных переменных: seconds , minutes , hours , Hours , midday , day , weekday , month , year и Unix .
- Функцию gettime() можно вызывать без параметра.
// Переменная для хранения временной метки String time; // Считываем текущее время в 24-формате в переменную time time = watch.gettime("H:i:s"); // Выведем полученные данные в консоль Serial.println(time); // Пример результата: 12:30:00
// Переменная для хранения временной метки String time; // Считываем текущее время в 12-формате в переменную time time = watch.gettime("h:i:s A"); // Выведем полученные данные в консоль Serial.println(time); // Пример результата: 12:30:00 PM
// Переменная для хранения временной метки String timestamp; // Считываем текущую временную метку в переменную timeStamp timeStamp = watch.gettime("d-m-Y, H:i:s, D"); // Выведем полученные данные в консоль Serial.println(timeStamp); // Пример результата: 25-10-2022, 12:30:00, Tue
// Выведем сразу текущую временную метку в консоль Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // 25-10-2022, 12:30:00, Tue
Функция blinktime()
- Назначение: мигание одним из значений времени при использовании функции gettime() с параметром.
- Синтаксис: void blinktime(uint8_t value, float frequency = 1)
- Параметры:
- value : параметр времени от 0 до 8 :
- 0 : не мигать.
- 1 : мигать секундами, параметр s .
- 2 : мигать минутами, параметр i
- 3 : мигать часами, параметр h или H .
- 4 : мигать числом в месяце, параметр d .
- 5 : мигать месяцем, параметр m или M .
- 6 : мигать годом, параметр y или Y .
- 7 : мигать днём недели, параметр w или D .
- 8 : мигать полднём, параметр a или A .
- Функция blinktime настраивает мигание параметров при использовании функции gettime() .
// Настраиваем мигание минутами с частотой 1 Гц (значение по умолчанию) watch.blinktime(2);
// Настраиваем мигание минутами с частотой 5 Гц watch.blinktime(2, 5);
Функция period()
- Назначение: установка периода обращения к RTC-модулю.
- Синтаксис: void period(uint8_t value)
- Параметры:
- value : отрезок времени, в течении которого к модулю может быть отправлен только один запрос. Доступный диапазон значений указывается в минутах от 0 до 255 . При значении 0 , вызов функции gettime() всегда генерирует запрос к модулю.
- Данная функция указывает функции gettime() откуда брать текущее время и дату: из модуля (не чаще заданного периода) или рассчитать в библиотеке (без обращения к модулю).
- Функция полезна, если шина передачи данных сильно нагружена другими устройствами.
// Устанавливаем период обращения к RTC-модулю в одну минуту // Если в течении одной минуты вызвать несколько функций gettime(): // Первый запрос → дата и время придут с модуля // Остальные запросы в течении минуты → дату и время высчитает библиотека watch.period(1);
Функция settimeUnix()
- Назначение: установка даты и времени в секундах с начала эпохи Unix.
- Синтаксис: void settimeUnix(uint32_t second)
- Параметры:
- second : количество секунд прошедшее с начала эпохи Unix.
- Начало эпохи Unix — это дата 01.01.1970 00:00:00 GMT.
- Так как количество секунд с начала эпохи Unix указывается по гринвичу и одинаково во всём мире, то перед установкой времени функцией settimeUnix() необходимо однократно указать требуемый часовой пояс функцией settimezone() .
- Время и дату также можно установить привычным способом с помощью функции settime() .
// Указываем часовой пояс UTC+3 watch.settimezone(3); // Устанавливаем временную отметку в модуль // 12:30:00 25 октября 2022 года UTC+3 (Москва) = 1666690200 секунд c начала эпохи Unix. watch.settimeUnix(1666690200);
Функция gettimeUnix()
- Назначение: чтение даты и времени в формате количества секунд прошедших с начала эпохи Unix.
- Синтаксис: uint32_t gettimeUnix()
- Параметры: нет
- Возвращаемое значение:
- second : количество секунд прошедшее с начала эпохи Unix.
- Начало эпохи Unix — это дата 01.01.1970 00:00:00 GMT.
- Так как количество секунд с начала эпохи Unix указывается по гринвичу и одинаково во всём мире, то перед получением времени функцией gettimeUnix() необходимо однократно указать используемый часовой пояс функцией settimezone() .
- Время и дату также можно получить привычным способом с помощью функции gettime() .
// Указываем используемый часовой пояс UTC+3 watch.settimezone(3); // Считываем текущее временную метку из модуля // в формате количества секунд прошедших с начала эпохи Unix timeUnix = watch.gettimeUnix(); // Выводим данные в консоль Serial.println(timeUnix);
Функция settimezone()
- Назначение: указание часового пояса для функций settimeUnix() и gettimeUnix() .
- Синтаксис: void settimezone(int8_t zone)
- Параметры:
- zone : часовой пояс от -12 до 12 включительно.
- Указанный часовой пояс используется только для расчёта количества секунд прошедших с начала эпохи Unix, указанных функцией settimeUnix() или считанных функцией gettimeUnix() , так как количество прошедших секунд определяется по гринвичу.
- Часовой пояс не сохраняется в модуле, но его достаточно однократно указать в теле функции setup() . Значение по умолчанию 0.
// Указываем используемый часовой пояс UTC-5 watch.settimezone(-5); // Выводим количество секунд прошедших с начала эпохи Unix Serial.println( watch.gettimeUnix() );
Переменная seconds
- Назначение: содержит количество секунд из модуля-RTC.
- Синтаксис: uint8_t seconds
- Доступные значения: от 0 до 59
- Примечания:
- Для обновления текущей переменой seconds , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущее кол-во секунд uint8_t seconds = watch.seconds; // Выводим данные в консоль Serial.println(seconds);
Переменная minutes
- Назначение: содержит количество минут из модуля-RTC.
- Синтаксис: uint8_t minutes
- Доступные значения: от 0 до 59
- Примечания:
- Для обновления текущей переменой minutes , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущее кол-во минут uint8_t minutes = watch.minutes; // Выводим данные в консоль Serial.println(minutes);
Переменная hours
- Назначение: содержит количество часов в 12-часовом формате из модуля-RTC.
- Синтаксис: uint8_t hours
- Доступные значения: от 1 до 12
- Примечания:
- Для обновления текущей переменой hours , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущее кол-во часов uint8_t hours12 = watch.hours; // Выводим данные в консоль Serial.println(hours12);
Переменная Hours
- Назначение: содержит количество часов в 24-часовом формате из модуля-RTC.
- Синтаксис: uint8_t Hours
- Доступные значения: от 0 до 23
- Примечания:
- Для обновления текущей переменой Hours , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущее кол-во часов uint8_t hours24 = watch.Hours; // Выводим данные в консоль Serial.println(hours24);
Переменная midday
- Назначение: содержит текущее состояние полдня: AM или PM.
- Синтаксис: uint8_t midday
- Доступные значения:
- 0 : AM (Ante Meridiem) — время до полудня. В переводе на 24-часовой формат с 00:00 до 11:59.
- 1 : PM (Post Meridiem) — время после полудня. В переводе на 24-часовой формат с 12:00 до 23:59.
- Для обновления текущей переменой midday , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущее состояние полудня uint8_t midday = watch.midday; // Выводим данные в консоль Serial.println(midday);
Переменная day
- Назначение: содержит день месяца из модуля-RTC.
- Синтаксис: uint8_t day
- Доступные значения: от 1 до 31
- Примечания:
- Для обновления текущей переменой day , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий день месяца uint8_t day = watch.day; // Выводим данные в консоль Serial.println(day);
Переменная weekday
- Назначение: содержит день недели из модуля-RTC.
- Синтаксис: uint8_t weekday
- Доступные значения:
- 0 : воскресенье
- 1 : понедельник
- 2 : вторник
- 3 : среда
- 4 : четверг
- 5 : пятница
- 6 : суббота
- Для обновления текущей переменой weekday , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий день месяца uint8_t weekday = watch.weekday; // Выводим данные в консоль Serial.println(weekday);
Переменная month
- Назначение: содержит месяц из модуля-RTC.
- Синтаксис: uint8_t month
- Доступные значения:
- 1 : январь
- 2 : февраль
- 3 : март
- 4 : апрель
- 5 : май
- 6 : июнь
- 7 : июль
- 8 : август
- 9 : сентябрь
- 10 : октябрь
- 11 : ноябрь
- 12 : декабрь
- Для обновления текущей переменой month , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий месяц uint8_t month = watch.month; // Выводим данные в консоль Serial.println(month);
Переменная year
- Назначение: содержит день недели из модуля-RTC.
- Синтаксис: uint8_t weekday
- Доступные значения:
- 0 : воскресенье
- 1 : понедельник
- 2 : вторник
- 3 : среда
- 4 : четверг
- 5 : пятница
- 6 : суббота
- Для обновления текущей переменой weekday , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий день месяца uint8_t weekday = watch.weekday; // Выводим данные в консоль Serial.println(weekday);
Переменная month
- Назначение: содержит месяц из модуля-RTC.
- Синтаксис: uint8_t month
- Доступные значения:
- 1 : январь
- 2 : февраль
- 3 : март
- 4 : апрель
- 5 : май
- 6 : июнь
- 7 : июль
- 8 : август
- 9 : сентябрь
- 10 : октябрь
- 11 : ноябрь
- 12 : декабрь
- Для обновления текущей переменой month , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий месяц uint8_t month = watch.month; // Выводим данные в консоль Serial.println(month);
Переменная year
- Назначение: содержит год без учёта века из модуля-RTC.
- Синтаксис: uint8_t year
- Доступные значения: от 0 до 99
- Примечания:
- Для обновления текущей переменой year , сначала необходимо вызвать функцию gettime() .
// Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущий год uint8_t year = watch.year; // Выводим данные в консоль Serial.println(year);
Переменная Unix
- Назначение: содержит секунды с начала эпохи Unix из модуля-RTC.
- Синтаксис: uint32_t Unix
- Доступные значения: от 0 до 4294967295
- Примечания:
- Для обновления текущей переменой Unix , сначала необходимо вызвать функцию gettime() .
- Начало эпохи Unix — это дата 01.01.1970 00:00:00 GMT.
- Так как количество секунд с начала эпохи Unix указывается по гринвичу и одинаково во всём мире, то перед обращением к функции gettime() необходимо однократно указать используемый часовой пояс функцией settimezone() .
// Указываем используемый часовой пояс UTC+3 watch.settimezone(3); // Считываем текущее время из RTC-модуля в буфер библиотеки watch.gettime(); // Получаем из буфера библиотеки → текущее количество секунд с начала эпохи Unix uint8_t unix = watch.Unix; // Выводим данные в консоль Serial.println(unix);
Ресурсы
Мы также рекомендуем к чтению ссылки на статьи, документации и другие вспомогательные материалы по часам реального времени.
Магазин
- RTC DS1307Z
- RTC DS3231
- RTC DS1307Z (Trema-модуль)
- RTC DS3231 (Trema-модуль)
- RTC RX8025 (Trema-модуль)
Библиотеки
- Библиотека для Arduino «iarduino_RTC».
- Как установить библиотеки для Arduino.
- Расширенные возможности библиотек для Arduino на шине I²C.
Файлы
- Datasheet на чип RTC DS1307Z
- Datasheet на чип RTC DS3231
- Datasheet на чип RTC RX8025
Часы на Ардуино без модуля RTC на LCD 1602
Если вы используете Arduino Mega, то на этой плате порты SDA и SCL для подключения дисплея расположены на 20 и 21 пине. У платы Arduino Nano распиновка такая же, как на Uno и LCD 1602 подключается к пинам A4 (SDA) и A5 (SCL). Будильник будет пищать в течении 1 минуты, чтобы его выключить можно нажать на кнопку, подключенную к 8 порту. После сборки электрической схемы загрузите в плату следующую программу.
Скетч. Часы на LCD 16×02 без модуля RTC
#include "Wire.h" // библиотека для протокола I2C #include "LiquidCrystal_I2C.h" // библиотека для LCD 16x02 LiquidCrystal_I2C LCD(0x27, 20, 2); // присваиваем имя дисплею // переменные для отсчета времени и будильника byte SEC = 0; byte MIN = 34; byte HOUR = 12; byte MIN_A = 35; byte HOUR_A = 12; unsigned long timer; // переменные для считывания нажатия на кнопки boolean button1WasUp = true; boolean button2WasUp = true; boolean button1IsUp; boolean button2IsUp; boolean alarm = true; byte c1, c2, c3, w, i; // значок будильника byte bell [8] = < 0b11000, 0b11110, 0b01100, 0b01000, 0b00000, 0b00000, 0b00000, 0b00000, >; void setup() < pinMode(9, INPUT_PULLUP); // подключаем тактовые кнопки pinMode(8, INPUT_PULLUP); pinMode(5, OUTPUT); // подключаем пьезопищалку LCD.init(); // инициализация дисплея LCD.backlight(); // включение подсветки LCD.createChar(1, bell); timer = millis(); > void loop() < // узнаем текущее состояние кнопки button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); // если кнопка 1 нажата, заходим в настройки (цикл while) if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) < SEC = 0; w = 1; >> button1WasUp = button1IsUp; // если кнопка 2 была нажата выключаем будильник if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) < alarm = false; >> button2WasUp = button2IsUp; // если прошло 1000 мс - прибавляем одну секунду if (millis() - timer > 1000) < timer = millis(); SEC++; // если прошло 59 секунд, прибавляем 1 минуту if (SEC > 59) < SEC = 0; MIN++; >// если прошло 59 минут, прибавляем 1 час if (MIN > 59) < MIN = 0; HOUR++; >if (HOUR > 23) < HOUR = 0; >// включение будильника в течении 1 минуты if (alarm == true && HOUR == HOUR_A && MIN == MIN_A && i < 60) < tone(5, 50); i++; > if (i >= 60) < noTone(5); alarm == false; i = 0; > if (HOUR < 10) < c1 = 5; >if (HOUR >= 10) < c1 = 4; >if (MIN < 10) < c2 = 8; >if (MIN >= 10) < c2 = 7; >if (SEC < 10) < c3 = 11; >if (SEC >= 10) < c3 = 10; >// выводим время на дисплей LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("0"); LCD.setCursor(c3, 0); LCD.print(SEC); if (alarm == true) < LCD.print(char(1)); > if (alarm == false) < LCD.print(" "); > noTone(5); > while (w == 1) < if (HOUR > 23) < HOUR = 0; >if (HOUR < 10) < c1 = 5; >if (HOUR >= 10) < c1 = 4; >if (MIN < 10) < c2 = 8; >if (MIN >= 10) < c2 = 7; >LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) < LCD.print(char(1)); > if (alarm == false) < LCD.print(" "); > LCD.setCursor(2, 1); LCD.print("HOUR SETTING"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); // если кнопка 1 была нажата, заходим во 2 цикл while if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) < LCD.clear(); w = 2; > > button1WasUp = button1IsUp; // если кнопка 2 была нажата, прибавляем 1 час if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) < HOUR++; >> button2WasUp = button2IsUp; > while (w == 2) < if (MIN > 59) < MIN = 0;>if (HOUR < 10) < c1 = 5; > if (HOUR >= 10) < c1 = 4; >if (MIN < 10) < c2 = 8; >if (MIN >= 10) < c2 = 7; >LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) < LCD.print(char(1)); > if (alarm == false) < LCD.print(" "); > LCD.setCursor(1, 1); LCD.print("MINUTE SETTING"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); // если кнопка 1 была нажата, заходим в 3 цикл while if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) < LCD.clear(); w = 3; > > button1WasUp = button1IsUp; // если кнопка 2 была нажата, прибавляем 1 минуту if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) < MIN++; >> button2WasUp = button2IsUp; > while (w == 3) < if (MIN_A > 59) < MIN_A = 0; HOUR_A++; >if (HOUR_A > 23) < HOUR_A = 0; >if (HOUR_A < 10) < c1 = 5; >if (HOUR_A >= 10) < c1 = 4; >if (MIN_A < 10) < c2 = 8; >if (MIN_A >= 10) < c2 = 7; >LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR_A); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN_A); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) < LCD.print(char(1)); LCD.setCursor(4, 1); LCD.print("ALARM ON "); > if (alarm == false) < LCD.print(" "); LCD.setCursor(4, 1); LCD.print("ALARM OFF"); > button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); // если кнопка 1 была нажата, заходим в 4 цикл while if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) < LCD.clear(); w = 4; > > button1WasUp = button1IsUp; // если кнопка 2 была нажата, прибавляем 1 минуту if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) < alarm = !alarm; >> button2WasUp = button2IsUp; > while (w == 4) < if (MIN_A > 59) < MIN_A = 0; HOUR_A++; >if (HOUR_A > 23) < HOUR_A = 0; >if (HOUR_A < 10) < c1 = 5; >if (HOUR_A >= 10) < c1 = 4; >if (MIN_A < 10) < c2 = 8; >if (MIN_A >= 10) < c2 = 7; >LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR_A); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN_A); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) < LCD.print(char(1)); > if (alarm == false) < LCD.print(" "); > LCD.setCursor(1, 1); LCD.print("ALARM SET HOUR"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); // если кнопка 1 была нажата, заходим в 5 цикл while if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) < LCD.clear(); w = 5; > > button1WasUp = button1IsUp; // если кнопка 2 была нажата, прибавляем 1 час if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) < HOUR_A++; >> button2WasUp = button2IsUp; > while (w == 5) < if (MIN_A > 59) < MIN_A = 0; HOUR_A++; >if (HOUR_A > 23) < HOUR_A = 0; >if (HOUR_A < 10) < c1 = 5; >if (HOUR_A >= 10) < c1 = 4; >if (MIN_A < 10) < c2 = 8; >if (MIN_A >= 10) < c2 = 7; >LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR_A); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN_A); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) < LCD.print(char(1)); > if (alarm == false) < LCD.print(" "); > LCD.setCursor(0, 1); LCD.print("ALARM SET MINUTE"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); // если кнопка 1 была нажата, выходим из цикла if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) < LCD.clear(); w = 0; > > button1WasUp = button1IsUp; // если кнопка 2 была нажата, прибавляем 1 минуту if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) < MIN_A++; >> button2WasUp = button2IsUp; > >
Пояснения к коду:
- переменные c1 и c2 отвечают за позицию курсора при выводе времени и минут на экране, в зависимости от того — двухзначное или однозначное число хранится в переменной (это сделано для удобства вывода информации);
- во время настройки часов и будильника, таймер останавливается.
Заключение. Часы без модуля RTC ds1302 будут сбрасывать время на начальные значения при отключении питания, поэтому в проект были добавлены кнопки. С помощью них можно настроить часы, без необходимости повторной загрузки скетча — получился простой проект на Ардуино для начинающих программировать. Также можно добавить датчик DHT11 или BMP180, чтобы выводить на экране температуру.
- value : параметр времени от 0 до 8 :
- Www : Сокращённое название дня недели (анг.) указывается тремя символами
- chipRTC : модель выбранных часов реального времени.