Jeffrey Cross
Jeffrey Cross

Початок роботи з годинниками в реальному часі

Чіп годинника реального часу (RTC) в основному подібний до годинника - він працює на батареї і зберігає час для вас, навіть коли є відключення електроенергії. Використовуючи RTC у вашому проекті, ви можете відстежувати довгі строки, навіть якщо ви перепрограмуєте мікроконтролер або від'єднаєте його від USB або штепселя живлення.

Більшість мікроконтролерів, включаючи Arduino, мають вбудовану функцію хронометражу, що називається millis (), а також є таймери, вбудовані в чіп, який може відстежувати більш тривалі періоди часу, як хвилини або дні. Так чому ж ви хочете мати окремий чіп RTC? Добре, найбільш велика причина що millis () тільки відстежує час з Arduino останній powered. Це означає, що при включенні живлення мілісекундний таймер повертається до 0. Arduino не знає, що це "вівторок" або "8 березня", все, що він може сказати, це: "Пройшло 14000 мілісекунд, оскільки я був останнім часом включено."

Добре, а що, якщо ви хочете встановити час на Arduino? Вам потрібно буде запрограмувати дату та час, і з цього моменту можна було б розраховувати. Але якщо він втратив владу, вам доведеться скинути час, як дешевий будильник: кожен раз, коли вони втрачають владу, вони мигають 12:00.

Незважаючи на те, що для деяких проектів таке базове хронометраж є нормальним, інші проекти, такі як реєстратори даних, годинники тощо, повинні мати постійний часовий контроль, який не скидається, коли батарея Arduino померла або вона перепрограмована. Таким чином, ми включаємо окремий RTC! RTC - це спеціалізований чіп, який просто відстежує час. Він може розраховувати на високосні роки, і він знає, скільки днів припадає на кожен місяць. Зауважте, що він не піклується про перехід на літній час - оскільки він змінюється з місця на місце, вам доведеться кодувати його для певного регіону чи налаштування.

Ось старша материнська плата комп'ютера з годинником реального часу Dallas Semiconductor (RTC), що називається DS1387. Там є літієва батарея, тому вона є такою великою. ; КРЕДИТ: Вікіпедія

Вибір RTC

Три годинники реального часу зазвичай використовуються виробниками: PCF8523, DS1307 і DS32231. Це великі батареї RTCs, які добре для реєстрації даних, годинник будівлі, штампування часу, таймери і тривоги. Кожен зв'язується через двопровідний протокол I2C. До тих пір, поки в ній є монета для керування, ваш RTC весело відзначатиметься протягом багатьох років.

PCF8523 не дуже точний - він може втратити або отримати до 2 секунд на день - але це найменш дорогий з трьох. І він працює з 3.3V або 5V влади і логіки.

»DS1307 є найпоширенішим; це також не висока точність, але це недорогі та легкі для пайки. Він найкраще працює з мікроконтролерами на базі 5V, як Arduino; вона вимагає 5В потужності, хоча може працювати з 3.3V логікою.

»Дані DS3231 пояснюють, що цей чіп з компенсацією температури є« надзвичайно точним I²C-інтегрованим RTC / TCXO / Crystal ». І, ей, він робить саме те, що він говорить на олово! Це RTC є найбільш точним ви можете отримати в невеликий, малопотужний пакет, і він працює з 3.3V або 5V плати.

Використання DS3231

Більшість RTC використовують зовнішній 32kHz термічний кристал, щоб тримати час з низьким струмом. Це все добре і добре, але ці кристали мають невеликий дрейф, особливо коли температура змінюється - температура дуже сильно, дуже незначно впливає на частоту коливань, але вона дорівнює. DS3231 знаходиться в м'якому пакеті, тому що кристал знаходиться всередині мікросхеми! А поруч з вбудованим кристалом є датчик температури. Цей датчик компенсує зміну частоти, додаючи або видаляючи годинники, так що хронометраж залишається за графіком.

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

DS3231 Pinout

Силові штифти • Vin - штир живлення. Оскільки RTC може працювати від потужності 2.3V до 5.5V, вам не потрібен регулятор або перемикач рівня, щоб використовувати 3.3V або 5V логіку / потужність. Просто дати цій платі ж потужність, як логічний рівень вашого мікроконтролера - наприклад, для 5V мікро як Arduino, використовувати 5V. • GND - загальна основа для влади та логіки. I2C Logic Pins • SCL - I2C pin pin, з'єднується з лінією тактової частоти I2C мікроконтролера. Цей контакт має 10K резистор pullup для Vin. • Висновок SDA - I2C, підключений до лінії даних I2C мікроконтролера. Також має 10K резистор pullup до Vin. Інші шпильки • BAT - це те ж саме з'єднання, що і позитивний блок батареї. Використовуйте це, якщо ви хочете підключити щось інше з монетної комірки або забезпечити резервну батарею з окремої батареї. VBat може бути між 2.3V і 5.5V, а DS3231 перемикається, коли основна потужність Vin втрачається. • 32K - Вихід генератора 32 кГц. Відкрийте сток, так що вам потрібно приєднати pullup для читання цього сигналу безпосередньо від штифта мікроконтролера. • SQW - Додатковий вихід з квадратної хвилі або переривання. Знову ж таки, відкрити сток, прикріпити pullup читати цей сигнал від мікроконтролера штифт. • RST - Це трохи відрізняється від більшості RST-контактів; замість того, щоб бути лише входом, він призначений для використання для скидання зовнішнього пристрою або повідомлення про втрату основного джерела живлення. Відкрийте сток, але має внутрішній 50K pullup. Підтягування зберігає цей контактний напруга до тих пір, поки Vin присутній. Коли Він падає і чіп перемикається на резервну батарею, цей висновок знижується.

Якщо ви розгортаєте свій RTC десь холодніше, ніж це круто, перевірте порівняння Chris Fastie, як чотири варіанти чіпа DS3221 (та їх батареї) працюють при дуже низьких температурах.

Використання Arduino

Ви можете легко провести цей прорив до будь-якого мікроконтролера; тут ми будемо використовувати Arduino (рисунок TK). Для інших мікроконтролерів, просто переконайтеся, що він має I2C, а потім порту код - це досить простий матеріал!

На жаль, я зняв дріт живлення від затискача Arduino 5V до шини Vin Rail, перш ніж приймати цей знімок, не забувайте про це!

Підключіть Vin до джерела живлення, 3V – 5V - добре. Використовуйте ту ж напругу, що і логіка мікроконтролера; для більшості Arduinos, це 5V. Підключіть GND до загальної мережі живлення / даних. Підключіть контакт SCL до годинника SCL I2C на вашому Arduino. На Uno та інших Arduinos на базі Atmega328, це також відомо як A5; цифровий 21; і на Леонардо або Мікро, цифровий 3. Підключіть SDA контакт на I2C даних SDA контакт на вашому Arduino. На Uno та інших 328s це також є відоме тому що A4; цифровий 20; і на Леонардо / Мікро, цифровий 2. ВАЖЛИВО: DS3231 має адреса за замовчуванням I2C 0x68 і не може бути змінений.

Завантажити RTClib Щоб почати використовувати ваш DS3231, вам знадобиться бібліотека Arduino для отримання та встановлення часу з RTC. Ми використовуємо вилку відмінної RTClib від JeeLab - наша версія трохи відрізняється, тому, будь ласка, використовуйте наші з цим пробоєм DS3231, щоб переконатися, що вона сумісна!

Завантажити RTClib Adafruit з нашого сховища Github на github.com/adafruit/RTClib.

Перейменуйте незжату папку RTClib і переконайтеся, що папка RTClib містить RTClib.cpp і RTClib.h.

Помістіть папку бібліотеки RTClib у папку [arduinosketchfolder] / libraries /. (Можливо, вам потрібно створити підтеку бібліотек, якщо вона є вашою першою бібліотекою.)

Перезапустіть IDE.

Також у нас є чудовий посібник з інсталяції бібліотеки Arduino на Adafruit.com

Ваш перший тест RTC Перше, що ми продемонструємо, це тест-ескіз, який буде читати час від RTC один раз в секунду. Ми також покажемо, що станеться, якщо ви вилучите акумулятор і заміните його, оскільки це призводить до припинення роботи RTC. Отже, щоб почати, вийміть акумулятор з тримача (рисунок TK), поки Arduino не заряджений або не підключений до USB. Зачекайте 3 секунди, а потім замініть акумулятор. Це скидає RTC-чіп.

Ескіз завантаження демонстрації У IDE Arduino відкрийте Файл → Приклади → RTClib → ds3231 і завантажте його на свій Arduino, підключений до RTC.

Тепер перевірте консоль Serial Monitor при 9600 бод. Через кілька секунд ви побачите звіт про те, що Arduino помітив, що це перший раз, коли DS3231 було включено, і встановить час на основі ескізу Arduino.

Відключіть Arduino плюс RTC на кілька секунд (або хвилин, годин, тижнів) і знову вставте.

Наступного разу, коли ви запустите його, ви не отримаєте таке ж повідомлення "втрачена потужність RTC", замість цього він прийде негайно і дасть вам знати правильний час!

Відтепер вам знову не доведеться встановлювати час. Батарея триватиме 5 або більше років.

Читання часу Тепер, коли РТК весело відганяє, ми хочемо запитати її на час. Давайте подивимося на ескіз знову, щоб побачити, як це робиться.

void loop () {DateTime now = rtc.now (); Serial.print (now.year (), DEC); Serial.print ('/'); Serial.print (now.month (), DEC); Serial.print ('/'); Serial.print (now.day (), DEC); Serial.print ("("); Serial.print (daysOfTheWeek [now.dayOfTheWeek ()]); Serial.print (")"); Serial.print (now.hour (), DEC); Serial.print (':'); Serial.print (now.minute (), DEC); Serial.print (':'); Serial.print (now.second (), DEC); Serial.println ();

Є тільки один спосіб отримати час, використовуючи RTClib, який повинен викликати now (), функцію, яка повертає об'єкт DateTime, який описує рік, місяць, день, годину, хвилину і секунду, коли ви викликали now () .

Є кілька бібліотек RTC, які замість цього викликають щось на зразок RTC.year () і RTC.hour (), щоб отримати поточний рік і годину. Втім, є одна проблема, якщо ви попросите хвилину прямо в 3:14:59 перед наступною хвилиною, а потім другий відразу після закінчення хвилини (так що о 3:15:00). Я побачу час, як 3:14:00, який є хвилиною. Якщо ви зробили це навпаки, ви могли б отримати 3:15:59 - так одну хвилину в іншому напрямку.

Тому що це не дуже малоймовірний випадок - особливо, якщо ви часто запитуєте час - ми беремо "знімок" часу з RTC відразу, а потім ми можемо розірвати його на день () або на друге () як видно вище. Це трохи більше зусиль, але ми вважаємо, що варто уникнути помилок!

Ми також можемо отримати "timestamp" з об'єкта DateTime, викликавши unixtime (), який підраховує кількість секунд (не рахуючи стрибкових секунд) з півночі, 1 січня 1970:

Serial.print ("з півночі 1/1/1970 ="); Serial.print (now.unixtime ()); Serial.print ("s ="); Serial.print (now.unixtime () / 86400L); Serial.println ("d");

Оскільки 60 * 60 * 24 = 86,400 секунд за день, ми можемо легко рахувати дні з того часу. Це може бути корисним, якщо ви хочете відстежувати, скільки часу пройшло з моменту останнього запиту, що полегшує роботу з математикою. Щоб перевірити, чи пройшло 5 хвилин пізніше, перевірте, чи збільшено unixtime () на 300, і вам не доведеться турбуватися про зміну години.


Далі

CircuitPython - Легко використовувати RTC DS3231 з CircuitPython теж! У Github є зручний модуль, який можна завантажити на дошці і розпочати налаштування та зчитування часу за допомогою коду Python. Просто імпортуйте модуль DS3231, створіть екземпляр класу і взаємодійте з його властивістю datetime, щоб встановити і отримати час (рисунок TK)! Докладніше тут.

Raspberry Pi - ультра-низька вартість Pi не вистачає RTC; замість цього вибирає час з серверів NTP (Network Time Protocol). Для автономних проектів можна легко підключити RTC. Переконайтеся, що ви використовуєте оновлене ядро ​​з драйверами RTC, увімкніть I2C і додайте RTC до /boot/config.txt, наприклад dtoverlay = i2c-rtc, ds3231. Потім видаліть фальшивий пакет hwclock і відредагуйте реальний апаратний скрипт / lib / udev / hwclock-set, щоб замість цього використовувати ваш RTC. Докладніше тут.

Поділитися

Залишити Коментар