Точные часы для ардуино

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

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

Описание компонентов

В нашем проекте мы используем:

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

Мы используем модуль с часами реального времени от Seeed Studio. Они построены на базе микросхемы DS1307 от Maxim Integrated. Из элементов обвязки она требует три резистора, часовой кварц и батарейку, которые уже имеются на данном модуле. Модуль обладает следующими свойствами:

Суть часов реального времени в том, что при наличии батарейки, они могут идти даже если основное устройство обесточено. Мы с такими часами сталкиваемся постоянно в ноутбуках или цифровых фотоаппаратах. Если достать из этих устройств аккумулятор, а через некоторое время вернуть их обратно, то время не сбросится. В этом заслуга часов реального времени, Real Time Clock (RTC).

Все необходимые библиотеки можно скачать с официального сайта.

Индикатор

Мы используем четырёхразрядный индикатор от Seeed Studio. Основное в индикаторе — микросхема TM1637, представляющая собой драйвер для отдельных 7-сегментных разрядов. В данном модуле используется 4 разряда. Модуль обладает следующими свойствами:

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

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

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

Подключение

Модуль часов реального времени необходимо подключить к выводам SCL/SDA, относящимся к шине I²C. Также необходимо подключить линии питания (Vcc) и земли (GND).

Линии SDA/SCL имеют собственные отдельные пины на Arduino, однако внутри они так или иначе подключены к пинам общего назначения. Если рассмотреть Arduino Uno, линии SDA соответствует пин A4, а SCL — A5.

В комплекте с модулем поставляется шлейф с мама-контактами, которые удобнее подключать к Troyka Shield. Однако отдельные пины SDA и SCL на ней не выведены, поэтому мы осуществили подключение прямо через пины A5 и A4.

В плане подключения индикатора — все гораздо проще. Выводы CLK и DIO можно подключить к любым цифровым выводам. В данном случае используются 12-й и 11-й выводы соответственно.

Написание прошивки

Функция setup должна инициализировать часы реального времени и индикатор, а также записывать время компиляции во внутреннюю память часов реального времени. Все действие, а точнее, чтение времени из RTC и вывод его на индикатор, будет производиться в функции loop .

Код для этого выглядит следующим образом:

Теперь загружаем этот код в среду разработки, компилируем и заливаем. Смотрим на дисплей — бинго! Время на дисплее — время компиляции.

Объяснение функции getInt

Для начала необходимо понять, откуда же в массиве compileTime появляется время. Оно появляется в этой строчке:

unsigned char compileTime[] = __TIME__;

Компилятор вместо __TIME__ подставляет строку, содержащую время компиляции в виде __TIME__ = «hh:mm:ss» , где hh — часы, mm — минуты, ss — секунды.

Вернемся к коду, который необходимо объяснить:

В массиве string , передаваемом в качестве параметра в функцию getInt , мы получаем символ с индексом startIndex и следующий за ним, чтобы в итоге получить двухзначное целое число. Однако, изначально это не число, а пара символов. Чтобы получить число по символу, нам необходимо вычесть из этого символа символ нуля ( ‘0 ‘): ведь в таблице ASCII все символы цифр идут одна за другой, начиная с символа нуля. Поэтому код int(string[startIndex]) — ‘0’) , дословно, делает следующее: «Берем символ номер startIndex , вычитаем из него символ нуля и переводим в целочисленный тип».

Проблемы

Да, этот код рабочий, и часы будут идти. Однако, если отключить питание, а через несколько минут включить, то после включения время время вновь станет тем, которое было при компиляции.

Это происходит потому что после включения питания, вновь исполняется код, находящийся в функции setup . А он записывает в часы реального времени старое значение времени.

Чтобы этого избежать, нам необходимо еще чуть-чуть модифицировать код. Каждый раз в функции setup будет происходить подсчет «хэша» времени компиляции — будет рассчитываться количество секунд, прошедшее с 00:00:00 до времени компиляции. И этот хэш будет сравниваться с хэшем в EEPROM. Напомним EEPROM — память, которая не обнуляется при отключении питания.

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

Для записи/чтения числа типа unsigned int в/из EEPROM написаны две дополнительные функции EEPROMWriteInt и EEPROMReadInt . Они добавлены потому что функции EEPROM.read и EEPROM.write могуть читать и писать только данные типа char .

Заключение

В данной статье был показан пример работы с микросхемой часов реального времени RTC DS1307 и микросхемой-драйвером индикатора TM1637, также мы научились получать дату и время на этапе компиляции. Теперь, если выставить нужное время на часах, а потом отключить питание хоть на несколько часов, то после включения время вновь будет точным. Проверено!

Источник

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Arduino и точные часы реального времени DS3231

Все мы знаем, что большинство микроконтроллеров, которые мы используем для наших проектов, не знают о текущем времени. Это нормально для большинства наших проектов, но время от времени, когда вы сталкиваетесь с идеей, в которой основное внимание уделяется получению точного значения времени, модуль часов реального времени DS3231 является спасителем. Он идеально подходит для проектов, предполагающих регистрацию данных, создание часов, таймеров и сигналов тревоги.

В основе модуля лежит недорогая, чрезвычайно точная микросхема часов реального времени (RTC) от Maxim – DS3231. Она управляет всеми функциями хронометража и имеет простой двухпроводной интерфейс I2C, который можно легко подключить к любому микроконтроллеру по вашему выбору.

Чип хранит информацию о секундах, минутах, часах, днях, месяце и годе. Дата в конце месяца автоматически корректируется для месяцев, в которых менее 31 дня, включая поправки для високосного года (действует до 2100). Часы работают в 24-часовом или 12-часовом формате с индикатором AM/PM. Они также обеспечивают два программируемых времени суток.

Еще одна интересная особенность этой платы – вывод SQW, который выводит хороший прямоугольный сигнал на частотах 1 Гц, 4 кГц, 8 кГц или 32 кГц и может обрабатываться программно. Это может также использоваться как прерывание во многих основанных на времени приложениях.

Большинство модулей RTC поставляются с внешним резонатором 32 кГц для сохранения времени. Но проблема с этими резонаторами в том, что внешняя температура может влиять на частоту их колебаний. Это изменение частоты может быть незначительным, но они, безусловно, складываются. Чтобы избежать таких небольших дрейфов, DS3231 приводится в действие кварцевым генератором с температурной компенсацией 32 кГц (TCXO). Он очень невосприимчив к внешним изменениям температуры. TCXO имеется внутри чипа RTC, что делает весь корпус немаленьким. Прямо рядом со встроенным кристаллом находится датчик температуры. Этот датчик компенсирует изменения частоты, добавляя или удаляя такты часов, так что хронометраж остается актуальным. Вот почему TCXO обеспечивает стабильные и точные эталонные значения времени и поддерживает работу RTC с точностью до ±2 минуты в год.

Основное различие между DS3231 и DS1370, который довольно популярен в связи с дешевизной, заключается в точности учета времени. DS1307 поставляется с внешним резонатором 32 кГц для хронометража, частота колебаний которого легко зависит от внешней температуры. Обычно это приводит к тому, что часы отстают примерно на пять минут в месяц. Тем не менее, DS3231 гораздо точнее, поскольку поставляется с внутренним кварцевым генератором с температурной компенсацией (TCXO), который не зависит от температуры, что делает его точным до нескольких минут в год в среднем.

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

На нижней стороне платы находится держатель для 20-миллиметровых 3V литиевых батареек. Любая батарея CR2032 может поместиться в этот разъем. Предполагая, что используется полностью заряженная батарея CR2032 емкостью 220 мАч, а чип потребляет минимум 3 мкА, батарея может поддерживать RTC в течение минимум 8 лет без внешнего источника питания 5 В (220 мАч / 3 мкА = 73333,34 часа = 3055,56 дня = 8,37 года).

Модуль DS3231 RTC также поставляется с 32-байтовым EEPROM чипом 24C32 от Atmel с неограниченным циклом чтения-записи. Он может быть использован для сохранения настроек или чего угодно. 24C32 EEPROM использует интерфейс I2C для связи и использует ту же шину I2C, что и DS3231. Адрес I2C EEPROM можно легко изменить с помощью трех перемычек припоя A0, A1 и A2 на задней панели.

Согласно спецификации 24C32, эти 3 бита размещаются в конце 7-битного адреса I2C, непосредственно перед битом чтения/записи. За счет короткого замыкания паяных перемычек адресные входы обнуляются. Это позволяет вам установить адрес I2C в соответствии с таблицей ниже.

Модуль DS3231 RTC имеет всего 6 контактов, которые связывают его с внешним миром. Соединения следующие:

Давайте подключим DS3231 к Arduino. Связь довольно проста. Начните с подключения контакта VCC к выходу 5V на Arduino и заземления. Теперь мы остаемся с выводами, которые используются для связи I2C. Обратите внимание, что каждая плата Arduino имеет разные контакты I2C, которые должны быть подключены соответствующим образом. На платах Arduino с разметкой R3 SDA (линия передачи данных) и SCL (линия синхронизации) находятся на разъемах выводов рядом с выводом AREF. Они также известны как A5 (SCL) и A4 (SDA). Если у вас есть Arduino Mega, контакты будут другие. Вы будете использовать цифровые 21 (SCL) и 20 (SDA). Принципиальная схема подключения DS3231 и Arduino Uno следующая:

Общение с модулем RTC – это куча работы. К счастью, была написана библиотека RTClib, чтобы скрыть все сложности, и мы могли выполнять простые команды для чтения данных RTC. Чтобы установить библиотеку, перейдите в раздел Sketch (Скетч) – Include Library (Включить библиотеку) – Manage Libraries (Управление библиотеками). Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.

Отфильтруйте результаты поиска, набрав «rtclib». Там должны выйти пара записей. Ищите RTClib от Adafruit. Нажмите на эту запись, а затем выберите Install (Установить).

Следующий код программы даст вам полное понимание того, как установить/прочитать дату и время на модуле DS3231 RTC, этот скетч может послужить основой для более практических экспериментов и проектов.

Вот как выглядит вывод данных в последовательном мониторе.

С модулем DS3231 RTC в качестве бонуса вы получаете 32 байта электрически стираемого ПЗУ. Его содержимое не будет удалено, даже если основное питание устройства будет прервано. Следующая программа пишет, а затем читает сообщение из 24C32 EEPROM. Вы можете использовать эту программу для сохранения настроек или паролей или чего угодно.

Источник

OLED часы на arduino

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

Список необходимых компонентов:

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

после загрузки скетча у нас на дисплее отобразятся часы как на фото

Как видим все отображается нормально, но что бы добавить русские названия дней недели нам потребуется инициализировать русские шрифты добавив строку в скетч

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

и еще закомментируем строки

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

теперь изменим отображения месяца, добавив в скетч строки

Почему надписи в скетче отображаются непонятным набором символов читайте в этой статье Русские и украинские шрифты для OLED I2C дисплея

Теперь наши часики будут выглядеть как на фото.

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

Ну а теперь, еще более усовершенствуем наши OLED часы и добавим к ним отображение температуры, которую мы будем считывать с датчика температуры DS18B20.

Для отображения рисунка с градусником на OLED дисплее и значка градуса выберем картинку с рисунком градусника и с помощью графического редактора сохраним ее в формате GIF с именем term.gif, и тоже самое проделаем с картинкой с значком градуса — сохраним ее как grad.gif.

картинки должны быть двухцветными (белый и черный), доступные форматы картинок png, jpg, gif

У меня картинка term.bmp имеет размеры 19×40 пикселей, а картинка grad.bmp 13×12 пикселей. Потом нам потребуется конвертировать две картинки с помощью онлайн-сервиса www.rinkydinkelectronics.com

выбираем наш файл изображения и жмем Make File

Жмем на Click here to download your file и сохраняем файл grad.c в папку с нашим скетчем, тоже самое проделываем с другим изображением. Сохраняем и закрываем скетч. При повторном открытии он будет иметь еще две вкладки с файлами изображений.

После этого добавим две строки в скетч, которые инициализируют наши файлы изображений

а потом отобразим наши изображения на экране OLED дисплея, добавив строки

Добавим в наш скетч на два цикла. В первом цикле у нас будет отображаться время – назовем его void watch(); Второй цикл будет считывать и отображать температуру void temp();

А в основном цикле void loop(); пропишем для ротации циклов несколько строчек кода

В цикле void temp(); пропишем кусочек кода для считывания и отображения температуры

В цикле void watch(); пропишем наш код, который отвечает за отображение времени

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

Источник

Adblock
detector