Arduino подключение часов реального времени ds3231. DS3231 – подключение часов реального времени. Где скачать скетч и программу

Зачем всё это нужно?

60сек * 60мин *24 часа * 365 дней = 31 536 000 секунд в году.

На каждый из этих миллионов 2 секунды может уходить в ту или иную сторону. 31,5 миллион делим на миллион и умножаем на 2: получаем 63 секунды в год (максимум). Приемлемый вариант? Весьма. Но 1 раз в полгода я бы синхронизировал время, чтобы оно укладывалось в 1 минуту.

Какими способами вообще можно устанавливать время на часах модуля?

Традиционно, начиная с модуля DS3107, время устанавливалось при помощи скетча для Arduino из числа примеров использования библиотеки. Алгоритм такой: открываем скетч, жмём «компилировать и закачать», и при первом запуске контроллера время устанавливается. Остался вопрос: какое время? Откуда Arduino может узнать, какое именно время устанавливать? А очень просто – время компиляции скетча. Однако с таким подходом я вижу несколько недостатков:
  • время компиляции зависит от «мощи» компьютера;
  • время закачивания зависит от скорости передачи скомпилированного скетча в плату Arduino;
  • закачанный скетч – «одноразовый» (устаревает сразу же после закачивания в Arduino).
Как можно «извернуться», чтобы обойти эти ограничения? Ну, например, зная (экспериментально установив) время компилирования, можно «загнать» часы на компьютере на это время вперёд. Потом запустить компиляцию, прошить плату, и время установится. Плюс метода – относительная простота. Минусы – относительно неудобно, относительно неточно, одноразовый способ.

Что ещё можно придумать? Можно, например, выставлять требуемое время в скетче вручную, предусмотреть кнопку, нажатие на которую в нужный момент выставит «руками» указанное время, например, через 2 минуты от текущего момента: пока «зальётся» скетч, пока подготовимся отследить вручную тот самый нужный момент нажатия кнопки, как раз та пара минут и пройдёт. А дальше, глядя на часы в компьютере, дожидаться «того самого» момента, чтобы нажать кнопку. Плюсы – сложнее предыдущего способа, но всё ещё относительно просто, однако точнее, чем первый способ. Минусы – этот способ ещё неудобнее, дольше, всё равно скетч «одноразовый».

Кто виноват и что делать?

Задав себе эти два риторических вопроса, я полез в Интернет искать, кто уже написал синхронизацию времени модуля часов с компьютером. И, как известно, кто ищет – тот всегда находит. Нашёлся вариант с . В теории всё просто: обычный «батник» парсит текущее полное время, полученное «первым» способом (потому что кроме самого времени нужна ещё и дата), увеличивает время на 2 секунды, и «гоняет» пустой цикл до момента, когда настанет это новое, «плюс_две_секундное», время, чтобы «вышвырнуть» данные в COM порт. Причём «новое плюс_две_секундное» время отслеживается другим способом (через %time%, если кому интересно). Но о «косяках» такого решения позже. Данные, «вышвырнутые» в COM порт, Arduino парсит и после этого устанавливает время в модуле. Вроде всё просто, логично и удобно. Но есть очень нехорошее слово «НО». Всё это писал вроде бы немец, и региональные стандарты в Windows у него отличаются от «наших», а в частности, дробная часть отделяется точкой, а не запятой. При запуске с отечественными региональными стандартами «батник» не работает, потому что в нём время выхода из пустого цикла описывается условием сравнения с XX:XX:XX.xxx. Ну так надо вместо точки поставить запятую – и всё, «я всё починил». А вот и не всё (можете проверить, кто ещё помнит, что за такое зло – программировать в «батниках»). Нужно исправлять «батник» более серьёзно. И я его исправил, используя «маты-перематы» и «мануалку» для DOS. «Батник» исправил, но скетч всё равно не работал – время не устанавливалось. То есть данные в порт слались, Arduino их видел, но «что-то пошло не так».

Давайте взглянем, что шлёт «батник» в Arduino и в каком формате (справочно).

Case 83: //S = second case 68: //D = Minute (Daghigheh in Persian) case 72: //H = Hour case 84: //T = Day Of Month (Tag in German) case 77: /// M = Month case 74: /// J = Year (Jahr in German)
Данные шлются в формате S**~D**~H**~T*~M**~J****~, где ~ - 2 байта перевода каретки. Итого, 31 байт. Вроде немного, пришлются данные быстро.

Однако есть и неудобство – как видим, не шлётся день недели. Только день месяца. Для реализации часов с будильниками, зависящими от дней недели, будет «косяк». День недели придётся выставлять «ручками» в скетче, что опять намекает на некоторую «одноразовость» скетча, его неполноценность.

Складывая факторы – неполноценность скетча «с завода», его отказ нормально работать, необходимость исправления «батника» для «наших» широт – я решил разрабатывать всё свое. А раз так, то я могу устранять недостатки и оптимизировать формат данных.

Software и hardware.

Для того, чтобы всё заработало, нужны 2 составляющие: программа для Windows и аппаратно-программная связка Arduino.

Сначала общие данные по протоколу обмена. Коль скоро я стал волен выбирать формат данных для пересылки, я решил, что пересылка 31 байта информации не рациональна, и сократил передаваемые данные до 4 байт. И что, хватило? Что можно поместить в 4 байта? Да, хватило. Поместилось все, что надо. Уверен, многие догадались, что это за 4 байта. Кто не догадался – процитирую фрагмент статьи из Википедии:

UNIX-время (POSIX-время) - система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг).
UNIX-время представлено целым числом, которое увеличивается с каждой прошедшей секундой без необходимости вычислений для определения года, месяца, дня, часа или минуты для удобства восприятия человеком. Современное UNIX-время согласуется с UTC - отсчет происходит в секундах СИ.

Итак, целое число, хранящее UNIX время, занимает 4 байта, чего хватит до 2 147 483 648 секунд. А потом возможны потенциальные проблемы. Почему потенциальные? Потому что это порог, при достижении которого число может быть интерпретировано, как отрицательное (что и с айфонами многих любопытных товарищей в своё время). Может, но не обязательно будет – зависит от того, растут ли руки программистов из места, предусмотренного природой. Указанное число секунд соответствует 03:14:08 19-янв-2038. До этого времени можно неспешно переходить на 64-битную версию ОС, где время станет храниться в 8-байтной переменной, чего без проблем хватит на следующие 292 миллиарда лет. Существует вероятность, что на наш век этого хватит. А потом придётся обновляться до 128-битной версии UNIX.

Какие проблемы я решил, придя к такому варианту? Первое, сильно снизил количество передаваемых байт, что на миллисекунды увеличивает точность установки времени. Здорово, правда? И второе: я (вероятно) облегчил совместимость с Linux. К моему стыду, я никак не могу привыкнуть к Linux, и пользуюсь в основном только Windows. Для этой самой Windows я могу написать программу пересылки, а для Linux – нет. Но полагаю, что в Linux можно получить значение UNIX-времени намного легче, чем в Windows, и переслать это число в COM порт.

Никаких дополнительных данных, вроде дня недели и так далее, передавать не требуется. Только UNIX время. Всё остальное делается в Arduino.

Теперь немного конкретики непосредственно о первой составляющей – программе для Windows. Программа написана в старой-доброй Delphi. При запуске всплывающее окно просит выбрать COM порт для отправки данных. Выбираем. Остальные настройки следует оставить «дефолтными».

Как работает программа? Она пересчитывает из формата времени Windows данные для формата UNIX, то есть число секунд с полуночи 1 января 1970 года. Затем добавляет 3 секунды и «впадает» в пустой цикл (очевидно, длительностью уже менее тех самых добавочных 3 секунд), выход из которого происходит в нужное количество секунд, как можно ближе к 000 миллисекундам. Иначе говоря, отслеживается наступление самого начала той секунды времени, значение которого должно будет переслаться в Arduino. Согласитесь, пересылать данные о том, что, например, сейчас XXXXXXXXX5 секунд тогда, когда на самом деле уже, например, XXXXXXXXX5 и 756 тысячных (например) секунд, было бы не правильным. Именно для этого нужно отслеживать самое начало секунды для старта передачи данных. После передачи данных программа дружелюбно сообщает статус «Done:)». На этом миссия программы завершается.


Вторая составляющая – аппаратно-программная часть – Arduino. Существует 2 разновидности «железа» для этого проекта: «полная» версия с экраном и кнопкой, и «урезанная» версия для быстрой установки времени модуля, собранная из «г**на и палок». Про их отличия – ниже. «Полная» версия состоит из Arduino Nano, экрана 1602 с «переходником» с I2C в экран, опциональной кнопкой ресета Arduino и пин-хедера(female) для подключения модуля часов. Также, опционально, из корпуса девайса с «няшной» наклейкой. «Урезанная» версия состоит из Arduino (Uno, Nano, Pro Mini + «правильный» переходник на USB с DTR) и 4 проводов для подключения модуля часов.



Как видно из схем, «полная» версия, в дополнение к «урезанной», содержит кнопку для reset"а и экран 1602 с «переходником». Обе версии абсолютно одинаковы по основному функционалу – устанавливать время. Экран нужен лишь для отображения этапов процесса и, по окончании процесса установки времени, отображения свежеустановленных времени, даты и дня недели. Причём данные к тому времени будут уже считываться из самого модуля часов. В «урезанной» версии роль экрана выполняет встроенный в плату Arduino светодиод: по окончании процесса установки нового времени он начнет светиться. Вот и вся индикация.

Для чего же кнопка ресет? Для того, что в полной версии после установки времени Arduino войдёт в бесконечный цикл по отображению того самого свежеустановленного времени, то есть, по сути, станет часами. Причём часами, сделанными на скорую руку, в связи с чем они не смогут заменить нормальные часы в силу нескольких причин (выборка секунд реализована через delay, пропадёт отображение времени при отключении питания). Ведь цель – убедиться, что время синхронизировано верно, не более того. Следовательно, для синхронизации следующего модуля часов без ресета не обойтись (точнее, можно обойтись, если «передёрнуть» USB кабель). Другими словами, назначение кнопки – сугубо утилитарное. При желании, можно обойтись и без неё.

Как же прошивать Arduino, ведь версии «железа» две, а скетч один? Для компиляции «правильной» версии прошивки в заголовке скетча нужно установить желаемое значение параметра fullVersion: true для «полной» версии, или false - для «урезанной». Компилятор таким образом определит, для какой версии «железа» компилировать прошивку.

Итак, схема подключения есть, нужен код скетча. Обратите внимание, что для нормальной работы скетча с «полной» версией нужна библиотека LiquidCrystal I2C by Frank de Brabander (устанавливается из репозитория при помощи Менеджера Библиотек). Также нужна библиотека для поддержки модуля часов, причём не любая:). Качать здесь: . С библиотеками разобрались.

Вот код скетча:

//======================================== настройка, доступная для изменения ======================================== #define fullVersion true //true = "полная" версия с экраном; false = "урезанная" версия со встроенным светодиодом //================================= используемые библиотеки и объявление переменных ================================== #include #include #if (fullVersion) #include #endif unsigned long t1 = 0; //переменная для полученного времени unsigned long t2 = 0; //переменная для полученного времени byte b; //буфер для получения данных из COM порта #if (fullVersion) byte day = 0; #endif DS3231 clock; RTCDateTime dat1; #if (fullVersion) LiquidCrystal_I2C lcd(0x3F,16,2); //китайси полюбили новый адрес для "переходников" с i2c в экран #endif //==================================================================================================================== void setup(){ #if (!fullVersion) //актуально только для "урезанной" версии - начало участка кода pinMode(13, OUTPUT); digitalWrite(13,LOW); #endif //актуально только для "урезанной" версии - конец участка кода clock.begin(); Serial.begin(9600); #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("COMport 9600 8N1"); //подсказка, какие параметры COM порта выбирать в программе lcd.setCursor(0,1); lcd.print("Ready to sync"); //сообщение статуса - готовы к синхронизации delay(1000); #endif //актуально только для "полной" версии - конец участка кода } void loop(){ if (Serial.available()){ //если есть "порох в пороховницах" COM порта Serial.readBytes(b,4); //считаем все 4 байта (другого мы и не ждём) t1=b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Пара фото «полной» версии готового девайса.


Ну и, наконец, видео работы девайса «в бою»:

Где скачать скетч и программу?

Скетч качать (Dropbox).
Программу для Windows качать (Dropbox).

«Плюсы» и «минусы».

Сформулировать «плюсы» и «минусы» в данном случае тяжело. Следовательно, каждый решает для себя сам, что – хорошо, а что – плохо.

Итого.

Мне очень понравилось, как теперь устанавливается время в модулях! При необходимости установить время мне не приходится вспоминать каждый раз, какой же там скетч мне нужен и задумываться, насколько точно будет установлено время в модуле. Более того, скоро будет обзор самодельных часов, куда я встроил такой метод синхронизации – настолько метод мне понравился. Надеюсь, кому-то из читателей метод также придётся кстати.

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

Всем добра.

Планирую купить +48 Добавить в избранное Обзор понравился +60 +114

Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла. Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания. Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.

Технические параметры

Напряжение питания: 3.3В и 5В
Чип памяти: AT24C32 (32 Кб)
Точность: ± 0.432 сек в день
Частота кварца:32.768 кГц
Поддерживаемый протокол: I2C
Габариты: 38мм x 22мм x 15мм

Общие сведения

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.


Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях). Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы. Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля. Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.Назначение J1
32K: выход, частота 32 кГц
SQW: выход
SDA: линия данных (Serial Dфta)
VCC: «+» питание модуля
GND: «-» питание модуля Назначение J2
SCL: линия тактирования (Serial CLock)
SDA: линия данных (Serial Data)
VCC: «+» питание модуля
GND: «-» питание модуля


Немного расскажу, о микросхеме AT24C32N, это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64). Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57.

Подключение DS3231 к Arduino

Необходимые детали:
Arduino UNO R3 x 1 шт.
Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.
Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
Кабель USB 2.0 A-B x 1 шт.

Подключение:
В данном примере буду использовать только модуль DS3231 и Arduino UNO R3, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.

Установка времени DS3231
При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» -> «Примеры» -> «DS3231» -> «Arduino» -> «DS3231_Serial_Easy», или скопируйте код снизу

/* Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 31.08.2018г. */ #include // Подключаем библиотеку Wire DS3231 rtc(SDA, SCL); // Инициализация DS3231 void setup() { Serial.begin(115200); // Установка последовательного соединения rtc.begin(); // Инициализировать rtc // Установка времени rtc.setDOW(FRIDAY); // Установить день-недели rtc.setTime(16, 29, 0); // Установить время 16:29:00 (формат 24 часа) rtc.setDate(31, 8, 2018); // Установить дату 31 августа 2018 года } void loop() { Serial.print(rtc.getDOWStr()); // Отправляем день-неделя Serial.print(" "); Serial.print(rtc.getDateStr()); // Отправляем дату Serial.print(" -- "); Serial.println(rtc.getTimeStr()); // Отправляем время delay (1000); // Задержка в одну секунду }

Тестирование производилось на Arduino IDE 1.8.0

Дата тестирования 31.08.2018г.

#include // Подключаем библиотеку Wire

DS3231 rtc (SDA , SCL ) ; // Инициализация DS3231

void setup ()

Serial . begin (115200 ) ; // Установка последовательного соединения

rtc . begin () ; // Инициализировать rtc

// Установка времени

rtc . setDOW (FRIDAY ) ; // Установить день-недели

rtc . setTime (16 , 29 , 0 ) ; // Установить время 16:29:00 (формат 24 часа)

void loop ()

Serial . print (rtc . getDOWStr () ) ; // Отправляем день-неделя

Serial . print (" " ) ;

Serial . print (rtc . getDateStr () ) ; // Отправляем дату

Serial . print (" -- " ) ;

Serial . println (rtc . getTimeStr () ) ; // Отправляем время

delay (1000 ) ; // Задержка в одну секунду

Загружаем скетч в контроллер Arduino и открываем «Мониторинг порта»

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

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


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

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

Часы умеют производить подсчёт часов, минут, секунд, дат, месяцев, лет (високосные года учитываются до 2100 года). Работают в 12 или 24 часовом режиме, содержат два будильника, а так же имеют внутренний термометр, с диапазоном от -40 ° C до + 85 ° C. Для подключения к различным устройствам, часы подключаются по I2C интерфейсу.


Расположение и назначение пинов на модуле ZS-042:

SQW - Программируемый выход Square-Wave сигнала.

SCL Через этот пин по интерфейсу I2C происходит обмен данными с часами.

SDA Через этот пин передаются данные с часов.

VCC Питание часов реального времени, нужно 5 вольт. Если на этот пин не поступает напряжение, часы переходят в спящий режим.

GND - Земля.

Для подключения к Arduino UNO, пин SDA часов подключаем к пину A4, а пин SCL к A5. Для питания используются пины GND(-) и VCC(+5v).

Пины SDA и SCL на разных платах Arduino:

SDA SCL
UNO A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Установим батарейку CR2032 в часы, такие элементы используются для питания BIOS в компьютерах.

При подключении USB кабеля к Arduino, на часах должен загореться светодиод «POWER » (красный светодиод).

Для того что бы запрограммировать часы через Arduino IDE нужно установить библиотеки.

Скачать библиотеку Time и DS1307RTC .

Последняя библиотека была написана для часов на микросхеме DS1307, но её протоколы взаимодействия совместимы с DS3231, поэтому библиотека подойдёт к нашим часам.

Библиотеки нужно скачать, распаковать и поместить в папку « libraries ». При запуске Arduino IDE, они с примерами должны появится в «Образцах ».

Устанавливаем Дату и время.

Для этого скопируем данный код в Arduino IDE.

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

setTime(13,35,0,22,12,2016);



В скобках через запятую устанавливаем правильные: часы, минуты, секунды, число, месяц, год. У меня в примере установлено 13 часов 35 минут 0 секунд, 22 декабря 2016 год. Вгружаем скетч в Arduino.

Теперь для того что бы прочитат ь показания из часов, можно воспользоваться примером: «Файл » - «Образцы » - «DS1307RTC » - «ReadTest » и за грузить его в Arduino.

В открывшемся окне будет отображаться текущие дата и время. Если отключить питание модуля часов от Arduino, Arduino не сможет отслеживать значения и в мониторе через какое то время появится надпись "...read error! " (выделил красным). После возобновления питания, показания даты и времени будут отсчитываться далее. Показания даты и времени не сбросились, поскольку часы питались от своей батарейки CR2032.

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

Технические характеристики устройства

Базовая информация

Большая часть микросхем, аналогичных одной из самых доступных типов модульного устройства часов реального времени DS1307, применяется схема простого кварцевого генератора. DS3231 arduino подключение , которого не представляет никакой сложности. Данная схема выполнена на двух транзисторах с рабочей частотой 32 кГц. Однако и в этих приборах имеется свое несовершенство, так при различных температурных составляющих изменяется диапазон частот у кварца. А это в свою очередь создает неточность при обработке и подсчете времени.

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

Само устройство собрано на основе чипа DS3231N. Чтобы подтянуть линии 32K, SQW, SCL и SDA была применена сборка из резисторов RP1 с номиналом 4.7 кОм. Но здесь нужно учитывать одну зависимость. При использовании некоего количества приборов с шиной обеспечивающей передачу информации через интерфейс I2C, тогда нужно убрать резисторы на остальных модулях. Другая резисторная сборка, также служащая для поддержания стабильного уровня нуля на линиях A0, A1 и A2 и для изменения памяти адреса у микросхемы AT24C32N.

Подзарядка аккумулятора

Для обеспечения подзарядки аккумулятора служит цепочка, собранная на сопротивлении R5 и выпрямительном диоде D1. Вообще то эту цепь можно убрать, поскольку дисковые литиевые элементы SR2032 могут служить много лет. Светодиод визуальной индикации, включенный через сопротивление R1 показывает, что модуль включен и готов к работе. Так как DS3231 arduino подключение выполнено по интерфейсной шине I2C, то для удобства использования электрические шины поданы на два коннектора J1 и J2. Для чего служат другие контакты — показано в таблице ниже.

Функции J1

Функции J2

Что касается электронного компонента памяти AT24C32N, то он упрятан в корпус SOIC8, работает по сдвоенному интерфейсному проводнику I2C. Фиксированный адрес чипа AT24C32N — 0x57, но в случае нужды его несложно изменить, установив перемычки A0, A1 и A2. Поскольку в приборе AT24C32N реализовано три входных адреса A0, A1 и A2, способные быть в двух положениях: LOG-1 или LOG-0. Микросхема способна работать на восемь адресов, начиная от 0x50 и заканчивая 0x57.

Подключение DS3231 к Arduino

Компоненты для подключения:

Принцип подключения:

В этой иллюстрации покажу как делать DS3231 arduino подключение используя только приборы DS3231 и Arduino UNO R3, необходимая информация будет поступать на все данные будут передаваться в «Port Monitor». Сложного в схеме ничего нет, для подключения нужно две пары проводов. Первым делом подключается интерфейсный проводник I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), теперь подается напряжение питание GND к GND и VCC к 5V. Возможно подать и 3.3v, на этом подключение завершилось.

Для нормальной работы устройства DS3231 требуется библиотека, которая отсутствует в программе разработки Arduino, поэтому ее нужно скачать здесь и встроить в программу разработки. Скачать: DS1307RTC и TimeLib

Настройка и установка времени DS3231

Прежде, чем включать устройство нужно запустить процесс программирования времени, для этого необходимо взять из библиотеки DS1307RTC в качестве примера файл. Делается это так: -> «Файл» -> «Примеры» -> «DS1307RTC» -> «SetTime», либо можно взять готовый код расположенный ниже.

Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 16.01.2017г. */ #include // Подключаем библиотеку Wire #include // Подключаем библиотеку TimeLib #include // Подключаем библиотеку DS1307RTC const char *monthName = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; tmElements_t tm; void setup() { bool parse=false; bool config=false; // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true; // and configure the RTC with this info if (RTC.write(tm)) { config = true; } } Serial.begin(9600); while (!Serial) ; // wait for Arduino Serial Monitor delay(200); if (parse && config) { Serial.print("DS3231 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); } else if (parse) { Serial.println("DS3231 Communication Error:-{"); Serial.println("Please check your circuitry"); } else { Serial.print("Could not parse info from the compiler, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; tm.Hour = Hour; tm.Minute = Min; tm.Second = Sec; return true; } bool getDate(const char *str) { char Month; int Day, Year; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; for (monthIndex = 0; monthIndex = 12) return false; tm.Day = Day; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); return true; }

DS3231 arduino подключение — теперь этот код нужно загрузить в контроллер Arduino, значение времени нужно взять с операционной системы, открываем «Мониторинг порта».

Программа разработки

В данной библиотеке имеется еще дополнительный файл для примера, открывается он также просто: DS1307RTC «Файл» -> «Примеры» -> «DS3231» -> «DS3231_Serial_Hard»

/* Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 16.01.2017г. */ #include // Подключаем библиотеку Wire #include // Подключаем библиотеку TimeLib #include // Подключаем библиотеку DS1307RTC void setup() { Serial.begin(9600); // Устанавливаем скорость передачи данных while (!Serial) ; // Ожидаем подключение последовательного порта. Нужно только для Leonardo delay(200); // Ждем 200 мкс Serial.println("DS3231RTC Read Test"); // Выводим данные на последовательный порт Serial.println("-------------------"); // Выводим данные на последовательный порт } void loop() { tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(":"); print2digits(tm.Minute); Serial.write(":"); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write("/"); Serial.print(tm.Month); Serial.write("/"); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS3231 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS3231 read error! Please check the circuitry."); Serial.println(); } delay(9000); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write("0"); } Serial.print(number); }

Отличительные особенности:

  • Точность ±2 ppm в диапазоне температур от 0°C до +40°C
  • Точность ±3.5 ppm в диапазоне температур от-40°C до +85°C
  • Вход для подключения автономного источника питания, позволяющего обеспечить непрерывную работу
  • Рабочий температурный диапазон коммерческий: от 0°C до +70°C индустриальный: -от 40°C до +85°C
  • Низкое потребление
  • Часы реального времени, отсчитывающие секунды, минуты, часы, дни недели, дни месяца, месяц и год с коррекцией високосного года вплоть до 2100
  • Два ежедневных будильника
  • Выход прямоугольного сигнала с программируемой частотой
  • Быстродействующие (400 кГц) I 2 C интерфейс
  • 3.3 В питание
  • Цифровой температурный датчик с точностью измерения ±3°C
  • Регистр, содержащий данные о необходимой подстройке
  • Вход/выход сброса nonRST

Применение:

  • Серверы
  • Электронные электросчетчики
  • Телематическая аппаратура
  • GPS системы

Типовая схема включения DS3231:

Общее описание:

DS3231 - высокоточные часы реального времени (RTC) со встроенными I 2 C интерфейсом, термокомпенсированным кварцевым генератором (TCXO) и кварцевым резонатором. Прибор имеет вход для подключения резервного автономного источника питания, позволяющего осуществлять хронометрирование и измерение температуры даже при отключенном основном напряжении питания. Встроенный кварцевый резонатор повышает срок службы прибора и уменьшает необходимое количество внешних элементов. DS3231 доступен в модификациях с коммерчески и индустриальным рабочим температурным диапазоном и упакован в 300 mil 16 контактный SO корпус.

RTC обеспечивает отсчет секунд, минут, часов, дней недели, дней месяца и года. Дата конца месяца определяется автоматически с учетом високосного года. Часы реального времени работают в 24 или 12- часовом формате с индикацией текущей половины суток (AM/PM). Прибор имеет два ежедневных будильника и выход прямоугольного сигнала с программируемой частотой. Обмен данными с прибором ведется через встроенный последовательный I 2 C совместимый интерфейс.