Продолжаем играть в наш конструктор, современные "Электронные кубики". Уже знакомая нам по датчику температуры DS18B20, буржуинская фирма "Dallas Semiconductor", в свое время обрадовала любителей электроники еще одним своим творением - микросхемой часов "реального времени" DS1307.

Почему "реального"? Наверное, потому что эта миниатюрная деталька о восьми ножках, позволяет автономно хранить текущее время, дату (день-месяц-год-день недели) и предоставлять ее по первому требованию. Причем, можно собрать полностью автономный модуль с батарейкой от материнской платы компьютера и, по уверениям разработчиков, ее должно хватить почти на 10 лет работы без какого-либо внешнего источника энергии.

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

rtc 02

Для остальных - схематический рисунок микросхемы часов:

rtc 03

Значит, включать будем так:

 1 - 2 ножка - кварцевый резонатор 32768 Гц (берется их старой материнской платы компьютера)

 3 ножка       - плюсовой вывод батарейки ( вместе с держателем выпаивается из той же материнки)

 4 ножка       - общий провод и минус питания микросхемы (сюда же подключаем и минус батарейки)

 5 -6 ножки  - управление часами, будем подключать к Ардуине.

 7 ножка       - не подключаем.

 8 ножка       - плюс источника питания.

 Еще нам понадобятся 2 "подтягивающих" резистора по 3-5 килоом, через которые необходимо соединить ножки 5 и 6 с плюсом питания ( 8-я ножка).

Конечно, можно было бы собрать все это хозяйство прямо на нашей макетке, но лучше и удобнее сделать наши часы в виде отдельного модуля. Потому что, несмотря всю простоту, есть некоторые нюансы, которые могут повлиять на его работоспособность. Например, кварцевый резонатор нужно располагать как можно ближе к выводам 1 и 2. В идеале - ножки кварца лучше припаять прямо к выводам микросхемы.

 В результате должно получиться что-то вроде этого:

rtc1

 

Не сильно красиво, главное, чтобы работало, правда? В слелующий раз сделаем красивее.:-) 

Теперь установим наш "модуль времени" на ту же макетку, где у нас остался собранный в прошлый раз термометр:

rtc4

 Как видите, мы пока что соединили только выводы питания нашего модуля.

Теперь нужно подключить ножки 5 и 6 DS1307. Это так называемый - "последовательный интерфейс". Он состоит из 2-х проводников: SDA (вывод 5 DS1307) - это "шина данных", подключаем к выводу А4 Ардуины. Второй проводник интерфейса - SCL (вывод 6 DS1307) - выход "синхронизации" или "тактовый выход", подключаем к выводу А5 Ардуины. Вот и все с подключениями!

 rtc4 1

Тем временем, перейдем к программной части нашей системы. Как уже кто-то догадался, управлять DS1307 мы будем с помощью специализированной библиотеки "DS1307RTC" для Arduino IDE, которую можно взять, например, здесь. Установка библиотеки тривиальна - просто копируем папку в директорию /libraries.

 После установки библиотеки откроем Arduino IDE и посмотрим, что у нас получилось:

rtc5

 

Библиотека содержит 2 скетча в виде примеров использования - ReadTest и SetTime. Нужно сказать, что после сборки нашего "модуля времени", он еще не работает, как ни странно. В самом деле - откуда ему знать, сколько сейчас времени и какое число? Значит, надо в него эти данные предварительно записать. И здесь Ардуино снова показывает свой класс. Не нужно разбираться во внутреннем устройстве, принципах работы, форматах записи даты-времени в DS1307. Не нужно даже разбираться, как работает скетч SetTime, который мы сейчас открыли (открыли уже, да?). Просто, загружаем его в Ардуину и, если мы все правильно соединили, в мониторе последовательного порта получаем такую картинку:

rtc6

 

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

 Теперь откроем второй скетч, ReadTest, и загрузим его в Ардуину. После загрузки, открыв "Монитор последовательного порта", увидим следующее:

rtc7

 

Как видим, дата-время читается нормально. Вот теперь нам нужно немного разобраться в скетче, взять нужные "детали" и вставить их в программу-термометр. Цель - сделать "часы - термометр"! Заодно, отработать навыки работы с нашим "конструктором". Кто знает, может кто-то, начав с этой игрушки,  заинтересуется более сложными вещами. Ну, а кто-то - просто развлечется, тоже неплохо!

Ну, а пока что - загрузим такой скетч:

#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 или больше - печатает, как есть. Ничего сложного.

Результат работы скетча:

 rtc8

 

Как видите, поскольку индикатор у меня укороченный, всего на 8 символов в ширину, то одна цифра года не поместилась. Но это сейчас неважно - ведь скетч-то учебный. Чтобы не усложнять, не стал думать про то, как выделить из года 2 последних цифры.

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

                                                                                    Продолжение следует

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