DS3231 – подключение часов реального времени. Часы на DS3231 и AVR-микроконтроллере Технические характеристики 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, которая обладает встроенным кварцевым генератором с температурной компенсацией, благодаря чему уход времени составляет всего ±2 минуты за год. Дополнительно реализована функция будильника, также имеется выход прерываний. Часы можно приобрести в виде готового модуля под Arduino с элементами обвязки и отсеком для батареи.

Я заказывал модуль здесь . Схема представлена на картинке ниже:


Микросхема использует широко распространенный . Поддерживается стандартная (100 кГц) и высокая (400 кГц) скорость передачи данных. Адрес микросхемы (7 бит) на шине I2C равен 1101000. Дополнительно на модуле установлена память I2C (24C32), на схеме не изображена.

Режимы электропитания

Напряжение питания микросхемы может находиться в пределах 2,3…5,5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:

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

В целях сохранения заряда, при подключении батареи (подача напряжения на линию Vbat), тактовый генератор не запускается до тех пор, пока напряжение на линии Vcc не превысит пороговое значение Vpf, или не будет передан корректный адрес микросхемы по интерфейсу I2C. Время запуска тактового генератора составляет менее одной секунды. Примерно через 2 секунды после подачи питания (Vcc), или получения адреса по интерфейсу I2C, запускается процедура коррекции частоты. После того как тактовый генератор запустился, он продолжает функционировать до тех пор, пока присутствует напряжение Vcc или Vbat. При первом включении регистры даты и времени сброшены, и имеют следующие значения 01/01/ 00 – 01 – 00/00/00 (день/месяц/год/ – день недели – час/минуты/секунды).

Ток потребления при питании от батареи напряжением 3,63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5,5В, и высокой скорости передачи данных I2C.

Функция внешнего сброса

Линия RST может использоваться для внешнего сброса, а также обладает функцией оповещения о низком уровне напряжения. Линия подтянута к высокому логическому уровню через внутренний резистор, внешняя подтяжка не требуется. Для использования функции внешнего сброса, между линией RST и общим проводом можно подключить кнопку, в микросхеме реализована защита от дребезга контактов. Функция оповещения активируется при снижении напряжения питания Vcc ниже порогового значения Vpf, при этом на линии RST устанавливается низкий логический уровень.

Описание регистров DS3231

Ниже в таблице представлен перечень регистров часов реального времени:

Адрес D7 D6 D5 D4 D3 D2 D1 D0 Функция Пределы
0x00 0 10 секунд Секунды Секунды 00-59
0x01 0 10 минут Минуты Минуты 00-59
0x02 0 12/24 AM/PM 10 часов Час Часы 1-12 + AM/PM или 00-23
10 часов
0x03 0 0 0 0 0 День День недели 1-7
0x04 0 0 10 число Число Дата 01-31
0x05 Century 0 0 10 месяц Месяц Месяцы/век 01-12 + Век
0x06 10 лет Год Годы 00-99
0x07 A1M1 10 секунд Секунды Секунды, 1-й будильник 00-59
0x08 A1M2 10 минут Минуты Минуты, 1-й будильник 00-59
0x09 A1M3 12/24 AM/PM 10 часов Час Часы, 1-й будильник 1-12 + AM/PM или 00-23
10 часов
0x0A A1M4 DY/DT 10 число День День недели, 1-й будильник 1-7
Число Дата, 1-й будильник 01-31
0x0B A2M2 10 минут Минуты Минуты, 2-й будильник 00-59
0x0C A2M3 12/24 AM/PM 10 часов Час Часы, 2-й будильник 1-12 + AM/PM или 00-23
10 часов
0x0D A2M4 DY/DT 10 число День День недели, 2-й будильник 1-7
Число Дата, 2-й будильник 01-31
0x0E EOSC BBSQW CONV RS2 RS1 INTCN A2IE A1IE Регистр настроек (Control)
0x0F OSF 0 0 0 EN32kHz BSY A2F A1F Регистр статуса (Status)
0x10 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр подстройки частоты (Aging Offset)
0x11 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр температуры, старший байт
0x12 DATA DATA 0 0 0 0 0 0 Регистр температуры, младший байт

Информация о времени хранится в двоично-десятичном формате, то есть каждый разряд десятичного числа (от 0 до 9) представляется группой из 4-х бит. В случае одного байта, младший полубайт отсчитывает единицы, старший десятки и т. д. Счет времени осуществляется в регистрах с адресами 0x00-0x06, для отсчета часов можно выбрать режим 12-ти или 24-х часов. Установка 6-го бита регистра часов (адрес 0x02), задает 12-ти часовой режим, в котором 5-й бит указывает на время суток, значению 1 соответствует время после полудня (PM), значению 0 до полудня (AM). Нулевое значение 6-го бита соответствует 24-х часовому режиму, здесь 5-й бит участвует в счете часов (значения 20-23).

Регистр дня недели инкрементируется в полночь, счет идет от 1 до 7, регистр месяцев (адрес 0x05) содержит бит века Century (7-й бит), который переключается при переполнении регистра счета лет (адрес 0x06), от 99 к 00.

В микросхеме DS3231 реализовано два будильника, 1-й будильник настраивается с помощью регистров с адресами 0x07-0x0A, 2-й будильник регистрами 0x0B-0x0D. Битами A1Mx и A2Mx можно настроить различные режимы для будильников, установка бита исключает соответствующий регистр из операции сравнения. Ниже в таблицах приведены комбинации битов для разных режимов будильника:

Комбинации битов не указанные в таблицах, приводят к некорректному функционированию будильников. Если бит DY/DT сброшен, то для будильника отслеживается совпадение даты (день месяца), при установке бита DY/DT, проверяется совпадение дня недели.

Большинство функций настраиваются в регистре Control. Бит EOSC управляет запуском тактового генератора, сброс бита запускает генератор. Установка бита останавливает генератор, только для режима питания от батареи (Vbat). При питании от внешнего источника (Vcc), генератор всегда запущен независимо от состояния бита EOSC. После включения, значение бита по умолчанию равно 0.

Установка бита BBSQW разрешает функционирование выхода INT/SQW (3-й вывод) в режиме питания от батареи, при отсутствии внешнего питания. При нулевом значении бита, выход INT/SQW переходит в 3-е состояние (деактивируется), если напряжение внешнего источника Vcc падает ниже порогового значения Vpf. После подачи питания, значение бита по умолчанию равно 0.

Бит CONV отвечает за принудительное измерение температуры, установка бита запускает процесс преобразования, во время которого также выполняется корректировка частоты тактового генератора, результат измерения находится в регистрах с адресами 0x11, 0x12. Запуск возможен только в случае окончания предыдущего преобразования, перед запуском необходимо проверить флаг занятости BSY. Принудительное преобразование температуры не влияет на внутренний 64-х секундный цикл корректировки частоты. Установка бита CONV не влияет на флаг BSY в течение 2 мс. Биты CONV и BSY сбрасываются автоматически после завершения преобразования.

Биты RS2, RS1 устанавливают частоту прямоугольных импульсов (меандр) на выходе INT/SQW. По умолчанию, при включении биты устанавливаются в 1. Ниже в таблице представлены возможные комбинации битов:

Бит INTCN управляет выходом INT/SQW. Если бит сброшен, на выходе появляются прямоугольные импульсы (меандр), частота которых задается битами RS2, RS1. При установке бита INTCN, выход используется для генерации прерываний по сигналу будильника. По умолчанию, значение бита равно 1. Тип выхода INT/SQW – открытый сток, соответственно необходима подтяжка через резистор к высокому логическому уровню, активный уровень – низкий.

Установка битов A1IE, A2IE разрешает прерывания по сигналу 1-го и 2-го будильника соответственно. Сброс битов, запрещает прерывания. По умолчанию значение равно 0.

Регистр Status содержит флаги событий, и управляет выходом 32 kHz. Флаг OSF отражает состояние тактового генератора, значение 1, означает, что генератор остановлен, это событие может произойти в следующих случаях:

  • В первое время после подачи питания
  • Напряжение батареи или внешнего источника недостаточно для работы тактового генератора
  • Генератор выключен установкой бита EOSC в режиме питания от батареи
  • Внешние факторы, влияющие на кварцевый генератор (шум, утечка и т.д.)

После установки значение бита не меняется, необходимо сбросить бит вручную.

Установка бита EN32kHz разрешает генерирование прямоугольных импульсов (меандр) на выходе 32kHz (1-й вывод), частота импульсов фиксирована и равна 32,768 кГц. Сброс бита отключает данную функцию и переводит выход в 3-е состояние (с высоким входным сопротивлением). По умолчанию значение бита равно 1, после подачи питания на выходе появляются импульсы. Тип выхода 32kHz открытый сток, поэтому требуется подтяжка к высокому логическому уровню.

Флаг занятости BSY устанавливается во время процесса преобразования температуры и корректировки частоты тактового генератора. Флаг сбрасывается после завершения преобразования.

Флаги будильников A1F, A2F устанавливаются при совпадении значений регистров счета времени и регистров будильника. Если разрешены прерывания по сигналу будильников A1IE, A2IE, а также назначен выход прерывания (установлен бит INTCN), то на выходе INT/SQW появляется сигнал прерывания (переход от высокого к низкому логическому уровню). Флаги необходимо сбросить вручную, записав значение 0.

Регистр Aging Offset предназначен для подстройки частоты тактового генератора. Значение регистра добавляется к частоте генератора во время выполнения внутренней процедуры корректировки, если зафиксировано изменение температуры, а также при запуске преобразования температуры битом CONV. Величина смещения знаковая, то есть положительные значения (1-127) уменьшают частоту, отрицательные (128-255) увеличивают. Для одинакового смещения, изменение частоты будет различным в зависимости от температуры. При температуре +25°C, изменение частоты составит 0,1 ppm/LSB.

Текущее значение температуры хранится в регистрах с адресами 0x11 и 0x12, старший и младший байт соответственно, значение температуры в регистрах периодически обновляется. Установлено левое выравнивание, разрешение составляет 10 бит или 0,25°C/LSB, то есть в старшем байте находится целая часть температуры, а 6, 7-й биты в младшем регистры составляют дробную часть. В старшем байте 7-й бит указывает знак температуры, например, значению 00011011 01 соответствует температура +27,25 °C, значению 11111110 10 температура -2,5 °C.

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

Подключение DS3231 к микроконтроллеру

Я подключил часы к микроконтроллеру PIC16F628A, для отображения времени использовал . Схема подключения представлена ниже:


После подачи питания на индикаторах высвечиваются знаки тире (– – – – – –), далее выполняется инициализация часов, значение времени появляется на индикаторах с задержкой в 1 секунду, которая требуется для запуска тактового генератора часов. На индикаторы выводится значение часов, минут и секунд, разделенных десятичной точкой, формат времени 24-х часовой. Кнопкой SB1 “Индикация” можно сменить формат отображения, где на индикаторы будет выводиться температура, а также значение часов и минут, разделенных десятичной точкой, которая мигает с частотой 2 Гц. Температура отображается без дробной части, в программе считывается только старший байт хранения температуры по адресу 0x11.

Значение времени считывается из часов по прерыванию на линии SQW/INT, которая управляется сигналом 1-го будильника, в процессе инициализации часов будильник настраивается на ежесекундный сигнал. Светодиод HL1 служит в качестве индикатора и вспыхивает по сигналу прерывания каждую секунду. Светодиод HL2 загорается в случае ошибки передачи данных по интерфейсу I2C.

Дополнительно добавил в программу возможность настройки часов кнопками SB2 “Настройка”, SB3 “Установка”. Вход в режим настройки производится нажатием кнопки SB2, на индикаторах высвечивается 00 часов, и знаки тире вместо минут и секунд (00 – – – –). Кнопкой SB3 задается значение часов (инкремент при каждом нажатии), далее нажатием кнопки SB2 осуществляется переход на редактирование минут, вместо тире высветится 00 минут. Кнопкой SB3 также задается необходимое значение и так далее. После редактирования секунд и нажатия кнопки SB2, время в часах перезаписывается, на индикаторах отображается обновленное время.

Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #include LIST p=16F628A __CONFIG H"3F10" ;Конфигурация микроконтроллера errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге Sec equ 0020h ;вспомогательные регистры счета Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c temp equ 0026h ;регистр температуры perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр. result equ 0028h ;вспомогательный регистр двоично-десятичного преобр. dat_ind equ 0029h ;регистр данных для передачи по протоколу spi adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi second equ 002Bh ;регистр хранения секунд для установки времени minut equ 002Ch ;регистр хранения минут для установки времени hour equ 002Dh ;регистр хранения часов для установки времени adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;регистр флагов #DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231 #DEFINE sda PORTB,1 ;линия SDA для подключения DS3231 #DEFINE scl PORTB,2 ;линия SCL для подключения DS3231 #DEFINE sda_io TRISB,1 ;направление линии SDA #DEFINE scl_io TRISB,2 ;направление линии SCL #DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219 #DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219 #DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219 #DEFINE led PORTB,4 ;светодиод ошибки i2c #DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц #DEFINE regim PORTA,2 ;кнопка Индикация - смены режима индикации #DEFINE nast PORTA,3 ;кнопка Настройка - входа в режим настройки времени #DEFINE ust PORTA,4 ;кнопка Установка - установка значения часов;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b"00000000" ;установка значений выходных защелок порта A movwf PORTA ; movlw b"01000000" ;установка значений выходных защелок порта B movwf PORTB ; movlw b"00000111" ;выключение компараторов movwf CMCON ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b"00000111" ;настройка линий ввода\вывода порта B movwf TRISB ;RB0-RB2 - на вход, остальные на выход movlw b"11111111" ;настройка линий ввода\вывода порта A movwf TRISA ;все линии на вход bcf STATUS,RP0 ;выбрать 0-й банк clrf flag ;сброс регистра флагов call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219) call viv_not ;вывод на индикаторы символов тире " ------ " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw b"11010000" ;адрес устройства (DS3231) movwf slave_adr ;Запись 4-х байт в регистры приема/передачи по i2c ;здесь выполняется настройка 1-го будильника, сигнал каждую секунду movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"10000000" ;данные для регистра секунд 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра минут 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра часов 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра даты/дня недели 1-го будильника movwf INDF ; movlw .4 ;передача 4-х байта по i2c movwf tmp_i2c ; movlw 0x07 ;установка адреса регистра секунд 1-го будильника movwf adr_i2c ; call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x0E ;установка адреса регистра Control movwf adr_i2c ; movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"00000101" ;запуск тактового генератора, запрет функционирования вывода INT/SQW для movwf INDF ;режима питания от батареи, частота импульсов на выходе INT/SQW 1Гц, ;выход INT/SQW задействован для генерации прерываний по будильнику, ;разрешение прерываний по 1-му будильнику call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C met_2 movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x0F ;установка адреса регистра Status movwf adr_i2c ; movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"00000000" ;сброс бита OSF, запрет генерирования импульсов на выходе EN32kHz, movwf INDF ;сброс флагов прерываний будильников A2F, A1F call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C met_1 btfsc int ;опрос линии прерывания будильника goto met_3 ; bsf led_sec ;включение светодиода индикации хода часов goto met_4 ; met_3 bcf led_sec ;выключение светодиода индикации хода часов btfsc nast ;опрос кнопки настройки часов goto met_5 ; call nast_time ;вызов подпрограммы установки времени goto met_2 ; met_5 btfsc regim ;опрос кнопки режима индикации goto met_1 ; met_6 call paus_knp ; btfss regim ; goto met_6 ; btfss flag,2 ;изменение значения флага режима индикации goto met_7 ; bcf flag,2 ;сброс флага индикации, режим отображения часов goto met_1 ; met_7 bsf flag,2 ;установка флага индикации, режим отображения температуры и часов goto met_1 ; met_4 movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x11 ;установка адреса старшего регистра температуры movwf adr_i2c ; call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C movf INDF,W ;копирование значения температуры в регистр temp movwf temp rd_time movlw .3 ;передача 3-х байт по i2c movwf tmp_i2c ; movlw 0x00 ;установка адреса регистра секунд movwf adr_i2c ; call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C btfsc flag,2 ;опрос флага режима индикации goto met_8 ; call vivod ;вызов подпрограммы вывода значения часов на цифровое табло goto met_2 ; met_8 call vivod_temp ;вызов подпрограммы вывода температуры и часов на цифровое табло goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#include

CONFIG H"3F10" ;Конфигурация микроконтроллера

errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге

Sec equ 0020h ;вспомогательные регистры счета

Sec1 equ 0021h ;

Sec2 equ 0022h ;

scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит

perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c

temp equ 0026h ;регистр температуры

perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр.

result equ 0028h ;вспомогательный регистр двоично-десятичного преобр.

dat_ind equ 0029h ;регистр данных для передачи по протоколу spi

adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi

second equ 002Bh ;регистр хранения секунд для установки времени

minut equ 002Ch ;регистр хранения минут для установки времени

hour equ 002Dh ;регистр хранения часов для установки времени

adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

flag equ 007Fh ;регистр флагов

#DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231

#DEFINE sda PORTB,1 ;линия SDA для подключения DS3231

#DEFINE scl PORTB,2 ;линия SCL для подключения DS3231

#DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219

#DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219

#DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219

#DEFINE led PORTB,4 ;светодиод ошибки i2c

#DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц

#DEFINE regim PORTA,2 ;кнопка Индикация - смены режима индикации

#DEFINE nast PORTA,3 ;кнопка Настройка - входа в режим настройки времени

#DEFINE ust PORTA,4 ;кнопка Установка - установка значения часов

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ;начать выполнение программы с адреса 0000h

goto Start ;переход на метку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

Start movlw b"00000000" ;установка значений выходных защелок порта A

movlw b"01000000" ;установка значений выходных защелок порта B

movlw b"00000111" ;выключение компараторов

bsf STATUS,RP0 ;выбрать 1-й банк

movlw b"00000111" ;настройка линий ввода\вывода порта B

movwf TRISB ;RB0-RB2 - на вход, остальные на выход

movlw b"11111111" ;настройка линий ввода\вывода порта A

movwf TRISA ;все линии на вход

bcf STATUS,RP0 ;выбрать 0-й банк

clrf flag ;сброс регистра флагов

call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219)

call viv_not ;вывод на индикаторы символов тире " ------ "

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

movlw b"11010000" ;адрес устройства (DS3231)

;Запись 4-х байт в регистры приема/передачи по i2c

movlw data_i2c ;установка первого регистра приема/передачи по i2c

movlw b"10000000" ;данные для регистра секунд 1-го будильника

movlw b"10000000" ;данные для регистра минут 1-го будильника

movlw b"10000000" ;данные для регистра часов 1-го будильника

movlw b"10000000" ;данные для регистра даты/дня недели 1-го будильника

movlw .4 ;передача 4-х байта по i2c

movlw 0x07 ;установка адреса регистра секунд 1-го будильника

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

Это, конечно не пайка осциллографа. Уровень ниже. Но занятие интересное.
Пробежимся по-быстрому, в каком виде всё пришло.


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


В комплекте были:
- В качестве корпуса две пластины из полупрозрачного пластика (тонированные и защищённые плёнкой от царапин).
- Плата (очень высокого качества).


Две матрицы.


С лицевой стороны они защищены плёнкой. Ножки были защищены пористым полиэтиленом.


USB кабель длиной около метра.


Высыпал всё, что осталось.


Поделил на две части.
Винты с гайками.


И то, что придётся паять.


Панелька для литиевой батарейки весьма редкого формата CR1220, ртутный датчик положения, пара транзисторов, электролитические конденсаторы, стабилизатор AMS1117 (3,3В), SMD конденсаторы и резисторы (10K), 3 кнопки, USB разъем, пищалка.
Самое важное - контроллер STC 15w1k24s и высокоточный чип DS3231. Упакованы были в очень жёсткий блистер, помять очень сложно.


Схемы не было. Тем не менее, вопросов не возникло, всё понятно.
Все детали на плате не только подписаны, но и (условно) нарисованы.
Всё просто.
Но сначала подготовился.


Начал с того, что припаял две самые сложные (я так думал) микросхемы. Спозиционировал и прихватил в двух местах (диаметрально противоположных). А уж затем припаял как следует. Не забываем придерживать, чтобы не «уехали».


Затем стабилизатор.


Транзистор.


Четыре SMD резистора и два SMD конденсатора. Спозиционировать и прихватить с одного края оказалось не так просто (нужна сноровка). А у меня её мало:).


Два электролита.


USB разъем.


Панельку для литиевой батарейки.


Пищалку. Не забываем про плюс и минус. После пайки откусил ножки под самое не хочу, чтоб не мешали в последствии при пайке матриц.


Ртутный датчик положения.


3 кнопки.


И, наконец, матрицы. Обратите внимание на ориентацию. Это верх (пищалка будет слева).


Вот что получилось.


Правда, остались запчасти (на случай потери, наверное): один транзистор, два сопротивления и конденсатор.


Отмываю от флюса.
Проверяю.
Они работают!
Снимаю защитные плёнки.


Собираю.

После включения часы поздравили с Новым Годом.


Не мудрено, на часах 1 января 2000 года 00 часов 01 минута.


Не обращайте внимание на разноцветость матрицы. Частота обновления «экрана» соизмерима с выдержкой фотоаппарата. Человеческий глаз видит всё в правильном красном цвете. Именно поэтому немного зашторил окна, когда снимал видео (чтобы увеличить выдержку).
Теперь надо настраивать.
У часов сзади три кнопки. Я их сам условно обозвал (сверху вниз):
1. Меню.
2. Плюс.
3. Минус.
Смотрите алгоритм настройки. При наличии часов в руках даже что не понятно, станет яснее ясного 
Для входа удерживаем верхнюю кнопку (меню) некоторое время. Далее работаем короткими нажатиями.

Кое-что поясню. Всего шесть меню. Переключаются по кругу. Можно кнопкой плюс, можно кнопкой минус.
TIME – настройка времени.
DATE – настройка даты.
ALAR – настройка будильника.
FONT – выбор шрифтов (всего 5 видов: тонкий широкий сглаженный…).
DISP – выбор алгоритма вывода информации (можно только часы, можно последовательно меняющуюся инфу: время, температура, дата, праздники бегущей строкой…).
MIDP – выбор вида разделительных точек.


На словах не всё просто объяснить. Я это подробно показал на видео (ссылка в конце).
А на этом видео (30 секунд) можно посмотреть алгоритм вывода инфы на матрицы (меню DISP тип2).


Важное замечание. Без литиевой батарейки после настройки время и дата сбиваются. Остальные настройки остаются в памяти.
Подключил к обычной зарядке. Замерил потребление.


USB -девайс при потреблении менее 50мА ничего не показывает (такая особенность).
Вывод: в режиме часы ток потребления менее 50мА, в режиме бегущая строка около 70мА. Не так то и много.
Замерил габариты: 105*85мм.
Цифры в стандартном отображении 20*30мм каждая.


Поставил перед телевизором.


Чуть не забыл про ртутный датчик положения.
Часы всегда будут показывать правильно, даже если их перевернуть «вверх ногами». Ртутный шарик либо замыкает, либо размыкает контакты. Соответственно контроллер меняет алгоритм вывода информации на матрицы.
Вот, в общем-то, и всё.
Пора подводить итоги.
Неплохой DIY комплект для проверки своих навыков начинающим радиолюбителям. Более того, это не просто набор для обучения, но и в итоге получились неплохие часы.
Для правильного вывода того, что написал, должно хватить.
Кому что-то неясно, задавайте вопросы. Надеюсь, хоть кому-то помог.
Удачи!

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Планирую купить +61 Добавить в избранное Обзор понравился +66 +122

«. Знакомимся с модулем часов реального времени DS3231. В статье видео-инструкция, листинги программ, назначение и способы подключения к Arduino модулей из семейства DS.

Модуль часов реального времени DS3231

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

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

Модуль DS3231 по сути представляет из себя обыкновенные часы. В платах Arduino уже есть встроенный датчик времени Millis , однако он работает только при поданном питании на плату. При отключении и дальнейшем включении Arduino отсчет времени Millis сбросится до нуля. А DS3231 имеет на борту батарейку, которая даже при отключенной плате Arduino продолжает «питать» модуль, позволяя ему измерять время.

Модуль можно использовать в качестве часов или будильника, построенных на базе плат Arduino. Или же в качестве оповещения для различных систем, к примеру в «Умном доме».

Технические характеристики DS3231:

  • модуль производит подсчет часов, минут, секунд, дат, месяцев, лет (високосные года учитываются до 2100 года);
  • для подключения к различным устройствам, часы подключаются по I2C интерфейсу.

32К — Выход, предназначенный для подачи внешнего питания >12В.

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

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

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

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

GND — Земля.

Схема подключения часов реального времени DS3231 и простейшая программа

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

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

Подключим модуль часов реального времени к Arduino UNO. SDA — пин A4, SCL — пин A5.

Для работы модели подойдет следующая программа (программу вы можете просто скопировать в Arduino IDE):

#include

void setup() {
delay(300);
Serial.begin(9600);
time.begin();
}
void loop(){



}
}

В данном скетче просто идет отсчет времени.

В первую очередь в сктече подключение библиотеки iarduino_RTC.h.

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

В итоге получаем вывод времени с модуля DS3231 в монитор порта. Идет вывод часов, минут, секунд.

В следующем скетче добавим функцию settime , позволяющую установить начальное время отсчета.

#include
iarduino_RTC time(RTC_DS3231);
void setup() {
delay(300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 сек, 0 мин, 18 час, 24, апреля, 2017 года, понедельник
}
void loop(){
if(millis()%1000==0){ // если прошла 1 секунда
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
}
}

В примере время начинает отсчитываться с 0 сек, 0 мин, 18 час, 24, апреля, 2017 года, понедельник.

Посты по урокам:

  1. Первый урок: .
  2. Второй урок: .
  3. Третий урок: .
  4. Четвертый урок: .
  5. Пятый урок: .
  6. Шестой урок: .
  7. Седьмой урок: .
  8. Восьмой урок: .
  9. Девятый урок:

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

  • Точность ±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 совместимый интерфейс.