Плата часов реального времени ds1307 своими руками

Добавил пользователь Morpheus
Обновлено: 19.09.2024

Всем доброго дня. Как-то захотел сделать часы с будильником на arduino до это я пытался воспользоваться встроенным 16-ти битным таймером, но на практике часы спешили на 4 секунды в час. Так как в своей разработке я использовал arduino nano китайского производства сразу под сомнения попал кварцевый генератор, но менять не хотелось его и большой точности я вряд ли добился бы, по этому было принято решение использовать отдельный модуль для часов реального времени. Поскольку у нас они дорогие а из китая долго ждать я решил спаять модуль часов реального времени самостоятельно. Почему я выбрал модуль часов на отдельной микросхеме:

  • Независимые часы от нагрузки микроконтроллера
  • Наличие дежурного источника (батарейка 3 вольта)
  • Высокая точность
  • Наличие своего тактового сигнала при необходимости

В качестве "часовой" микросхемы я выбрал DS1307Z от Maxim Semiconductor в корпусе SOIC-8. Можно взять и dip версию но в ней я не видел смысла, она больше и менять я ее не собирался. Особенности данной микросхемы:

  • последовательный 2 проводной интерфейс I2C
  • наличие 56 байт своей ОЗУ (вряд ли кто-то будет пользоваться, но все таки они есть)
  • наличие независимого генератора прямоугольных импульсов (настраиваемый)
  • потребление от батарейки менее 500 нA при 25ºС
  • кроме даты присутствует встроенный календарь с учетом високосного года (до 2100 года)

В качестве альтернативы можно использовать DS1305, DS1302, DS1338, они отличаются возможностями и ценной естественно. Так как для наших скромных целей достаточно DS1307 мы ей и воспользуемся. Схема подключения довольно проста и используем минимум обвязок:

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

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

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

rtc 02

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

rtc 03

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

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

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

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

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

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

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

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

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

void loop() <
tmElements_t tm; // объявляем набор данных, считываемый из модудя времени
lcd.setCursor(0, 0); // устанавливаем курсор в начало дисплея.

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);
>

Коротко прокомментирую скетч. В начале его подключаются все необходимые библиотеки, затем инициализируется наш LCD дисплей HD44780, про подключение которого я писал в этой статье. Объявляется набор данных tm, как результат чтения текущего времени-даты из DS1307. Далее, выделяем из этого набора часы-минуты-секунды и выводим их на ЖК-дисплей. Из интересного - использовании отдельной функции для обработки данных:

Дело в том, что мы получаем данные из часов в виде целых чисел - типа 1, 3, 4 и т.д.Когда число двузначное, индикация часов вроде привычная, а когда, например, индицируем 3 часа и 5 минут, то нам, все-таки, привычней видеть 03:05. Функция работает просто - при вызове ей передается целое число - часы или минуты. Она определяет - если число меньше 10, то допечатывает перед числом "0", если 10 или больше - печатает, как есть. Ничего сложного.

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

rtc8

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

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


В предыдущем уроке 18, мы подключили Trema RTC часы реального времени с Trema кнопками и LCD I2C дисплеем к arduino Uno, написали скетч, для установки времени при помощи кнопок.

Теперь расширим функционал получившихся часов, добавив к ним функцию будильника. А код, который будет выполняться при срабатывании будильника выведем в отдельную функцию "Func_alarm_action()", чтоб Вы смогли легко его найти и изменить. Например, при срабатывании будильника, открывать жалюзи, включать свет или музыку, включить через реле тостер или кофе-машину и т.д.

Нам понадобится:

    х 1шт.
  • RTC модуль Trema на базе чипа DS1307 х 1шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт. х 1шт. х 1шт. х 3шт. х 2шт. х 1шт.
  • Trema-модуль светодиод х 1шт. (белый, синий, красный, оранжевый или зелёный)

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека 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

Зуммер подключаем к выводу 5, а светодиод к выводу 13 (дублируя встроенный в arduino).

RTC часы с будильником на Arduino Uno

Алгоритм работы кнопок следующий:

  • В режиме вывода даты/времени/будильника (обычный режим):
    • Кратковременное нажатие на кнопку SET переключает режимы вывода: даты/времени/будильника
    • Удержание кнопки SET переводит часы в режим установки даты/времени/будильника (зависит от того, каким был режим вывода)
    • Кнопки UP и DOWN, в режиме вывода будильника, активируют/деактивируют будильник.
      Если будильник активен, то в правом верхнем углу экрана появляется значок будильника.
    • Кратковременное нажатие на кнопку SET - переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.)
    • Удержание кнопки SET выводит часы из режима установки
    • Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
    • Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени
    • Удержание любой кнопки в течении 1 секунды, отключает сигнализацию (без выполнения их действий, в любом режиме)

    Код программы:

    Работа кнопок, вывод и установка времени, описывались в уроке 18, в этом уроке рассмотрим работу будильника:

    В начале кода добавляем две константы: PIN_alarm_TONE и PIN_alarm_LED, указывающие номера выводов зуммера и светодиода.
    А также добавляем четыре переменные: VAR_alarm_MIN , VAR_alarm_HOUR , VAR_alarm_FLAG1 и VAR_alarm_FLAG2 .

    • VAR_alarm_MIN - переменная в которой хранится значение минут, при котором сработает будильник (по умолчанию 0 минут)
    • VAR_alarm_HOUR - переменная в которой хранится значение часов, при котором сработает будильник (по умолчанию 0 часов)
    • VAR_alarm_FLAG1 - флаг разрешения работы будильника, false - не активен, true - активен (по умолчанию true - активен)
    • VAR_alarm_FLAG2 - флаг указывающий на то, что будильник сработал "сигнализация" (по умолчанию false - не сработал)

    Последняя переменная которую мы добавили - MAS_alarm_SYM, она содержит изображение символа будильника для вывода на дисплей.

    В функции loop, после вывода информации на дисплей, добавляем проверку: не пора ли включить будильник?

    • если будильник включён (установлен флаг VAR_alarm_FLAG1)
    • если в текущем времени 0 секунд (time.seconds==00)
    • если количество минут текущего времени (time.minutes) равно количеству минут установленных в будильнике (VAR_alarm_MIN)
    • если количество часов текущего времени (time.Hours) равно количеству часов установленных в будильнике (VAR_alarm_HOUR)
      то устанавливаем флаг VAR_alarm_FLAG2 (указывающий на то, что будильник сработал)
    • если установлен флаг VAR_alarm_FLAG2, то запускаем действия будильника (действия описаны в функции Func_alarm_action)
      Так как проверка будильника и запуск функции Func_alarm_action() находится внутри условия if(millis()%1000==0), то действия будильника будут выполняться один раз в секунду.

    Теперь всё готово для создания полного кода:

    Разберемся в коде действий будильника:

    Действия будильника описаны в функции Func_alarm_action().

    В этой функции мы включаем светодиод, далее подаём три коротких звуковых сигнала (с частотой 2000Гц, длительностью и паузой 100мс), после чего выключаем светодиод.

    Если Вам необходимо выполнить действие будильника однократно, а не каждую секунду после его срабатывания, то начните выполнение действий со сброса флага VAR_alarm_FLAG2, присвоив ему значение false.

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

    Внешний вид модуля:

    DS1307

    DS1307

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

    CR2032

    С Arduino модуль работает по протоколу I2C. Для его использования требуется подключить контакты GND и VCC к контактам земли и 5V, а контакты SCL и SDA - к соответствующим контактам платы arduino. В зависимости от того, какую плату вы используете, контакты будут разные:

    Плата Пин SDA Пин SCL
    Uno, Nano A4 A5
    Mega2560 20 21
    Leonardo 2 3
    Due 20, SDA1 21, SCL1

    Подключаем модуль к Arduino Uno

    Схема подключения модуля реального времени DS1307 к Arduino Uno

    После того, как мы вставили батарейку и подключили модуль, нужно установить время. Достаточно сделать это 1 раз и далее модуль будет "тикать", пока не сядет заряд батарейки. Загрузите и запустите следующий скетч (не забыв поставить все необходимые библиотеки):

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

    Видим строчку "Ok, Time = 18:32:49, Date (D/M/Y) = 13/2/2019" - все получилось. Ну а далее, например, добавив 7-сегментный дисплей, мы можем собрать часы.

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

    Для ленивых есть шилд для Arduino uno с модулем часов, но он не такой миниатюрный.

    Батарейки формата CR2032 можно купить в и магазине, но проще заказать сразу 10 или 20 штук.

    Читайте также: