Как подключить часы реального времени к ардуино
Перейти к содержимому

Как подключить часы реального времени к ардуино

  • автор:

Подключение 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.

Схема подключения RTC к Arduino Uno

Код программы:

При подключении библиотеки «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 Guide Annotation 1

      Сердце часов — микросхема RTC DS1307Z, которая занимается подсчётом времени.

      На плате также расположен слот для часовой батарейки размера CR1220 на 3 вольта. Благодаря дополнительному автономному питанию от таблетки, при отключении электропитания часы продолжат идти. Перед началом использования текущие дата и время устанавливаются единожды, а затем они могут быть прочитаны пока жива батарейка.

      Плата с часами спроектирована в форм-факторе Trema-модулей — это унифицированный формат, который облегчает подключение датчика к внешним контроллерам, например Arduino или Raspberry Pi.

      С подробностями разобрались, теперь можете смело переходить к подключению часов DS1307Z к контроллеру и примерам работы.

      RTC DS3231 (Trema-модуль)

      RTC Guide Annotation 2

      Сердце часов — микросхема RTC DS3231, которая занимается подсчётом времени.

      На плате также расположен слот для часовой батарейки размера CR1220 на 3 вольта. Благодаря дополнительному автономному питанию от таблетки, при отключении электропитания часы продолжат идти. Перед началом использования текущие дата и время устанавливаются единожды, а затем они могут быть прочитаны пока жива батарейка.

      Плата с часами спроектирована в форм-факторе Trema-модулей — это унифицированный формат, который облегчает подключение датчика к внешним контроллерам, например Arduino или Raspberry Pi.

      С подробностями разобрались, теперь можете смело переходить к подключению часов DS3231 к контроллеру и примерам работы.

      RTC RX8025 (Trema-модуль)

      RTC Guide Annotation 3

      Сердце часов — микросхема 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 без проводов вовсе.

      Схема устройства

      RTC Guide Wiring 1.1

      Схема устройства с Trema Shield

      RTC Guide Wiring 1.2

      Схема устройства с Trema Set Shield

      RTC Guide Wiring 1.3

      Программная настройка

      1. Настройте плату Arduino Uno в среде Arduino IDE.
      2. Скачайте и установите библиотеку iarduino_RTC . Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
      3. Переходите к примерам работы.

      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 без проводов вовсе.

      Схема устройства

      RTC Guide Wiring 2.1

      Схема устройства с Trema Shield

      RTC Guide Wiring 2.2

      Схема устройства с Trema Set Shield

      RTC Guide Wiring 2.3

      Программная настройка

      1. Настройте плату Arduino Uno в среде Arduino IDE.
      2. Скачайте и установите библиотеку iarduino_RTC . Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
      3. Переходите к примерам работы.

      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 без проводов вовсе.

      Схема устройства

      RTC Guide Wiring 3.1

      Схема устройства с Trema Shield

      RTC Guide Wiring 3.2

      Схема устройства с Trema Set Shield

      RTC Guide Wiring 3.3

      Программная настройка

      1. Настройте плату Arduino Uno в среде Arduino IDE.
      2. Скачайте и установите библиотеку iarduino_RTC . Для инсталляции рекомендуем использовать нашу инструкцию по установке библиотек для Arduino.
      3. Переходите к примерам работы.

      Примеры работы

      В зависимости от модели часов 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

                                                            Часы на Ардуино без модуля 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; > >
                                                            Пояснения к коду:
                                                            1. переменные c1 и c2 отвечают за позицию курсора при выводе времени и минут на экране, в зависимости от того — двухзначное или однозначное число хранится в переменной (это сделано для удобства вывода информации);
                                                            2. во время настройки часов и будильника, таймер останавливается.

                                                            Заключение. Часы без модуля RTC ds1302 будут сбрасывать время на начальные значения при отключении питания, поэтому в проект были добавлены кнопки. С помощью них можно настроить часы, без необходимости повторной загрузки скетча — получился простой проект на Ардуино для начинающих программировать. Также можно добавить датчик DHT11 или BMP180, чтобы выводить на экране температуру.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *