Годинник реального часу Амперка

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

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

часу

У нашому проекті ми використовуємо:

Годинник реального часу

годинник

Ми використовуємо модуль з годинником реального часу від Seeed Studio. Вони побудовані на основі мікросхеми DS1307 від Maxim Integrated. З елементів обв'язування вона вимагає три резистори, годинниковий кварц і батарейку, які вже є на даному модулі. Модуль має такі властивості:

Суть годинника реального часу в тому, що за наявності батарейки, вони можуть йти навіть якщо основний пристрій знеструмлений. Ми з таким годинником постійно зустрічаємося в ноутбуках або цифрових фотоапаратах. Якщо дістати з цих пристроїв акумулятор, а через деякий час повернути їх назад, час не скинеться. У цьому заслуга годинника реального часу, Real Time Clock (RTC).

Усі необхідні бібліотеки можна завантажити з офіційного сайту.

часу

Ми використовуємо чотирирозрядний індикатор Seeed Studio. Основне в індикаторі - мікросхема TM1637, що є драйвером для окремих 7-сегментних розрядів. У цьому модулі використовується 4 розряди. Модуль має такі властивості:

Цей модуль ми використовуємо для показу часу: годин та хвилин. Зручність модуля в тому, що він підключається всього по двох проводах і не вимагає програмної реалізації динамічної індикації, оскільки все вже реалізовано всередині модуля.

Динамічна індикація – це процес, у якому індикатори у нашому модулі загоряються послідовно. Але мерехтіння ми не бачимо, оскількилюдське око має велику інертність. Даний метод дозволяє дуже добре економити кількість з'єднань між індикаторами та контролером:

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

Підключення

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

Лінії SDA/SCL мають окремі піни на Arduino, проте всередині вони так чи інакше підключені до пін загального призначення. Якщо розглянути Arduino Uno, лінії SDA відповідає пін A4, а SCL A5.

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

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

амперка

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

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

Код для цього виглядає так:

Тепер завантажуємо цей код у середу розробки, компілюємо та заливаємо. Дивимося на дисплей – бінго! Час на дисплеї – час компіляції.

реального

Пояснення функції getInt

Для початку необхідно зрозуміти, звідки ж у масиві compileTime з'являється час. Воно з'являється у цьому рядку:

unsigned char compileTime[] = __TIME__;

Компілятор замість __TIME__підставляє рядок, що містить час компіляції у вигляді __TIME__ = "hh:mm:ss" , де hh – годинник, mm – хвилини, ss – секунди.

Повернемося до коду, який потрібно пояснити:

У масиві string , що передається в якості параметра в функцію getInt , ми отримуємо символ з індексом startIndex і наступний за ним, щоб отримати двозначне ціле число. Однак спочатку це не число, а пара символів. Щоб отримати число за символом, нам необхідно відняти з цього символу символ нуля ( '0 '): адже у таблиці ASCII всі символи цифр йдуть одна одною, починаючи з символу нуля. Тому код int(string[startIndex]) - '0'), дослівно, робить наступне: «Беремо символ номер startIndex, віднімаємо з нього символ нуля і переводимо в цілісний тип».

Так, цей код робочий, і годинник буде йти. Однак, якщо відключити живлення, а через кілька хвилин включити, то після включення час знову стане тим, яке було при компіляції.

Це відбувається тому що після включення живлення знову виконується код, що знаходиться в функції setup . А він записує в годинник реального часу старе значення часу.

Щоб цього уникнути, нам необхідно ще трохи модифікувати код. Щоразу в функції setup відбуватиметься підрахунок «хеша» часу компіляції - буде розраховуватися кількість секунд, що минуло з 00:00:00 до часу компіляції. І цей хеш порівнюватиметься з хеш в EEPROM. Нагадаємо EEPROM - пам'ять, яка не обнулюється при відключенні живлення.

Якщо значення порахованого і збереженого раніше хеша збігаються, це означає, що перезаписувати час модуль годинника немає необхідності: це вже було зроблено. А от якщо ця перевірка не проходить, відбувається перезапис часу в RTC.

Висновок

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