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

У нашому проекті ми використовуємо:
Годинник реального часу

Ми використовуємо модуль з годинником реального часу від 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, також ми навчилися отримувати дату і час на етапі компіляції. Тепер, якщо виставити потрібний час на годиннику, а потім відключити харчування хоч на кілька годин, то після включення час знову буде точним. Перевірено!