Продолжаем играть в наш конструктор, современные "Электронные кубики". Уже знакомая нам по датчику температуры DS18B20, буржуинская фирма "Dallas Semiconductor", в свое время обрадовала любителей электроники еще одним своим творением - микросхемой часов "реального времени" DS1307.
Почему "реального"? Наверное, потому что эта миниатюрная деталька о восьми ножках, позволяет автономно хранить текущее время, дату (день-месяц-год-день недели) и предоставлять ее по первому требованию. Причем, можно собрать полностью автономный модуль с батарейкой от материнской платы компьютера и, по уверениям разработчиков, ее должно хватить почти на 10 лет работы без какого-либо внешнего источника энергии.
Вот этот чудесный прибор мы и попробуем соединить с нашей Ардуиной. Для тех, кто немного разбирается в принципиальных схемах - вот типовая схема подключния:
Для остальных - схематический рисунок микросхемы часов:
Значит, включать будем так:
1 - 2 ножка - кварцевый резонатор 32768 Гц (берется их старой материнской платы компьютера)
3 ножка - плюсовой вывод батарейки ( вместе с держателем выпаивается из той же материнки)
4 ножка - общий провод и минус питания микросхемы (сюда же подключаем и минус батарейки)
5 -6 ножки - управление часами, будем подключать к Ардуине.
7 ножка - не подключаем.
8 ножка - плюс источника питания.
Еще нам понадобятся 2 "подтягивающих" резистора по 3-5 килоом, через которые необходимо соединить ножки 5 и 6 с плюсом питания ( 8-я ножка).
Конечно, можно было бы собрать все это хозяйство прямо на нашей макетке, но лучше и удобнее сделать наши часы в виде отдельного модуля. Потому что, несмотря всю простоту, есть некоторые нюансы, которые могут повлиять на его работоспособность. Например, кварцевый резонатор нужно располагать как можно ближе к выводам 1 и 2. В идеале - ножки кварца лучше припаять прямо к выводам микросхемы.
В результате должно получиться что-то вроде этого:
Не сильно красиво, главное, чтобы работало, правда? В слелующий раз сделаем красивее.:-)
Теперь установим наш "модуль времени" на ту же макетку, где у нас остался собранный в прошлый раз термометр:
Как видите, мы пока что соединили только выводы питания нашего модуля.
Теперь нужно подключить ножки 5 и 6 DS1307. Это так называемый - "последовательный интерфейс". Он состоит из 2-х проводников: SDA (вывод 5 DS1307) - это "шина данных", подключаем к выводу А4 Ардуины. Второй проводник интерфейса - SCL (вывод 6 DS1307) - выход "синхронизации" или "тактовый выход", подключаем к выводу А5 Ардуины. Вот и все с подключениями!
Тем временем, перейдем к программной части нашей системы. Как уже кто-то догадался, управлять DS1307 мы будем с помощью специализированной библиотеки "DS1307RTC" для Arduino IDE, которую можно взять, например, здесь. Установка библиотеки тривиальна - просто копируем папку в директорию /libraries.
После установки библиотеки откроем Arduino IDE и посмотрим, что у нас получилось:
Библиотека содержит 2 скетча в виде примеров использования - ReadTest и SetTime. Нужно сказать, что после сборки нашего "модуля времени", он еще не работает, как ни странно. В самом деле - откуда ему знать, сколько сейчас времени и какое число? Значит, надо в него эти данные предварительно записать. И здесь Ардуино снова показывает свой класс. Не нужно разбираться во внутреннем устройстве, принципах работы, форматах записи даты-времени в DS1307. Не нужно даже разбираться, как работает скетч SetTime, который мы сейчас открыли (открыли уже, да?). Просто, загружаем его в Ардуину и, если мы все правильно соединили, в мониторе последовательного порта получаем такую картинку:
Если это увидели, значит наш "модуль времени" сконфигурирован, в него предустановлены текущие дата и время, и он готов к работе. Теперь, даже если отключить питание, то модуль перейдет на питание от батарейки и сохранит все установки. Производители утверждают, что батарейки может хватить чуть ли не на 10 лет работы, может, слегка и привирают, но хватит надолго, точно.
Теперь откроем второй скетч, ReadTest, и загрузим его в Ардуину. После загрузки, открыв "Монитор последовательного порта", увидим следующее:
Как видим, дата-время читается нормально. Вот теперь нам нужно немного разобраться в скетче, взять нужные "детали" и вставить их в программу-термометр. Цель - сделать "часы - термометр"! Заодно, отработать навыки работы с нашим "конструктором". Кто знает, может кто-то, начав с этой игрушки, заинтересуется более сложными вещами. Ну, а кто-то - просто развлечется, тоже неплохо!
Ну, а пока что - загрузим такой скетч:
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h> //подключаем необходимые библиотеки.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Указываем к каким пинам Ардуины подключен наш индикатор
void setup() {
lcd.begin(8, 2); // указываем тип индикатора - сколько столбцов и строк.
lcd.clear();
}
void loop() {
tmElements_t tm; // объявляем набор данных, считываемый из модудя времени
lcd.setCursor(0, 0); // устанавливаем курсор в начало дисплея.
if (RTC.read(tm)) {
print2digits(tm.Hour);
lcd.print(":");
print2digits(tm.Minute);
lcd.print(":");
print2digits(tm.Second); lcd.setCursor(0, 1);
lcd.print(tm.Day);
lcd.print("/");
lcd.print(tm.Month);
lcd.print("/");
lcd.print(tmYearToCalendar(tm.Year)); }
delay(500);
}
void print2digits(int number) { //функция принимает целое число и если
if (number >= 0 && number < 10) { //оно меньше 10, то добавляется еще "0".
lcd.print("0");
}
lcd.print(number);
}
Коротко прокомментирую скетч. В начале его подключаются все необходимые библиотеки, затем инициализируется наш LCD дисплей HD44780, про подключение которого я писал в этой статье. Объявляется набор данных tm, как результат чтения текущего времени-даты из DS1307. Далее, выделяем из этого набора часы-минуты-секунды и выводим их на ЖК-дисплей. Из интересного - использовании отдельной функции для обработки данных:
void print2digits(int number) { //функция принимает целое число и если
if (number >= 0 && number < 10) { //оно меньше 10, то добавляется еще "0".
lcd.print("0");
}
lcd.print(number);
}
Дело в том, что мы получаем данные из часов в виде целых чисел - типа 1, 3, 4 и т.д.Когда число двузначное, индикация часов вроде привычная, а когда, например, индицируем 3 часа и 5 минут, то нам, все-таки, привычней видеть 03:05. Функция работает просто - при вызове ей передается целое число - часы или минуты. Она определяет - если число меньше 10, то допечатывает перед числом "0", если 10 или больше - печатает, как есть. Ничего сложного.
Результат работы скетча:
Как видите, поскольку индикатор у меня укороченный, всего на 8 символов в ширину, то одна цифра года не поместилась. Но это сейчас неважно - ведь скетч-то учебный. Чтобы не усложнять, не стал думать про то, как выделить из года 2 последних цифры.
В заключение этой статьи подчеркну - мы снова получили результат минимальными усилиями, без всяких знаний электроники, программирования и прочего. И все это благодаря Ардуино, его создателям, которые сделали для нас такую замечательную игрушку.