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

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

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

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

У меня плата «среднего» размера (рисунок ниже), и присматривался я к ней довольно долго — пугала цена. Решил посмотреть в Интернете, нет ли у нее аналогов, и увидел, что цена на эту плату в разных интернет-магазинах отличается в разы. Поэтому, прежде чем покупать, изучите побольше предложений. Советую вместе с платой купить набор перемычек и соединительных проводов, это очень облегчает работу. Плата у меня небольшая, но и ее размера многовато, можно было взять поменьше. Тем более несколько плат можно соединить в одну, правда, без электрического контакта. На такой плате и будем макетировать следующее устройство.

Макетная плата

Сегодня мы к Arduino подключим часы реального времени (RTC — realtime clock). Это такая электронная схема, которая считает текущее время, дату, день недели… Название по-русски звучит странновато. Но так уж сложилось в электронике, что словосочетанием со словом clock сначала назвали задающие частоту генераторы, потом это слово встречалось в обозначениях различных таймеров, и, когда пришло время назвать часы словом часы (clock), использовали словосочетание «часы реального времени».

Для чего нужны часы, наверно, понятно — чтобы учитывать время. Вот и мы построим очередной прибор для учета времени.

Итак, часы реального времени

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

Кроме Arduino, нам понадобятся: микросхема DS1307, часовой кварц (32768 Гц), три резистора 4,7 кОм (подойдут резисторы от 4,7 до 10 кОм), конденсатор и батарейка 3 В. Микросхему придется купить, кварц и батарейку можно выпаять из ненужной старой системной платы компьютера. Там же можно взять и держатель батареи. Производитель обещает, что батареи хватит на 10 лет. Схему возьмем типовую, предложенную разработчиком (рис. 2).

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

Теперь об Arduino

В ее основе лежит микроконтроллер. Микроконтроллеры общаются с внешними устройствами с помощью различных протоколов. Например, для связи с компьютером — один протокол, для подключения наших часов — другой. Есть протоколы, которые позволяют связать между собой два устройства, есть те, что позволяют соединить несколько десятков устройств. Протокол — это как бы правила передачи данных между устройствами. В техническом описании микроконтроллера atmega8 каждому протоколу отводится около 30 страниц. Итальянцы, придумавшие Arduino, облегчили нам работу. Кроме того, что нам не нужен программатор, нам еще предложено большое количество библиотек на разные случаи жизни. Среди них есть и библиотеки для работы с протоколами, так что нам достаточно подобрать подходящую библиотеку. Библиотека — это такой кусочек кода, который можно включить в свою программу. Хочу заметить, если вы задумаете что-то новое и необычное, то может оказаться, что подходящих библиотек нет, в этом случае придется писать весь код самостоятельно.

Но ближе к делу. Для установки библиотеки нужно папку с ее файлами скопировать в каталог …/arduino/libraries. Для работы с часами 1307 когда-то давно я скачал библиотеку, ее и использую. Она нормально работает с версией arduino ide 0022 и не работает с версиями 1.0 и выше. Но это не страшно, более свежую библиотеку с описанием и примерами можно найти в Интернете, например, по запросу «dsl307 и arduino ide 1.0».

Собираем схему (можно на макетной плате, можно сразу изготовить печатную, в данном случае она несложная). Проверяем все соединения и подключаем резервную батарею. Схема потребляет очень мало тока. Питание возьмем от Arduino. Четвертый вывод DS1307 соединим с «землей», восьмой — с +5 В. Далее соединим пятый вывод микросхемы с аналоговым входом Arduino А4, а шестой с А5. Еще раз проверим все соединения.

Код

Код будет состоять из двух частей. Можно их объединить, можно использовать по отдельности. Первая часть кода будет устанавливать текущее время в часах, вторая будет это время выводить в терминал. Начало в обоих случаях одинаковое, так как настраивает одни и те же параметры. Так как наши часы ничего больше не делают, кроме как выводят время в терминал, то, чтобы в терминале время не мелькало очень быстро, во второй части предусмотрена трехсекундная пауза, ее можно уменьшить/увеличить, но совсем от нее отказываться не стоит. Устанавливаемое время поменяйте, в программе выставлено 1 марта 2013 года, пятница, 15 часов 25 минут 00 секунд. Не забудьте библиотеку dsl307.h скопировать в папку /libraries. Остальные библиотеки должны уже быть в этой папке.

Код установки и запуска часов:

//Подключаем библиотеки #include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
void setup()
{Serial. begin(9600);
RTC.stop(); //Останавливаем часы
RTC.set(DS1307_SEC,0); //Выставляем секунды (00)
RTC.set(DS1307_MIN,25); //Выставляем минуты (25)
RTC.set(DS1307_HR,15); //Выставляем часы (15)
RTC.set(DS1307_DOW,5); //Выбираем день недели (5)
RTC.set(DS1307_DATE,l); //День месяца (1)
RTC.set(DS1307_MTH,3); //Месяц (3)
RTC.set(DS1307_ YR,13); //Год (13)
RTC.start(); //Запускаем часы
}
void 1оор() //в основном цикле ничего нет
{
}

Обратите внимание: после заливки этого кода в часах установится нужное время, и они начнут отсчитывать время. Если нажать на Arduino reset, то программа запустится еще раз и еще раз установит время. Поэтому после заливки этой программы нужно сразу залить следующий код, который на установку часов влиять уже не будет.

Код отслеживания текущего времени:

/*Подключаем библиотеки*/
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print(RTC.get(DS1307_HR,true)); // Считываем часы с обновлением всех значений Serial. print(«:»);
Serial.printf RTC.get(DS1307_MIN,false)); // Считываем минуты без обновления Serial. print(«:»);
Serial. print(RTC. get(DS1307 SEC, false)); // Считываем секунды без обновления Serial.print(« «);
Serial. print (RTC. get(DS1307_DATE, f alse)); // Считываем дату без обновления Serial. print(« / »);
Serial. print(RTC. get(DS1307_MTH, f alse)); // Считываем месяц без обновления Ser ial. prin t(«/»);
Serial. print (RTC. ge t(DS1307_YR, false)); // Считываем год без обновления Serial. print(« Day-»); Serial.println(RTC.get(DS1307_DOW,false)); Считываем день недели без обновления delay(3000);
}

Теперь, выключая питание, мы часы не остановим, и если снова все включить и запустить терминал, в нем будет показано текущее время. Необходимую библиотеку можно найти в Интернете. Если вы найдете более свежую библиотеку, обратите внимание: там могут быть другие команды для запуска/ остановки, настройки и отслеживания времени. На рисунке ниже вы видите результат работы программы.

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

Следует заметить, эти два кода удобны для ознакомления с работой часов. Они пригодны, если вы будете разрабатывать устройство для себя. Если предполагается, что устройством будет пользоваться кто-то еще, то необходимо сделать единый код, добавить к устройству кнопок и запрограммировать так, чтобы время настраивалось с их помощью. Правда, это подразумевает еще и подключение индикатора, а это уже другая история.


Ваш комментарий

Предыдущая статья: Следующая статья: