Сайт о телевидении

Сайт о телевидении

» » Arduino установка времени. Часы на Arduino без использования модуля RTC

Arduino установка времени. Часы на Arduino без использования модуля RTC

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

Шаг 1: Что же такое бинарные часы?

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

Бинарные часы – это часы, что отображают время в двоичном формате. В проекте используются 6 колонок светодиодов для отображения нулей и единиц. Каждая колонка отображает одну цифру/разряд, такой формат известен, как двоично-десятичное число (ДДЧ). Каждая линия отображает степень двойки, от 2^0 (или 1), до 2^3 (или 8). Поэтому всё, что нужно сделать при чтении информации с часов – просуммировать значения колонок с включенными светодиодами. Например, в первой колонке включены 4-й и 1-й светодиоды. Прибавляем 8 к 1 и получаем 9 (количество секунд равное 9). Следующая колонка десятые секунды, в ней светится только 3-й светодиод, поэтому общее значение будет равно 49 секундам, точно также с минутами и часами. Пожалуйста, отметьте следующее, что часы отображают время в 24-х часовом формате.

Шаг 2: Составные части

  • Arduino Pro Mini 328 5 V использовал такую плату, но фактически можете использовать любую другую. Если вы ни разу не использовали Pro Mini, то наверняка вам будет нужен CP 2102 (программатор) для подключения платы к компьютеру;

  • DS 1302 — модуль часов реального времени ;

  • 20-ть 10 мм диффузных «тёплых» светодиодов (советую брать с запасом);

  • 20-ть резисторов с номиналом сопротивления 10Ω;

  • 2 тактовые кнопки;

  • 2 резистора с номиналом сопротивления 10kΩ (используются, как нагрузочные резисторы).

Шаг 3: Изготавливаем прототип

Начнём изготавливать прототип будущей поделки . В принципе, это не обязательное условие, но нужно же посмотреть на то, как светодиодная матрица, Arduino и часовой модуль будут работать вместе. При прототипирование использовал Arduino Mega и простые красные светодиоды. Всё работает хорошо, как и ожидалось.

Шаг 4: Корпус

Корпус самоделки (состоит из двух половинок) будет изготовлен из дерева. Оно будет контрастно смотреться на фоне бинарных часов и придаст поделке ретро стиль.

Шаг 5: Схема

Светодиоды сгруппированы в матрицу, чтобы уменьшить количество задействованных выводов arduino. В нашем случае под матрицу отведено 9 выводов. После изготовления светодиодной матрицы, припаяем выводы к arduino, затем модуль часов, кнопки для настройки времени и под конец блок питания.

Шаг 6: Код

За основу кода взят пример с Arduino Playgroud post для модуля часов DS1302. После чего были внесены изменения для отображения времени на светодиодной матрице.

Во многих проектах Ардуино требуется отслеживать и фиксировать время наступления тех или иных событий. Модуль часов реального времени, оснащенный дополнительной батарей, позволяет хранить текущую дату, не завися от наличия питания на самом устройстве. В этой статье мы поговорим о наиболее часто встречающихся модулях 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 #include "TM1637.h" #include "DS1307.h" //нужно включить все необходимые библиотеки для работы с часами и дисплеем. char compileTime = __TIME__; //время компиляции. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //номера с выходов Ардуино, к которым присоединяется экран; void setup() { display.set(); display.init(); //подключение и настройка экрана. clock.begin(); //включение часов. byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 2); byte second = getInt(compileTime, 4); //получение времени. clock.fillByHMS(hour, minute, second); //подготовка для записывания в модуль времени. clock.setTime(); //происходит запись полученной информации во внутреннюю память, начало считывания времени. } void loop() { int8_t timeDisp; //отображение на каждом из четырех разрядов. clock.getTime();//запрос на получение времени. timeDisp = clock.hour / 10; timeDisp = clock.hour % 10; timeDisp = clock.minute / 10; timeDisp = clock.minute % 10; //различные операции для получения десятков, единиц часов, минут и так далее. display.display(timeDisp); //вывод времени на индикатор display.point(clock.second % 2 ? POINT_ON: POINT_OFF);//включение и выключение двоеточия через секунду. } char getInt(const char* string, int startIndex) { return int(string - "0") * 10 + int(string) - "0"; //действия для корректной записи времени в двухзначное целое число. В ином случае на экране будет отображена просто пара символов. }

После этого скетч нужно загрузить и на мониторе будет показано время.

Программу можно немного модернизировать. При отключении питания выше написанный скетч приведет к тому, что после включения на дисплее будет указано время, которое было установлено при компиляции. В функции setup каждый раз будет рассчитываться время, которое прошло с 00:00:00 до начала компиляции. Этот хэш будет сравниваться с тем, что хранятся в EEPROM, которые сохраняются при отключении питания.

Для записи и чтения времени в энергонезависимую память или из нее нужно добавить функции EEPROMWriteInt и EEPROMReadInt. Они нужны для проверки совпадения/несовпадения хэша с хэшем, записанным в EEPROM.

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

В результате в коде нужно будет указать новую библиотеку (для жидкокристаллических экранов это LiquidCrystal), и добавить в функцию loop() строки для получения даты.

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

  • Подключение всех компонентов;
  • Проверка – на экране монитора должны меняться ежесекундно время и дата. Если на экране указано неправильное время, нужно добавить в скетч функцию RTC.write (tmElements_t tm). Проблемы с неправильно указанным временем связаны с тем, что модуль часов сбрасывает дату и время на 00:00:00 01/01/2000 при выключении.
  • Функция write позволяет получить дату и время с компьютера, после чего на экране будут указаны верные параметры.

Заключение

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


Такие часы очень оригинально будут смотреться на стене, они имеют в наличии светодиодные стрелки имитирующие стрелочные часы, LED часы по центру и красивую фоновую RGB-подсветку. Выполнение такой самоделки сложно назвать простым, но потраченное время и силы не будут упущены зря.

Материалы для корпуса:
- Чёрные акриловые пластины 300х300х3 мм 3шт
- Прозрачная акриловая подсветка 300х300х3 мм 1шт
- Средство полировки акриловых пластин
- Клей
- Распорные втулки 15 мм с резьбой м3 20 шт
- Винты м3 с шайбами 20 шт
- Картинная рамка 300х300 мм 1шт

Электронные материалы:
- Сдвиговый регистр CD74HC595 8шт
- LED драйвер TLC5940 1шт
- Часы реального времени (RTC) DS1307 1шт
- Линейный регулятор LM317 1шт
- Биполярный транзистор BD139 8шт
- Электролитический конденсатор 1 мкФ 2шт
- Конденсатор 0.1 мкФ 1шт
- Резисторы 120 Ом 60шт
- Резисторы 10 кОм 9шт
- Резистор 2 кОм 1шт
- Резисторы 1 кОм 9шт
- Резистор 330 Ом 1шт
- Светодиоды 480шт
- 4-х разрядный светодиодный цифровой индикатор (с общими анодами) 1шт
- Светодиодная RGB-лента (с общим анодом) 1шт (длинной под окружность циферблата)
- Модуль Arduino Mega ADK (Rev3) 1шт
- Батарея питания 12 В 1шт

Шаг первый. Изготовление корпуса.
Для начала в акриловые пластины разрезают и просверливают по чертежу. Далее, происходит склеивание корпусной передней чёрной пластины с соединительной частью (прозрачной), и с пластиной под светодиоды.

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

Шаг третий. Вставка светодиодов.
В первую очередь светодиоды вставляют в первый ряд отверстий (на 1 ряд ушло 60 светодиодов). Катоды спаиваются между собой вокруг пластины с помощью медного провода 0,8мм, а аноды отгибаются в сторону. Эта процедура повторяется для 7 остальных рядов. Теперь когда аноды расположились в один столбец, они тоже спаиваются между собой. Таким образом, получилась матрица из 8 рядов и 60 столбцов.

Шаг четвёртый. Припаивание кабелей к матрице.
Для этого шага используются 8-проводные кабельные разъёмы один из них припаяли к катодам на матрице. Восемь таких разъёмов были припаяны к 60 столбцам анодов. Поскольку автор использовал 8-проводные разъёмы, он получил кабель с 64 проводами, это значит что 4 осталось, они были замотаны изолентой. Также автор рекомендует использовать семь 8-проводных и взять один 4-проводной разъем для того, чтобы получилось ровно 60.

Шаг пятый. Прикрепление индикатора.
В акриловой пластине в виде диска делают отверстие и приклеивают индикатор с заранее припаянными проводами для удобства.

Шаг шестой. Плата.
Из куска макетной платы большего размера чем требуется, отрезают 2 куска, так чтоб они входили в картинную рамку. Далее, самостоятельно изготавливают несколько коннекторов, как видно на фото ниже.

Шаг седьмой. Сборка часов.
Дальше происходит установка всех деталей в корпус согласно схеме, прикреплённой ниже. В часы автор установил заряжаемый аккумулятор 1000мА/ч чтобы они могли работать без внешнего кабеля. На Arduino устанавливают программный код, прикреплённый внизу статьи. Так, устанавливаются библиотеки для модуля часов реального времени и LED драйвер TLC5940, которые также прикреплены под статьёй. Схема с хорошим разрешением:

В статье вы познакомитесь с отличным модулем часов реального времени на батарейке.

С помощью этого модуля можно отслеживать время в ваших проектах на Arduino даже в случае перепрограммирования или отключения питания. Это один из необходимых элементов для проектов будильников, сигнализаций, снятия показаний с датчиков в режиме реального времени. Одна из самых популярных моделей модуля часов реального времени - DS1307. Именно на нем мы и остановимся. Модуль отлично сочетается с микроконтроллерами Arduino, на которых питание логики равно 5 В.

Особенности модуля от компании-производителя Adafruit (китайцы предлагают аналогичные варианты раза в три-четыре дешевле):

  • Все включено: чип, обвязка, батарейка;
  • Легко собирается и прост в использовании;
  • Устанавливается на любую макетную плату или подключается напрямую с помощью проводов;
  • Есть отличные библиотеки и скетчи-примеры;
  • Два отверстия для монтажа;
  • Продолжительность работы - около пяти лет!

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

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

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

На большинстве микроконтроллеров, в том числе и Arduino, есть встроенный счетчик временни, который называется millis(). Есть и встроенные в чип таймеры, которые могут отслеживать более длительные промежутки времени (минуты или дни). Так зачем же вам отдельным модуль часов? Основная проблема в том, что millis() отслеживает время только с момента подачи питания на Arduino. То есть, как только вы отключили плату, таймер сбрасывается в 0. Вша Arduino не знает, что сейчас, например, четверг или 8-е марта. Все, чего вы можете добиться от встроенного счетчика - это "Прошло 14000 миллисекунд с момента последнего включения".

Например вы создали программу и хотите вести отсчет времени с этого момента. Если вы отключите питание микроконтроллера, счетчик времени собьется. Примерно так, как это происходит с дешевыми китайскими часами: когда садится батарейка, они начинают мигать с показанием 12:00.

В некоторых проектах Arduino вам понадобится надежный контроль времени без прерываний. Именно в таких случаях используется внешний модуль часов реального времени. Чип, который используется в подобных часах, отслеживает года и даже знает сколько дней в месяце (единственно, что обычно не учитывается - это переход на летнее и зимнее время, так как подобные переводы разные в разных частях мира).

На рисунке ниже показана материнская плата компьютера с часами реального времени DS1387. В часах используется литиевая батарея, поэтому они разрослись в размерах.

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

Пока батарейка в самом модуле не исчерпает свой заряд, DS1307 будет вести отсчет времени, даже если Arduino отключен от питания или перепрограммируется.

Узлы, из которых состоит модуль часов реального времени

Детали модуля часов реального времени DS1307 от компании Adafruit
Рисунок Обозначение Описание Производитель Количество
IC2 Чип часов реального времени DS1307 1
Q1 32.768 КГц, 12.5 пФ кристалл Generic 1
R1, R2 1/4 Вт 5% 2.2 КОм резистор Красный, Красный, Красный, Золотой Generic 2
C1 0.1 мкФ керамический конденсатор Generic 1
Рельса на 5 контактов (1x5) Generic 1
Батарейка 12 мм 3 В литиевая батарейка CR1220 1
12mm coin cell holder Keystone 3001 1
Плата Adafruit Industries 1

Сборка модуля часов реального времени

Сборка часов реального времени DS1307 компании Adafruit
Фото Пояснения

Подготовьтесь к сборке. Проверьте наличие всех необходимых деталей и инструментов. Установите монтажную плату в тисках.

Нанесите немного припоя на отрицательный контакт батареи.

Установите два резистора 2.2 КОм и керамический конденсатор. Как именно вы их расположите - неважно. Полярность не имеет значения. После этого установите кристалл (также симметрично), держатель (холдер) для батарейки и чип часов реального времени. Чип модуля реального времени надо установить таким образом, чтобы отметка (паз) на чипе располагалась в соответствии с обозначением на монтажной плате. Внимательно посмотрите на фото слева, там чип установлен верно.


Чтобы холдер для батарейки не выпадал, лучше его припаять сверху. После этого переверните плату и и припаяйте оставшиеся контакты.

Удалите остатки контактов от резисторов, кристалла и конденсатора.

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

Установите батарейку. Плоская часть батареи должна быть сверху. В среднем батарейка будет служить около 5 лет. Даже если батарейка села, не оставляйте слот для нее пустым.

Библиотека Arduino для работы с DS1307

DS1307 легко подключается к любому микроконтроллеру с питанием логики 5 В и возможностью I2C подключения. Мы рассмотрим подключение и использование этого модуля с Arduino .

Будем использовать библиотеку RTClib для получения и настройки показаний с DS1307. Если у вас есть вопросы по учтановке дополнительных библиотек Arduino - ознакомьтесь с этой инструкцией .

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

  • КУПИТЬ Arduino Uno R3 ;
  • КУПИТЬ Breadboard ;
  • КУПИТЬ модуль часов реального времени DS1307 ;

На часах реального премени 5 пинов: 5V, GND, SCL, SDA и SQW.

  • 5V используется для питания чипа модуля часов реального времени, когда вы делаете к нему запрос для получения данных о времени. Если сигнал 5 В не поступает, чип переходит в "спящий" режим.
  • GND - общая земля. Обязательно подключается в схему.
  • SCL - контакт i2c часов - необходим для обмена данными с часами реального времени.
  • SDA - контакт, по которому через i2c передаются данные с часов реального времени.
  • SQW дает возможность настроить вывод данных в виде square-wave. В большинстве случаев этот контакт не используется.

Если вы настроили аналоговый пин 3 (цифровой 17) в режим OUTPUT и HIGH, а аналоговый пин 2 (цифровой 16) в режим OUTPUT и LOW, вы можете запитывать часы реального времени непосредственно от этих контактов!

Подключите аналоговый пин 4 на Arduino к SDA. Аналоговый пин 5 на Arduino подключите к SCL.


Скетч для Arduino

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

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

Для начала давайте посмотрим, что произойдет, если мы извлечем батарейку и заменим ее на другую, пока Arduino не подключен к USB. Подождите 3 секунды и извлеките батарейку. В результате чип на часах реального времени перезагрузится. После этого вставьте код, который приведен ниже (код также можно выгрузить в меню Examples→RTClib→ds1307 в Arduino IDE) и загрузите его на Arduino.

Вам также понадобится библиотека OneWire.h, скачть ее можно

.

// функции даты и времени с использованием часов реального времени DS1307, подключенные по I2C. В скетче используется библиотека Wire lib

#include <Wire.h>

#include "RTClib.h"

Serial.begin(57600);

if (! RTC.isrunning()) {

Serial.println("RTC is NOT running!");

// RTC.adjust(DateTime(__DATE__, __TIME__));

DateTime now = RTC.now();

Serial.print("/");

Serial.print("/");

Serial.print(now.day(), DEC);

Serial.print(" ");

Serial.print(":");

Serial.print(":");

Serial.println();

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.println("d");

// рассчитываем дату: 7 дней и 30 секунд

DateTime future (now.unixtime() + 7 * 86400L + 30);

Serial.print(" now + 7d + 30s: ");

Serial.print(future.year(), DEC);

Serial.print("/");

Serial.print(future.month(), DEC);

Serial.print("/");

Serial.print(future.day(), DEC);

Serial.print(" ");

Serial.print(future.hour(), DEC);

Serial.print(":");

Serial.print(future.minute(), DEC);

Serial.print(":");

Serial.print(future.second(), DEC);

Serial.println();

Serial.println();

Теперь откройте окно серийного монитора и убедитесь, что скорость передачи данных установлена корректно: на 57600 bps.

В результате вы должны увидеть в окне серийного монитора примерно следующее:


Если в часах реального времени пропадет питание, отобразится 0:0:0. Секунды отсчитываться перестанут. После настройки времени, пойдет новый отсчет. Именно по этой причине извлекать батарейку во время работы модуля часов реального времени нельзя.

Настройка времени на модуле часов

В этом же скетче раскомментируйте строку, которая начинается с RTC.adjust:

// строка ниже используется для настройки даты и времени часов

RTC.adjust(DateTime(__DATE__, __TIME__));

Процесс настройки даты и времени реализован очень элегантно. В эту строку попадают данные с вашего счетчика на персональном компьютере (в момент компилляции кода). Эти данные используются для прошивки вашего модуля часов реального времени. То есть, если время на вашем ПК настроено неверно, рекомендуем сначала исправить этот баг, а потом переходить к прошивке модуля часов для Arduino.

После настройки, откройте серийный монитор и убедитесь, что часы настроены корректно:


Все. С этого момента и на протяжении ближайших нескольких лет настраивать DS1307 не придется.

Считывание показаний времени с DS1307

После настройки часов реального времени DS1307, может отправлять к ним запросы. Давайте рассмотрим часть скетча, в которой реализованы эти запросы.

DateTime now = RTC.now();

Serial.print(now.year(), DEC);

Serial.print("/");

Serial.print(now.month(), DEC);

Serial.print("/");

Serial.print(now.day(), DEC);

Serial.print(" ");

Serial.print(now.hour(), DEC);

Serial.print(":");

Serial.print(now.minute(), DEC);

Serial.print(":");

Serial.print(now.second(), DEC);

Serial.println();

По сути существует один вариант для получения времени с использованием часов реального времени. Для этого используется функция now(), которая возвращает объект DateTime. В этом объекте содержаться данные про год, месяц, день, час, минуту и секунду.

Есть ряд библиотек для часов реального времени, в которых предусмотрены функции вроде RTC.year() и RTC.hour(). Эти функции вытягивают отдельно год и час. Но их использование сопряжено с рядом проблем: если вы сделаете запрос на вывод минут в момент времени, например, 3:14:59, то есть, прямо перед тем как показания минут должны приравняться к "15" (3:15:00), полученные данные будут равны 3:14:00 - то есть, вы потеряете одну минуту.

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

Есть еще один формат данных, которые мы можем подучить - количество секунд от полуночи, 1-го января 1970 года. Для этого используется функция unixtime ():

Serial.print(" since 1970 = ");

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.print(now.unixtime() / 86400L);

Serial.println("d");

Так как в одном дне 60*60*24 = 86400 секунд, можно перевести полученное значение в дни и года. Очень удобный вариант, если вам надо отследить, сколько времени прошло с момента последнего запроса. Например, если прошло 5 минут с момента последнего последнего обращения Arduino к часам реального времени DS1307, значение, которое вернет функция unixtime() будет больше на 300.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Итак, часы реального времени. Эта полезная штучка решает большинство полезных задач, связанных со временем. Допустим управление поливом в 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 iarduino_RTC time(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мс } }

#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 iarduino_RTC time(RTC_DS1302,6,7,8); void setup() { delay(300); Serial.begin(9600); time.begin(); } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } }