Итак, часы реального времени. Эта полезная штучка решает большинство полезных задач, связанных со временем. Допустим управление поливом в 5 часов утра на даче. Или включение и выключение освещения в определённый момент. По дате можно запускать отопление в каком-нибудь доме. Вещь достаточно интересная и полезная. А конкретно? Мы с вами рассмотрим часы реального времени DS1302 для популярной платформы Arduino.
Из этой статьи вы узнаете:
Доброго времени суток, уважаемые читатели блока kip-world! Как ваши дела? Напишите в комментариях, вы увлекаетесь робототехникой? Что значит для вас эта тема?
У меня ни на минуту не покидает мысль об этом. Я сплю и вижу, когда мы наконец — то придём к тому, что каждый сможет позволить себе купить персонального робота — помощника. Не важно, чем он будет заниматься, уборкой мусора, стрижкой газонов, мойкой автомобиля.
Я просто представляю себе, насколько сложные алгоритмы они должны содержать в своих «мозгах».
Ведь мы придём к тому, что мы будем так же прошивать ПО, как на персональных компах. Так же скачивать прикладные программы. Пришивать руки, ноги, менять клешни, манипуляторы.
Посмотрите фильмы «Я-робот», «Искусственный интеллект», «Звёздных воинов».
Японцы уже давно внедряют свои разработки. Чем мы хуже?? У нас очень слабая популярность. Я знаю немногих разработчиков. По пальцам пересчитать. Мы занимаемся другим. Мы перекупщики. Просто покупаем готовые наборчики, роботов — игрушек и всякую дребедень.
Почему не разрабатываем вот это:
Или вот это:
Я закончил свои размышления вслух. Давайте мы с вами поговорим о подключении Таймера часов реального времени DS1302 к Arduino.
Часы реального времени DS1302
Контроллер Arduino не имеет своих собственных часов. Поэтому в случае необходимости нужно дополнять специальной микросхемой DS1302.
По питанию эти платы могут использовать свой элемент питания, или запитываться непосредственно с платы Arduino.
Таблица распиновки:
Схема подключения c Arduino UNO:
Способ программирования Arduino для работы с DS1302
Обязательно нужно скачать действующую библиотеку из надёжных источников.
Библиотека позволяет считывать и записывать параметры реального времени. Небольшое описание я привожу ниже:
#include
iarduino_RTC ОБЪЕКТ (НАЗВАНИЕ [, ВЫВОД_RST [, ВЫВОД_CLK [, ВЫВОД_DAT ]]]);
// Создаём объект.
Функция begin (); // Инициализация работы RTC модуля.
Функция settime (СЕК [, МИН [, ЧАС [, ДЕНЬ [, МЕС [, ГОД [, ДН ]]]]]]); // Установка времени.
Функция gettime ([ СТРОКА ]); // Чтение времени.
функция blinktime (ПАРАМЕТР [ ЧАСТОТА ] ); // Заставляет функцию gettime «мигать» указанным параметром времени.
функция period (МИНУТЫ ); // Указывает минимальный период обращения к модулю в минутах.
Переменная 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.
Пишем простенькую программу. Установка текущего времени в RTC модуль (DS1302):
Arduino
#include
#include iarduino _ RTCtime (RTC_DS1302 , 6 , 7 , 8 ) ; 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 модуля (DS1302) и выводим в "Последовательный порт" :
#include
setTime(hour, min, sec);
Установка времени.
Параметры:
hour:
Часы (0-23)
min:
Минуты (0-59)
sec:
Секунды (0-59)
Пример:
rtc.setTime(23, 59, 59); // Установка времени 23:59:59
Примечание:
Установка времени сбрасывает флаг CH (Clock Halt).
setDate(date, mon, year);
Установка даты.
Параметры:
date:
День (1-31)
mon:
Месяц (1-12)
year
: Год (2000-2099)
Пример:
rtc.setDate(6, 8, 2015); // Установка даты 6 августа 2015г.
Примечание:
Защиты от ввода неправильной даты нет. Т.е., возможно ввести 31 февраля, но результат будет не предсказуем
setDOW(dow);
Установка дня недели.
Параметры:
dow:
День недели (1-7)
Пример:
rtc.setDOW(FRIDAY); // Установить день недели - Пятница
Примечание:
Устанавливаются от понедельника (1) до воскресенья (7).
getTimeStr();
Считать текущее время в виде строковой переменной.
Параметры
:
format:
<необязательный параметр>
FORMAT_LONG
"ЧЧ:ММ:СС" (По умолчанию)
FORMAT_SHORT
"ЧЧ:ММ"
Пример:
Serial.print(rtc.getTimeStr()); // Отправить текущее время через последовательный порт
getDateStr(]]);
Считать текущую дату в виде строковой переменной.
Параметры:
slformat:
<необязательный параметр>
FORMAT_LONG
Год из 4х цифр (ГГГГ) (По умолчанию)
FORMAT_SHORT
Год из 2х цифр (ГГ)
eformat:
<необязательный параметр>
FORMAT_LITTLEENDIAN
"ДД.ММ.ГГГГ" (По умолчанию)
FORMAT_BIGENDIAN
"ГГГГ.ММ.ДД"
FORMAT_MIDDLEENDIAN
"ММ.ДД.ГГГГ"
divider:
<необязательный параметр>
Символ для разделения. По умолчанию "."
Пример:
Serial.print(rtc.getDateStr()); // Отправить текущую дату через последовательный порт (В формате "ДД.ММ.ГГГГ")
getDOWStr();
Считать текущий день недели в виде строковой переменной.
Параметры:
format:
<необязательный параметр>
FORMAT_LONG
День недели на английском языке (По умолчанию)
FORMAT_SHORT
Сокращенное название дня недели на английском языке (3 символа)
Пример:
Serial.print(rtc.getDOWStr(FORMAT_SHORT)); // Отправить сокращенное название текущего дня недели через последовательный порт
getMonthStr();
Считать текущий месяц в виде строковой переменной.
Параметры:
format:
<необязательный параметр>
FORMAT_LONG
название месяца на английском языке (По умолчанию)
FORMAT_SHORT
Сокращенное название месяца на английском языке (3 символа)
Пример:
Serial.print(rtc.getMonthStr()); // Отправить название текущего месяца через последовательный порт
halt(value);
Управление флагом СН (запуск-останов часов).
Параметры:
value:
true:
Установить флаг CH
false:
очистить флаг CH
Пример:
rtc.halt (истина); // Установить флаг CH
Примечания:
Когда флаг установлен, тактовый генератор
останавливается и DS1302 находится в режиме ожидания с низким энергопотреблением с током менее 100nA. Если флаг сбрасывается, часы начинают отсчет времени.
writeProtect(enable);
Установка или сброс WP-бита.
Параметры:
enable:
true:
Установить WP-бит
false:
Сбросить WP бит
Пример:
rtc.writeProtect(false); // Сбросить WP-бит
Примечание:
WP: (Write-Protect) бит. Блокирует запись информации в DS1302
setTCR(value);
Установка режима trickle charge (заряд малым током).
Параметры:
value:
определенные литералы, обозначающие количество диодов и сопротивлений для зарядки.
Пример:
rtc.setTCR(TCR_D1R4K); // Задан режим trickle charge 1 диод и резистор сопротивлением 4кОм.
Примечание:
Литералы имеют вид TCR_DxRyK где х число диодов (1 или 2), а у - используемое сопротивление (2, 4 или 8 кОм). TCR_OFF отключает фунцию подзарядки.
writeBuffer(buffer);
Запись информации в ОЗУ DS1302.
Параметры:
buffer:
DS1302_RAM буфер
Пример:
rtc.writebuffer(ramBuffer); // Записать 31 байт из переменной ramBuffer в ОЗУ DS1302
readBuffer();
Чтение информации из ОЗУ DS1302.
Параметры:
Нет
Пример:
ramBuffer=rtc.readBuffer(); // Прочитать все 31 байт из ОЗУ DS1302 в переменную ramBuffer
poke(address, value);
Запись одного байта в ОЗУ DS1302.
Параметры:
address:
адрес для записи (0-30)
value:
число для записи по адресу
Пример: rtc.poke(15, 160); // Записать число 160 по адресу 15
peek(address);
Чтение одного байта из ОЗУ DS1302.
Параметры:
address:
адрес для чтения (0-30)
Пример:
b=rtc.peek(18); // Считать 1 байт по адресу 18 в переменную b
- Отличительные особенности:
- Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом высокосности текущего года вплоть до 2100 г.
- Дополнительное ОЗУ 31 x 8 для хранения данных
- Последовательный ввод – вывод информации для сокращения выводов микросхемы
- Выполнение всех функций при напряжении питания 2.0-5.5 В
- выполнение всех функций при напряжении 2.0-5.5 В на дополнительном выводе питания - Потребление не более 300 нA при 2.5 В питания
- Чтение и запись информации по одному байту или потоком
- Исполнение в 8-ми выводном корпусе DIP, а также по заказу в 8-ми выводном SOIC корпусе для поверхностного монтажа
- Простой 3-проводной интерфейс
- Совместимость с TTL-микросхемами (Vcc= 5V)
- Возможность поставки в промышленном диапазоне температур: от -40°C до+85°C
- Совместимость с DS1202
- Отличия от DS1202:
возможность подключения встроенной цепи подзарядки к выводу Vcc1
два вывода питания для подключения основного и резервного источника питания
увеличено ОЗУ на 7 байт
Описание выводов:
X1, X2 | подключение кварцевого резонатора 32.768 кГц |
GND | общий |
RST | сброс |
I/O | ввод - вывод данных |
SCLK | синхронизация последовательной связи |
VCC1, VCC2 | выводы питания |
Структурная схема DS1302:
Общее описание:
Микросхема DS1302 содержит часы реального времени с календарем и 31 байт статического ОЗУ. Она общается с микропроцессором через простой последовательный интерфейс. Информация о реальном времени и календаре представляется в секундах минутах, часах, дне, дате, месяце и годе. Если текущий месяц содержит менее 31 дня, то микросхема автоматически определит количество дней в месяце с учетом высокосности текущего года. Часы работают или в 24-часовом или 12-часовом формате с индикатором AM/PM (до полудня/ после полудня). Подключение DS1302 к микропроцессу упрощено за счет синхронной последовательной связи. Для этого требуется только 3 провода: (1) RST (сброс), (2) I/O (линия данных) и (3) SCLK (синхронизация последовательной связи). Данные могут передаваться по одному байту или последовательностью байтов до 31. DS1302 разработан, чтобы потреблять малую мощность и сохранять данные и информацию часов при потреблении менее 1 мкВт. DS1302 - преемник DS1202. В дополнение к основным функциям хранения времени DS1202, DS1302 имеет два вывода питания для подключения основного и резервного источника питания, возможность подключения программируемой цепи заряда к выводу VCC1 и семь дополнительных байтов ОЗУ.
Подключение:
Подключение 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 | 6 (Можно изменить на другие в скетче) |
CLK | 7 (Можно изменить на другие в скетче) |
DAT | (Можно изменить на другие в скетче) |
Подключение DS3231 к Arduino:
RTC DS3231 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
SDA | A4 |
SCL | A5 |
Модуль DS1302 часы реального времени на Алиэкспресс http://ali.pub/1br52w
Код программы для модуля 1302 и дисплей 1602 I2C
В зависимости от того какой модуль Вы подключаете, необходимо в программе указать
Для DS1302 :
time . begin (RTC_DS1302 , 10 , 13 , 12 );#include
virtuabotixRTC myRTC(6, 7, 8); //CLK, DAT, RST
Программа
#include
#include
LiquidCrystal_I2C lcd(0x3F ,2,1,0,4,5,6,7,3, POSITIVE);
void setup() {
lcd.begin(16,2);
//myRTC.setDS1302Time(00,04, 12, 06, 18, 04, 2017);
void loop() {
myRTC.updateTime();
lcd.setCursor(0, 0);
lcd.print("date: ");
lcd.print(myRTC.dayofmonth);
lcd.print("/");
lcd.print(myRTC.month);
lcd.print("/");
lcd.print(myRTC.year);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("time: ");
lcd.print(myRTC.hours);
lcd.print(":");
lcd.print(myRTC.minutes);
lcd.print(":");
lcd.print(myRTC.seconds);
lcd.println(" ");
Так же не забываем о экономии при покупке товаров на Алиєкспресс с помощью кэшбэка
Преимущества библиотеки:
Библиотека имеет внутренние функции аппаратной обработки протоколов передачи данных 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Во многих проектах Ардуино требуется отслеживать и фиксировать время наступления тех или иных событий. Модуль часов реального времени, оснащенный дополнительной батарей, позволяет хранить текущую дату, не завися от наличия питания на самом устройстве. В этой статье мы поговорим о наиболее часто встречающихся модулях RTC DS1307, DS1302, DS3231, которые можно использовать с платой Arduino.
Модуль часов представляет собой небольшую плату, содержащей, как правило, одну из микросхем DS1307, DS1302, DS3231.Кроме этого, на плате практически можно найти механизм установки батарейки питания. Такие платы часто применяется для учета времени, даты, дня недели и других хронометрических параметров. Модули работают от автономного питания – батареек, аккумуляторов, и продолжают проводить отсчет, даже если на Ардуино отключилось питание. Наиболее распространенными моделями часов являются DS1302, DS1307, DS3231. Они основаны на подключаемом к Arduino модуле RTC (часы реального времени).
Часы ведут отсчет в единицах, которые удобны обычному человеку – минуты, часы, дни недели и другие, в отличие от обычных счетчиков и тактовых генераторов, которые считывают «тики». В Ардуино имеется специальная функция millis(), которая также может считывать различные временные интервалы. Но основным недостатком этой функции является сбрасывание в ноль при включении таймера. С ее помощью можно считать только время, установить дату или день недели невозможно. Для решения этой проблемы и используются модули часов реального времени.
Электронная схема включает в себя микросхему, источник питания, кварцевый резонатор и резисторы. Кварцевый резонатор работает на частоте 32768 Гц, которая является удобной для обычного двоичного счетчика. В схеме DS3231 имеется встроенный кварц и термостабилизация, которые позволяют получить значения высокой точности.
Сравнение популярных модулей RTC DS1302, DS1307, DS3231
В этой таблице мы привели список наиболее популярных модулей и их основные характеристики.
Название | Частота | Точность | Поддерживаемые протоколы |
DS1307 | 1 Гц, 4.096 кГц, 8.192 кГц, 32.768 кГц | Зависит от кварца – обычно значение достигает 2,5 секунды в сутки, добиться точности выше 1 секунды в сутки невозможно. Также точность зависит от температуры. | I2C |
DS1302 | 32.768 кГц | 5 секунд в сутки | I2C, SPI |
DS3231 | Два выхода – первый на 32.768 кГц, второй – программируемый от 1 Гц до 8.192 кГц | ±2 ppm при температурах от 0С до 40С. ±3,5 ppm при температурах от -40С до 85С. Точность измерения температуры – ±3С | I2C |
Модуль DS1307
DS1307 – это модуль, который используется для отсчета времени. Он собран на основе микросхемы DS1307ZN, питание поступает от литиевой батарейки для реализации автономной работы в течение длительного промежутка времени. Батарея на плате крепится на обратной стороне. На модуле имеется микросхема AT24C32 – это энергонезависимая память EEPROM на 32 Кбайт. Обе микросхемы связаны между собой шиной I2C. DS1307 обладает низким энергопотреблением и содержит часы и календарь по 2100 год.
Модуль обладает следующими параметрами:
- Питание – 5В;
- Диапазон рабочих температур от -40С до 85С;
- 56 байт памяти;
- Литиевая батарейка LIR2032;
- Реализует 12-ти и 24-х часовые режимы;
- Поддержка интерфейса I2C.
Модуль оправдано использовать в случаях, когда данные считываются довольно редко, с интервалом в неделю и более. Это позволяет экономить на питании, так как при бесперебойном использовании придется больше тратить напряжения, даже при наличии батарейки. Наличие памяти позволяет регистрировать различные параметры (например, измерение температуры) и считывать полученную информацию из модуля.
Взаимодействие с другими устройствами и обмен с ними информацией производится с помощью интерфейса I2C с контактов SCL и SDA. В схеме установлены резисторы, которые позволяют обеспечивать необходимый уровень сигнала. Также на плате имеется специальное место для крепления датчика температуры DS18B20.Контакты распределены в 2 группы, шаг 2,54 мм. В первой группе контактов находятся следующие выводы:
- DS – вывод для датчика DS18B20;
- SCL – линия тактирования;
- SDA – линия данных;
- VCC – 5В;
Во второй группе контактов находятся:
- SQ – 1 МГц;
- BAT – вход для литиевой батареи.
Для подключения к плате Ардуино нужны сама плата (в данном случае рассматривается Arduino Uno), модуль часов реального времени RTC DS1307, провода и USB кабель.
Чтобы подключить контроллер к Ардуино, используются 4 пина – VCC, земля, SCL, SDA.. VCC с часов подключается к 5В на Ардуино, земля с часов – к земле с Ардуино, SDA – А4, SCL – А5.
Для начала работы с модулем часов нужно установить библиотеки DS1307RTC, TimeLib и Wire. Можно использовать для работы и RTCLib.
Проверка RTC модуля
При запуске первого кода программа будет считывать данные с модуля раз в секунду. Сначала можно посмотреть, как поведет себя программа, если достать из модуля батарейку и заменить на другую, пока плата Ардуино не присоединена к компьютеру. Нужно подождать несколько секунд и вытащить батарею, в итоге часы перезагрузятся. Затем нужно выбрать пример в меню Examples→RTClib→ds1307. Важно правильно поставить скорость передачи на 57600 bps.
При открытии окна серийного монитора должны появиться следующие строки:
Будет показывать время 0:0:0. Это связано с тем, что в часах пропадает питание, и отсчет времени прекратится. По этой причине нельзя вытаскивать батарею во время работы модуля.
Чтобы провести настройку времени на модуле, нужно в скетче найти строку
RTC.adjust(DateTime(__DATE__, __TIME__));
В этой строке будут находиться данные с компьютера, которые используются ля прошивки модуля часов реального времени. Для корректной работы нужно сначала проверить правильность даты и времени на компьютере, и только потом начинать прошивать модуль часов. После настройки в мониторе отобразятся следующие данные:
Настройка произведена корректно и дополнительно перенастраивать часы реального времени не придется.
Считывание времени. Как только модуль настроен, можно отправлять запросы на получение времени. Для этого используется функция now(), возвращающая объект DateTime, который содержит информацию о времени и дате. Существует ряд библиотек, которые используются для считывания времени. Например, RTC.year() и RTC.hour() – они отдельно получают информацию о годе и часе. При работе с ними может возникнуть проблема: например, запрос на вывод времени будет сделан в 1:19:59. Прежде чем показать время 1:20:00, часы выведут время 1:19:00, то есть, по сути, будет потеряна одна минута. Поэтому эти библиотеки целесообразно использовать в случаях, когда считывание происходит нечасто – раз в несколько дней. Существуют и другие функции для вызова времени, но если нужно уменьшить или избежать погрешностей, лучше использовать now() и из нее уже вытаскивать необходимые показания.
Пример проекта с i2C модулем часов и дисплеем
Проект представляет собой обычные часы, на индикатор будет выведено точное время, а двоеточие между цифрами будет мигать с интервалом раз в одну секунду. Для реализации проекта потребуются плата Arduino Uno, цифровой индикатор, часы реального времени (в данном случае вышеописанный модуль ds1307), шилд для подключения (в данном случае используется Troyka Shield), батарейка для часов и провода.
В проекте используется простой четырехразрядный индикатор на микросхеме TM1637. Устройство обладает двухпроводным интерфейсом и обеспечивает 8 уровней яркости монитора. Используется только для показа времени в формате часы:минуты. Индикатор прост в использовании и легко подключается. Его выгодно применять для проектов, когда не требуется поминутная или почасовая проверка данных. Для получения более полной информации о времени и дате используются жидкокристаллические мониторы.
Модуль часов подключается к контактам SCL/SDA, которые относятся к шине I2C. Также нужно подключить землю и питание. К Ардуино подключается так же, как описан выше: SDA – A4, SCL – A5, земля с модуля к земле с Ардуино, VCC -5V.
Индикатор подключается просто – выводы с него CLK и DIO подключаются к любым цифровым пинам на плате.
Скетч. Для написания кода используется функция setup, которая позволяет инициализировать часы и индикатор, записать время компиляции. Вывод времени на экран будет выполнен с помощью loop.
#include
После этого скетч нужно загрузить и на мониторе будет показано время.
Программу можно немного модернизировать. При отключении питания выше написанный скетч приведет к тому, что после включения на дисплее будет указано время, которое было установлено при компиляции. В функции setup каждый раз будет рассчитываться время, которое прошло с 00:00:00 до начала компиляции. Этот хэш будет сравниваться с тем, что хранятся в EEPROM, которые сохраняются при отключении питания.
Для записи и чтения времени в энергонезависимую память или из нее нужно добавить функции EEPROMWriteInt и EEPROMReadInt. Они нужны для проверки совпадения/несовпадения хэша с хэшем, записанным в EEPROM.
Можно усовершенствовать проект. Если использовать жидкокристаллический монитор, можно сделать проект, который будет отображать дату и время на экране. Подключение всех элементов показано на рисунке.
В результате в коде нужно будет указать новую библиотеку (для жидкокристаллических экранов это LiquidCrystal), и добавить в функцию loop() строки для получения даты.
Алгоритм работы следующий:
- Подключение всех компонентов;
- Проверка – на экране монитора должны меняться ежесекундно время и дата. Если на экране указано неправильное время, нужно добавить в скетч функцию RTC.write (tmElements_t tm). Проблемы с неправильно указанным временем связаны с тем, что модуль часов сбрасывает дату и время на 00:00:00 01/01/2000 при выключении.
- Функция write позволяет получить дату и время с компьютера, после чего на экране будут указаны верные параметры.
Заключение
Модули часов используются во многих проектах. Они нужны для систем регистрации данных, при создании таймеров и управляющих устройств, которые работают по заданному расписанию, в бытовых приборах. С помощью широко распространенных и дешевых модулей вы можете создать такие проекты как будильник или регистратор данных с сенсоров, записывая информацию на SD-карту или показывая время на экране дисплея. В этой статье мы рассмотрели типичные сценарии использования и варианты подключения наиболее популярных видов модулей.
Началось все с того, что волею случая я оказался владельцем текстового ЖК экрана BTHQ 22005VSS (2 строки по 20 знаков в каждой) и платы электронных часов DS1302. По правде говоря, в «Ардуиностроении» я делаю первые шаги, по этому, в приобретении данных деталей решающую роль сыграла демократичная цена и возможность быстрой доставки. Ведь, зачастую ждать, когда «девайс» прибудет из Поднебесной, обогнув почти «пол мира» некогда, да и просто не хочется.
Почему именно часы? В то время, когда вокруг продается масса разнообразных часов, цена самых простых из которых сравнима с пакетом сока. А дело все в том, что зачастую необходимо не просто знать точное время (и дату, что тоже иногда нужно) но еще и оперировать этим временем. Например - вести логи изменения температуры (влажности, давления, освещенности и т.п.) с указанием точного времени, когда эти изменения произошли. Вот тут-то ARDUINO оснащенный часами и окажет замечательную услугу. Да и кроме того, приятно, когда прибор ко всему прочему показывает еще и время. Ведь, даже работая на персональном компьютере мы изредка, да поглядываем в правый нижний угол, а вдруг уже пора на обед, или наступил конец рабочего дня, а может быть уже скоро рассвет?
Сердцем данного проекта послужил ARDUINO UNO, приобрести который довольно просто - это, конечно, если хочется купить что-то качественное и быстро. Можно, конечно найти и дешевле, но опять-же ждать, а ждать не хотелось. «Ардуинка» бодро моргала светодиодиком, выполняла все, что от неё требовалось давая простенькие сообщения через последовательный порт, в общем радовала. Но вернемся к часам. Проблемы начались, как всегда, неожиданно. Толковых статей и всего остального ни на экранчик, ни на часы «слёту» найти не удалось. На другие экраны - есть, на другие часы - сколько угодно, а вот на то, что в руках - почти ничего. Но, когда нет ничего - «почти» это тоже очень много.
Начнем с экрана. BTHQ 22005VSS оказался банальным ЖК экраном 20х2 (т.е. имеет 2 строки по 20 символов в каждой) вместо него вполне можно использовать, например экран - правда в нем «всего» 16 символов в каждой из строк, но для большинства проектов этого более, чем достаточно. Данный экран имеет 16-пиновый разъем, правда не однорядный, а двухрядный (2х8), если держать устройство экраном от себя, а разъемом справа, то первый пин будет нижним левым, второй нижним правым, третий над первым, четвертый над вторым, и т.д. Верхний левый (15) будет анод, верхний правый (16) - катод. Если есть знания английского и любознательность - можно почитать техническое описание . Если первого крайне мало, а любознательность гораздо слабее желания поэкспериментировать - вот, как подключал я:
Контакт экрана | Контакт Ардуино | Примечание |
1 | GND | Это «минус», или «земля». |
2 | +5V | |
3 | GND | Если нужны яркие знаки. |
4 | 4 | |
5 | GND | Если только «писать». |
6 | 5 | |
7 | -- | Не использовал |
8 | -- | Не использовал |
9 | -- | Не использовал |
10 | -- | Не использовал |
11 | 10 | |
12 | 11 | |
13 | 12 | |
14 | 13 | |
А(15) | +5V | Я подключил через резистор 500 Ом |
К(16) | GND |
В некоторых источниках «распиновка» со стороны Ардуино отличается, но ведь мне было удобнее так. Подключение часов также не вызвало проблем:
Часы DS1302 | Ардуино | Примечание |
VCC | +5V | |
GND | GND | Тут я подключал через резистор 10кОм. |
CLK | 0 | Не путать с GND!!! Контакт также называется SCLK |
DAT | 1 | Контакт также называется IO |
RST | 3 | Контакт также называется СЕ |
Подключать можно проводками, шлейфом, лично я собрал на макетной плате.
Проблемы начались, когда был загружен демоскетч и часы заработали. Правда показали они 2165 год, 45 месяц, 85 неделю... Наверное это по «уранскому» или «нептунскому» календарю… Но жить мне на Земле, а на Уран с Нептуном я пока не собираюсь. В общем надо что-то делать. Пайка в цепь GND->GND резистора 10кОм не помогла. Проблема оказалась в некорректной библиотеке. Сразу скажу, что корректную библиотеку можно взять . Это для часов. Экранчик успешно пользуется библиотекой из стандартного набора, которая зовется LiquidCrystal.h .
Проблема №2. Часы при каждом запуске начинают отсчет с того времени, которое «прошито» в программе. Есть сложное решение этой проблемы. Создать хеш, записать его в память часов, потом, при запуске считать его оттуда, сравнить… В общем для новичка в «Ардуиностроении» как то сложновато. Как оказалось есть и простое решение. точнее очень простое. А именно - прошить 2 раза. Первый раз - прошить с установкой даты и времени, второй раз прошить, предварительно «закомментировав» (поставив знак // в самом начале строки) строки с установкой этой самой даты.
Собственно говоря скетч:
// DS1302_LCD (C)2010 Henning Karlsen // web: http://www.henningkarlsen.com/electronics // A quick demo of how to use my DS1302-library to make a quick // clock using a DS1302 and a 20x2 LCD. // Соответствие пинов часов и экрана пинпм Ардуино. // DS1302: CE pin -> Arduino Digital 3 // I/O pin -> Arduino Digital 1 // SCLK pin -> Arduino Digital 0 // LCD: DB7 -> Arduino Digital 13 // DB6 -> Arduino Digital 12 // DB5 -> Arduino Digital 11 // DB4 -> Arduino Digital 10 // E -> Arduino Digital 5 // RS -> Arduino Digital 4 #include // Инициализация пинов часов void setup() // Запуск экрана с указанием количества символов и строк // Три нижние строчки в первый раз раскомментированы, в них указываем текущую дату и время. Второй раз - закомментруем. void loop() // Display abbreviated Day-of-Week in the lower left corner // Display date in the lower right corner // Wait one second before repeating |