Синхронізуємо час на модулі 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 байти, чого вистачить до 2147483648 секунд. А потім можливіпотенційні проблеми Чому потенційні? Тому що це поріг, при досягненні якого число можебути інтерпретовано, як негативне (що з айфонами багатьох цікавих товаришів свого часу). Може, але не обов'язково буде – залежить від того, чи ростуть руки програмістів із місця, передбаченого природою. Зазначене число секунд відповідає 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; 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"); для "повної" версії - кінець ділянки коду ) 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

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

АдресаD7D6D5D4D3D2D1D0ФункціяМежі
0x000 10 секундСекундиСекунди00-59
0x010 10 хвилинХвилиниХвилини00-59
0x020 12/24 AM/PM10:00ГодинуГодинник1-12 + AM/PM або 00-23
10:00
0x030 0 0 0 0 ДеньДень тижня1-7
0x040 0 10 числоЧислоДата01-31
0x05Century0 0 10 місяцьМісяцьМісяці/століття01-12 + Століття
0x0610 роківРікРоки00-99
0x07A1M110 секундСекундиСекунди, 1-й будильник00-59
0x08A1M210 хвилинХвилиниХвилини, 1-й будильник00-59
0x09A1M312/24 AM/PM10:00ГодинуГодинник, 1-й будильник1-12 + AM/PM або 00-23
10:00
0x0AA1M4DY/DT10 числоДеньДень тижня, 1-й будильник1-7
ЧислоДата, 1-й будильник01-31
0x0BA2M210 хвилинХвилиниХвилини, 2-й будильник00-59
0x0CA2M312/24 AM/PM10:00ГодинуГодинник, 2-й будильник1-12 + AM/PM або 00-23
10:00
0x0DA2M4DY/DT10 числоДеньДень тижня, 2-й будильник1-7
ЧислоДата, 2-й будильник01-31
0x0EEOSCBBSQWCONVRS2RS1INTCNA2IEA1IEРеєстр налаштувань (Control)
0x0FOSF0 0 0 EN32kHzBSYA2FA1FРегістр статусу (Status)
0x10SIGNDATADATADATADATADATADATADATAРеєстр підстроювання частоти (Aging Offset)
0x11SIGNDATADATADATADATADATADATADATAРеєстр температури, старший байт
0x12DATADATA0 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-й висновок), частота імпульсів фіксована і дорівнює 32768 кГц. Скидання біта відключає цю функцію і переводить вихід у 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; установки времени 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 ;лінія входу даних ,6 ;лінія вибору драйвера MAX7219 #DEFINE clk PORTB,7 ;лінія тактування драйвера MAX7219 #DEFINE led PORTB,4 ;світлодіод помилки i2c #DEFINE led_sec PORTB,3 ;світлодіод індикації ходу годин 1Гц INE regim PORTA,2; кнопка Індикація - зміни режиму індикації #DEFINE nast PORTA,3; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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" ;налаштування ліній ва 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 u 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 calc tct опитування лінії переривання будильника 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 mov 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. У статті відео-інструкція, лістинги програм, призначення та способи підключення до 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. Дев'ятий урок:

Модуль 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», мікросхемі доступні вісім адрес. від 0х50 до 0х57.

Підключення DS3231 до Arduino

Необхідні деталі:
Arduino UNO R3 х 1 шт.
Годинник реального часу на DS3231, RTC, SPI, AT24C32 x 1 шт.
Провід DuPont, 2,54 мм, 20 см, F-M (Female - Male) x 1 шт.
Кабель USB 2.0 A-B х 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(" -- "); 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 та відкриваємо «Моніторинг порту»

Цей огляд для радіоаматорів-початківців (любителів паяти), для тих, кому цікавий сам процес. Можете оцінити своє вміння. Чіп 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

Завантаження...
Top