Годинник + кімнатний термометр на базі ардуіно

0
76

Раніше майстер робив вже проект годин на базі ардуіно, але в якості плати годин (rtc) використовував модуль ds1306. Як виявилося, цей модуль не дуже надійний і періодично час доводиться коригувати.використовуваний в цьому пристрої модуль ds3231, як показала практика, набагато надійніше.інструменти та матеріали:

-макетна плата; – перемички;-модуль ds3231;-oled – дисплей; крок перший: підключення ds3231 до arduinods3231-це недорогі і точні годинник реального часу (rtc) i2c з вбудованим датчиком температури. Пристрій має батарейний відсік і підтримує точний хронометраж, коли основне живлення пристрою переривається.

Підключається модуль rtc до arduino, наступним чином:висновок vcc до висновку arduino 5vgnd до gndsda до аналогового контакту a4 ардуіновивод scl до аналогового висновку a5 arduino.потрібно використовувати саме ці контакти, оскільки вони призначені для зв’язку по протоколу i2c.

Крок другий: простий коду для відображення временісначала потрібно імпортувати бібліотеку ds3231.бібліотека ds3231бібліотека представлена в zip. Відкриваємо цей zip-файл в arduino ide. Зазвичай до кожної бібліотеки додається кілька прикладів скетчів.тепер створимо найпростіший ескіз для відображення дати і часу в найпростішому форматі.починаємо з оголошення бібліотек.

Показати / приховати текст

Оголошуємо об’єкт rtcdatetime.

Показати / приховати текст

Тип rtcdatetime складається з наступних компонентів.

uint16_t year, uint8_t month, uint8_t dayofweek, uint8_t hour, uint8_t minute, uint8_t second

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

Показати / приховати текст

В основному циклі запускаємо метод time clock.getdatetime () для читання поточної дати і часу в об’єкт dt, який раніше визначили. А потім за допомогою функції друку виводимо монітор послідовного часу. Як видно, формат дуже простий. Ми не бачимо початкових нулів там, де вони повинні бути, тому, якщо потрібно вивести дату в часі іншим способом, все одно будуть потрібні деякі операції.

Крок третій: зчитування температури за допомогою ds3231ds3231 rtc має вбудований датчик температури з роздільною здатністю 0,25 і точністю ± 3 ° c. Регістр температури оновлюються після кожного 64-секундного перетворення.якщо потрібно примусове перетворення температури, використовуємо forceconversion ()тому, якщо потрібне відображати температуру в основному циклі, потрібно додати наступні рядки коду:

Показати / приховати текст

Крок четвертий: підключення oled-дисплеяoled-дисплей також необхідно підключити через контакти a4 і a5, оскільки цей oled-дисплей також є пристроєм i2c. Але ці висновки вже зайняті. Потрібно розуміти, що ці контакти не призначені для будь-якого конкретного пристрою. Вони можуть використовуватися багатьма пристроями з шиною i2c. Для початку підключимо vcc і землю oled-дисплея до arduino.тепер представимо шину i2c з лінією послідовних даних, скорочено sda, і лінією послідовних годин, званої scl. Arduino підключається до цієї шини через аналоговий висновок а4 до sda і через аналоговий висновок a5 до scl. Мікроконтролер-це провідний пристрій.спосіб підключення до шини i2c може відрізнятися в залежності від того, яка плата arduino використовується. Наприклад, в uno a4 і a5 будуть працювати контакти, але є також виділені порти i2c.з іншого боку, в arduino mega не можна використовувати a4 і a5 для цієї мети.тепер можна підключити модуль rtc до цієї шини в якості веденого пристрою і oled-дисплея так само, як і другий ведений пристрій. Але тепер постає питання, як arduino розпізнає, який пристрій повинен з ним зв’язуватися? у кожного пристрою є свій унікальний адресу. Таким чином, модуль ds3231 rtc повинен бути доступний за адресою 68hex, а oled-дисплей повинен мати шістнадцяткову адресу 3c. Однак, якщо виникають проблеми при підключенні будь-якого з компонентів, можна використовувати скетч сканера i2c для виявлення всіх доступних пристроїв, підключених до шини, і їх адрес.нижче url-адреса, за якою можна знайти ескіз сканера i2c.https://playground.arduino.cc/main/i2cscanner/

Крок п’ятий: призначені для користувача функції, необхідні для відображення часу в правильному форматщоб мати можливість форматувати вихідні значення, лічені з модуля rtc, в бажаний формат дати і часу, потрібно написати наступну функцію: день тижня – конвертує день тижня в повну назву дня (1-7->mon – sun)daymonthyear-перетворює день місяця і рік в один рядок. Об’єднує його з короткою назвою місяця, порядковим позначенням дня місяця, а потім з повним роком.addleadingzero-використовується для додавання початкового нуля до показників однієї цифри протягом години, хвилин і секундcurrenttime-читає години і хвилини.

Крок шостий: код для відображення часу на oled-дисплеімея користувальницькі функції, можна написати код, який буде відображати дату і час в потрібному форматі на oled-дисплеї.для цього буде потрібно ще дві бібліотеки для управління дисплеєм

Показати / приховати текст

Потім визначаємо його розміри.

Показати / приховати текст

У функції налаштування додаємо розділ, який перевіряє, чи правильно ініціалізовано дисплей. Він зупиняє виконання ескізу, якщо відображення не виявлено.

Показати / приховати текст

Далі розглянемо код основного циклу для перетворення зчитування з модуля rtc в графічне представлення дати і часу.спочатку зберігаємо дані з rtc в об’єкт dt

Показати / приховати текст

Потім малюємо три прямокутника / панелі. Спочатку білий, і оскільки цей конкретний дисплей є двоколірним, де перші 15 рядків жовті, він відображається жовтим. Потім малюємо ще один чорним, а потім ще один білим, який буде відображатися синім, оскільки ця частина дисплея синя.

Показати / приховати текст

Після вибору положення курсору, кольору і розміру шрифту, встановлюємо день тижня на верхній панелі

Показати / приховати текст

Відображаємо коротку назву місяця, дня місяця і року на середній панелі, використовуючи функцію daymonthyear.

Показати / приховати текст

Додаємо температуру на верхню панель.

Показати / приховати текст

На головній панелі відображаємо години і хвилини за допомогою функції currenttime, а потім, меншим шрифтом, відображаємо секунди.

показати / приховати текст в результаті вийшов досить гарний дизайн годинника.крок шостий: проблемна функція dateformatбібліотека, яку майстер використовує в цьому посібнику, надає одну додаткову функцію під назвою dateformat. Це потужна функція, яка допомагає форматувати час / дату, що зчитуються модулем rtc, без необхідності написання додаткових функцій.однак з цією функцією є проблема. Для неї потрібно багато пам’яті, і якщо використовувати функцію з oled-дисплеєм, ескізу не вистачить пам’яті. Про цю проблему майстер повідомив творцеві бібліотеки, але схоже, що він припинив роботу над цією бібліотекою, і ця проблема, можливо, ніколи не буде виправлена.можна використовувати цю функцію з мікроконтролерами, сумісними з arduino, які мають більше 2 кб пам’яті (arduino mega, bluepill і т.д.).все готово, а повністю код можна завантажити тут.більш докладно про збірку і програмування годин можна подивитися на відео. Джерело (source)