DS3231 – підключення годинника реального часу. Годинник – конструктор на високоточному (extremely accurate I2C) чіпі DS3231 Піни SDA та SCL на різних платах Arduino

💖 Подобається?Поділися з друзями посиланням

Навіщо це все потрібно?

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.

Для того, щоб все запрацювало, потрібні дві складові: програма для 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 увійде до безкінечний циклпо відображенню того самого свіжовстановленого часу, тобто, по суті, стане годинником. Причому годинами, зробленими на швидку руку, у зв'язку з чим вони не зможуть замінити нормальний годинник через декілька причин (вибірка секунд реалізована через 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"); для "повної" версії - кінець ділянки коду) void loop()( if (Serial.available())( //якщо є "порох у порохівницях" COM порту Serial.readBytes(b,4); //вважаємо всі 4 байти (іншого ми і не чекаємо) t1 = b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Пара фото "повної" версії готового девайса.


Ну і, нарешті, відео роботи девайсу «в бою»:

Де скачати скетч та програму?

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

"Плюси і мінуси".

Сформулювати «плюси» та «мінуси» в даному випадку важко. Отже, кожен вирішує собі сам, що – добре, що – погано.

Разом.

Мені дуже сподобалося, як тепер встановлюється час у модулях! При необхідності встановити час мені не доводиться згадувати щоразу, який там скетч мені потрібен і замислюватися, наскільки точно буде встановлено час у модулі. Більше того, скоро буде огляд саморобного годинника, куди я вбудував такий метод синхронізації – настільки метод мені сподобався. Сподіваюся, комусь із читачів метод також буде доречним.

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

Всім добра.

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

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

Технічні характеристики

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

Загальні відомості

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


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


Трохи розповім про мікросхему AT24C32N, це мікросхема з 32к пам'яттю (EEPROM) від виробника Atmel, зібрана в корпусі SOIC8, що працює по двопровідній шині I2C. Адреса мікросхеми 0x57, при необхідності легко змінюється за допомогою перемичок A0, A1 і A2 (це дозволяє збільшити кількість підключених мікросхем AT24C32/64). Так як чіп AT24C32N має, три адресні входи (A0, A1 і A2), які можуть перебувати у двох станах, або лог «1» або лог «0», мікросхемі доступні вісім адрес. від 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, який має вбудований кварцовий генератор з температурною компенсацією, завдяки чому догляд часу складає всього ±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-х біт. У разі одного байта, молодший напівбайт відраховує одиниці, старший десятки тощо. Установка 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 0q20h-о. 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; W 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Гц; зміни режиму індикації #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" ;настроювання ліній вводу 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 у 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 calt ; fsc 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_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 - це годинник реального часу (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

Відмінні особливості:

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



Розповісти друзям