Перейти к содержимому

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

  • автор:

Подключение 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 запрос на получение времени // ответом на все остальные запросы будет результат последнего полученного от модуля времени + время прошедшее с этого запроса

Часы реального времени

В данной статье рассматривается пример создания часов рального времени. На индикатор будет выводиться точное время, а двоеточие на нем будет моргать раз в секунду. Точное время будет автоматически устанавливаться во вермя компиляции прошивки.

Описание компонентов

В нашем проекте мы используем:

Часы реального времени

Мы используем модуль с часами реального времени от Seeed Studio. Они построены на базе микросхемы DS1307 от Maxim Integrated. Из элементов обвязки она требует три резистора, часовой кварц и батарейку, которые уже имеются на данном модуле. Модуль обладает следующими свойствами:

Подсчет времени (секунды, минуты, часы), даты (год, месяц, число), дня недели
Двухпроводной интерфейс I²C

Суть часов реального времени в том, что при наличии батарейки, они могут идти даже если основное устройство обесточено. Мы с такими часами сталкиваемся постоянно в ноутбуках или цифровых фотоаппаратах. Если достать из этих устройств аккумулятор, а через некоторое время вернуть их обратно, то время не сбросится. В этом заслуга часов реального времени, Real Time Clock (RTC).

Все необходимые библиотеки можно скачать с официального сайта.

Индикатор

Мы используем четырёхразрядный индикатор от Seeed Studio. Основное в индикаторе — микросхема TM1637, представляющая собой драйвер для отдельных 7-сегментных разрядов. В данном модуле используется 4 разряда. Модуль обладает следующими свойствами:

8 градаций яркости
Двухпроводной интерфейс работы (CLK, DIO)

Данный модуль мы используем для показа времени: часов и минут. Удобство модуля в том, что подключается он всего по двум проводам и не требует программной реализации динамической индикации, поскольку все уже реализовано внутри модуля.

Динамическая индикация — это процесс, при котором индикаторы в нашем модуле загораются последовательно. Но мерцания мы не видим, поскольку человеческой глаз обладает большой инертностью. Данный метод позволяет очень хорошо экономить количество соединений между индикаторами и контроллером:

Статическая индикация: 4 цифры × 7 сегментов = 28 соединений.
Динамическая индикация: 7 сегментов + 4 общих анода или катода = 11 соединений.
Микросхема TM1637: 2 соединения.

Библиотека для данного модуля также может быть скачана с сайта производителя.

Подключение

Модуль часов реального времени необходимо подключить к выводам SCL/SDA, относящимся к шине I²C. Также необходимо подключить линии питания (Vcc) и земли (GND).

Линии SDA/SCL имеют собственные отдельные пины на Arduino, однако внутри они так или иначе подключены к пинам общего назначения. Если рассмотреть Arduino Uno, линии SDA соответствует пин A4, а SCL — A5.

В комплекте с модулем поставляется шлейф с мама-контактами, которые удобнее подключать к Troyka Shield. Однако отдельные пины SDA и SCL на ней не выведены, поэтому мы осуществили подключение прямо через пины A5 и A4.

В плане подключения индикатора — все гораздо проще. Выводы CLK и DIO можно подключить к любым цифровым выводам. В данном случае используются 12-й и 11-й выводы соответственно.

Написание прошивки

Функция setup должна инициализировать часы реального времени и индикатор, а также записывать время компиляции во внутреннюю память часов реального времени. Все действие, а точнее, чтение времени из RTC и вывод его на индикатор, будет производиться в функции loop .

Код для этого выглядит следующим образом:

#include #include #include "TM1637.h" #include "DS1307.h" //Массив, содержащий время компиляции char compileTime[] = __TIME__; //Номера пинов Arduino, к которым подключается индикатор #define DISPLAY_CLK_PIN 12 #define DISPLAY_DIO_PIN 13 //Для работы с микросхемой часов и индикатором мы используем библиотеки //Классы TM1637 и DS1307 объявлены именно в них TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); DS1307 clock; void setup() { //Включаем и настраиваем индикатор display.set(); display.init(); //Запускаем часы реального времени clock.begin(); //Получаем число из строки, зная номер первого символа byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 3); byte second = getInt(compileTime, 6); //Готовим для записи в RTC часы, минуты, секунды clock.fillByHMS(hour, minute, second); //Записываем эти данные во внутреннюю память часов. //С этого момента они начинают считать нужное для нас время clock.setTime(); } void loop() { //Значения для отображения на каждом из 4 разрядов int8_t timeDisp[4]; //Запрашиваем время с часов clock.getTime(); //Получаем десятки часов с помощью целочисленного деления timeDisp[0] = clock.hour / 10; //Получаем единицы часов с помощью остатка от деления timeDisp[1] = clock.hour % 10; //Проделываем то же самое с минутами timeDisp[2] = clock.minute / 10; timeDisp[3] = clock.minute % 10; //. а затем выводим его на экран display.display(timeDisp); //у нас нет отдельных разрядов для секунд, поэтому //будем включать и выключать двоеточие каждую секунду display.point(clock.second % 2 ? POINT_ON : POINT_OFF); } //Содержимое функции объяснено ниже char getInt(const char* string, int startIndex) { return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0'; }

Теперь загружаем этот код в среду разработки, компилируем и заливаем. Смотрим на дисплей — бинго! Время на дисплее — время компиляции.

Объяснение функции getInt

Для начала необходимо понять, откуда же в массиве compileTime появляется время. Оно появляется в этой строчке:

unsigned char compileTime[] = __TIME__;

Компилятор вместо __TIME__ подставляет строку, содержащую время компиляции в виде __TIME__ = «hh:mm:ss» , где hh — часы, mm — минуты, ss — секунды.

Вернемся к коду, который необходимо объяснить:

char getInt(const char* string, int startIndex) { return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0'; }

В массиве string , передаваемом в качестве параметра в функцию getInt , мы получаем символ с индексом startIndex и следующий за ним, чтобы в итоге получить двухзначное целое число. Однако, изначально это не число, а пара символов. Чтобы получить число по символу, нам необходимо вычесть из этого символа символ нуля ( ‘0 ‘): ведь в таблице ASCII все символы цифр идут одна за другой, начиная с символа нуля. Поэтому код int(string[startIndex]) — ‘0’) , дословно, делает следующее: «Берем символ номер startIndex , вычитаем из него символ нуля и переводим в целочисленный тип».

Проблемы

Да, этот код рабочий, и часы будут идти. Однако, если отключить питание, а через несколько минут включить, то после включения время время вновь станет тем, которое было при компиляции.

Это происходит потому что после включения питания, вновь исполняется код, находящийся в функции setup . А он записывает в часы реального времени старое значение времени.

Чтобы этого избежать, нам необходимо еще чуть-чуть модифицировать код. Каждый раз в функции setup будет происходить подсчет «хэша» времени компиляции — будет рассчитываться количество секунд, прошедшее с 00:00:00 до времени компиляции. И этот хэш будет сравниваться с хэшем в EEPROM. Напомним EEPROM — память, которая не обнуляется при отключении питания.

Если значения посчитанного и сохранённого ранее хэша совпадают, то это значит, что перезаписывать время в модуль часов нет необходимости: это уже было сделано. А вот если эта проверка не проходит, то происходит перезапись времени в RTC.

Для записи/чтения числа типа unsigned int в/из EEPROM написаны две дополнительные функции EEPROMWriteInt и EEPROMReadInt . Они добавлены потому что функции EEPROM.read и EEPROM.write могуть читать и писать только данные типа char .

#include #include #include "TM1637.h" #include "DS1307.h" //Массив, содержащий время компиляции char compileTime[] = __TIME__; //Номера пинов Arduino, к которым подключается индикатор #define DISPLAY_CLK_PIN 12 #define DISPLAY_DIO_PIN 13 //Для работы с микросхемой часов и индикатором мы используем библиотеки TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); DS1307 clock; void setup() { //Включаем и настраиваем индикатор display.set(); display.init(); //Запускаем часы реального времени clock.begin(); //Получаем число из строки, зная номер первого символа byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 3); byte second = getInt(compileTime, 6); //Импровизированный хэш времени //Содержит в себе количество секунд с начала дня unsigned int hash = hour * 60 * 60 + minute * 60 + second; //Проверяем несовпадение нового хэша с хэшем в EEPROM if (EEPROMReadInt(0) != hash) { //Сохраняем новый хэш EEPROMWriteInt(0, hash); //Готовим для записи в RTC часы, минуты, секунды clock.fillByHMS(hour, minute, second); //Записываем эти данные во внутреннюю память часов. //С этого момента они начинают считать нужное для нас время clock.setTime(); } } void loop() { //Значения для отображения на каждом из 4 разрядов int8_t timeDisp[4]; //Запрашиваем время с часов clock.getTime(); //Получаем десятки часов с помощью целочисленного деления timeDisp[0] = clock.hour / 10; //Получаем единицы часов с помощью остатка от деления timeDisp[1] = clock.hour % 10; //Проделываем то же самое с минутами timeDisp[2] = clock.minute / 10; timeDisp[3] = clock.minute % 10; //. а затем выводим его на экран display.display(timeDisp); //у нас нет отдельных разрядов для секунд, поэтому //будем включать и выключать двоеточие каждую секунду display.point(clock.second % 2 ? POINT_ON : POINT_OFF); } char getInt(const char* string, int startIndex) { return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0'; } //Запись двухбайтового числа в память void EEPROMWriteInt(int address, int value) { EEPROM.write(address, lowByte(value)); EEPROM.write(address + 1, highByte(value)); } //Чтение числа из памяти unsigned int EEPROMReadInt(int address)  byte lowByte = EEPROM.read(address); byte highByte = EEPROM.read(address + 1); return (highByte  8) 

Заключение

В данной статье был показан пример работы с микросхемой часов реального времени RTC DS1307 и микросхемой-драйвером индикатора TM1637, также мы научились получать дату и время на этапе компиляции. Теперь, если выставить нужное время на часах, а потом отключить питание хоть на несколько часов, то после включения время вновь будет точным. Проверено!

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 4.0 International

Производные работы должны содержать ссылку на http://wiki.amperka.ru, как на первоисточник, непосредственно перед содержимым работы.
Вики работает на суперском движке DokuWiki.

время/rtc-индикатор.txt · Последние изменения: 2019/06/06 14:32 — mik

Инструменты страницы

  • Показать исходный текст
  • История страницы
  • Ссылки сюда
  • Наверх

Урок 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.

      Arduino для начинающих. Урок 11. Подключение модуля часов реального времени DS3231

      Share Button

      Продолжаем серию уроков «Arduino для начинающих«. Знакомимся с модулем часов реального времени DS3231. В статье видео-инструкция, листинги программ, назначение и способы подключения к Arduino модулей из семейства DS.

      Arduino для начинающих. Урок 11. Подключение модуля часов реального времени DS3231

      Модуль часов реального времени DS3231

      Что такое модуль часов реального времени DS3231?

      Модуль часов реального времени — это электронная схема, предназначенная для учета хронометрических данных (текущее время, дата, день недели и др.), представляет собой систему из автономного источника питания и учитывающего устройства.

      Модуль DS3231 по сути представляет из себя обыкновенные часы. В платах Arduino уже есть встроенный датчик времени Millis, однако он работает только при поданном питании на плату. При отключении и дальнейшем включении Arduino отсчет времени Millis сбросится до нуля. А DS3231 имеет на борту батарейку, которая даже при отключенной плате Arduino продолжает «питать» модуль, позволяя ему измерять время.

      Модуль можно использовать в качестве часов или будильника, построенных на базе плат Arduino. Или же в качестве оповещения для различных систем, к примеру в «Умном доме».

      Технические характеристики DS3231:

      • модуль производит подсчет часов, минут, секунд, дат, месяцев, лет (високосные года учитываются до 2100 года);
      • для подключения к различным устройствам, часы подключаются по I2C интерфейсу.

      32К — Выход, частота 32 кГц.

      SQW — Программируемый выход Square-Wave сигнала.

      SCL – Через этот пин по интерфейсу I2C происходит обмен данными с часами.

      SDA – Через этот пин передаются данные с часов.

      VCC – Питание часов реального времени, нужно 5 вольт. Если на этот пин не поступает напряжение, часы переходят в спящий режим.

      GND — Земля.

      Схема подключения часов реального времени DS3231 и простейшая программа

      Пины SDA и SCL на разных платах Arduino:

      SDA SCL
      UNO A4 A5
      Mini A4 A5
      Nano A4 A5
      Mega2560 20 21
      Leonardo 2 3

      Arduino для начинающих. Урок 11. Подключение модуля часов реального времени DS3231

      Подключим модуль часов реального времени к Arduino UNO. SDA — пин A4, SCL — пин A5.

      Для работы модели подойдет следующая программа (программу вы можете просто скопировать в Arduino IDE):

      #include
      iarduino_RTC time(RTC_DS3231);
      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мс
      >
      >

      В данном скетче просто идет отсчет времени.

      В первую очередь в сктече подключение библиотеки iarduino_RTC.h.

      Там же укажите точное название своего модуля для корректной работы с ним.

      Дальше укажите задержку включения модуля в сравнении с включением самой платы и укажите скорость для работы с монитором порта.

      В итоге получаем вывод времени с модуля DS3231 в монитор порта. Идет вывод часов, минут, секунд.

      В следующем скетче добавим функцию settime, позволяющую установить начальное время отсчета.

      #include
      iarduino_RTC time(RTC_DS3231);
      void setup() delay(300);
      Serial.begin(9600);
      time.begin();
      time.settime(0,0,18,24,04,17,1); // 0 сек, 0 мин, 18 час, 24, апреля, 2017 года, понедельник
      >
      void loop() if(millis()%1000==0) < // если прошла 1 секунда
      Serial.println(time.gettime(«d-m-Y, H:i:s, D»)); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
      >
      >

      В примере время начинает отсчитываться с 0 сек, 0 мин, 18 час, 24, апреля, 2017 года, понедельник.

      Смотрите также:

      Посты по урокам:

      1. Первый урок: Светодиод.
      2. Второй урок: Кнопка.
      3. Третий урок: Потенциометр.
      4. Четвертый урок: Сервопривод.
      5. Пятый урок: Трехцветный светодиод.
      6. Шестой урок: Пьезоэлемент.
      7. Седьмой урок: Фоторезистор.
      8. Восьмой урок: Датчик движения (PIR) на Arduino. Автоматическая отправка E-mail.
      9. Девятый урок: Подключение датчика температуры и влажности DHT.
      10. Десятый урок: Подключение матричной клавиатуры и интересные схемы.

      Все посты сайта «Занимательная робототехника» по тегу Arduino.

      Не знаете, где купить Arduino? Все используемые в уроке комплектующие входят в большинство готовых комплектов Arduino, их также можно приобрести по отдельности. Подробная инструкция по выбору здесь. Низкие цены, спецпредложения и бесплатная доставка на сайтах AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазин Амперка. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Смотри также список магазинов.

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

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

https://narkolog.vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-knd.ru/