Програмування журналу температур за допомогою Arduino Uno - Частина 2
В останніх інструкціях Arduino ми побудували індикатор температури та вологості. Зараз це розширено, щоб включити зберігання даних на SD-карті; відповідний час також фіксується для кожного вимірювання. Нові доповнення - це екран для SD-карти та годинник реального часу. Відображення може залишатися на Грововому щиті. Якщо ви хочете керувати реєстратором даних без дисплея, ви можете просто відключити його від мережі.

Підходить для: Розширений
Необхідний час: приблизно 1,5 години
Бюджет: близько 30 євро
Що тобі потрібно: 1x Arduino - годинник реального часу Grove - RTC, 1x Arduino Shield - SD-карта V4, 1x батарея для годинника Grove реального часу, 1x SD-карта
Можна розширити за допомогою:-
Що потрібно: Підключення до Інтернету, комп'ютер з браузером, джерело живлення для Arduino
Щит SD
Опис та установка
Реєстратор даних зберігає свої дані на стандартній карті SD, SDHC або MicroSD (потім з адаптером). Для цього є щит, який підключений між Arduino і базовим екраном - базовий екран залишається вгору через роз’єм.
Бібліотеки, необхідні для SD-екрану, вже включені в Arduino Studio, тому їх не потрібно встановлювати окремо. Документацію можна знайти в посиланні Arduino:
Пишіть дані - привіт світ
Ми пишемо перші дані на картці за допомогою такої програми:
Визначаються перші дві змінні: SELECTED_CHIP визначає, яке обладнання використовується в SD-Shield. Значення можна отримати у виробника щита SD. Змінна count використовується лише для підрахунку безперервних процесів запису, щоб записати число на карту.
У setup () спочатку встановлюється послідовне з'єднання для налагодження, а потім з'єднання з SD-картою. Метод SD.begin () повертає, чи вдалося встановити з'єднання успішно.
Рядок складається в циклі (), а потім записується на SD-карту за допомогою writeToSD (). Для цього ми використовуємо клас String, який забезпечує гнучку роботу зі рядками. Оператор + з'єднує два рядки, тому змінна count спочатку перетворюється у рядок за допомогою String (count). Значення рахунку збільшується на одиницю і, нарешті, чекає одну секунду.
Запис відбувається в writeToSD (). Файл спочатку відкривається або створюється там за допомогою SD.open (), якщо він ще не існує (важливо: ім'я файлу не може перевищувати 8 символів). FILE_WRITE означає, що файл слід відкривати для запису.
Якщо відкриття було успішним, файл містить об'єкт класу File, за допомогою якого ми пишемо рядок, складений у циклі (). Потім файл знову закриваємо. Це гарантує, що файл не буде пошкоджений, якщо картку видалити між записами або якщо живлення не спрацює. Для налагодження ми також виводимо значення рядка на послідовний інтерфейс.
Якщо відкриття було невдалим (наприклад, через те, що SD-картка відсутня), тоді файл порожній, і на послідовний інтерфейс виводиться повідомлення про помилку.
Годинник реального часу
Опис та установка
На відміну від ПК, Arduino не має вбудованого годинника, оскільки він не потрібен для багатьох додатків. Тому ми використовуємо модуль Grove RTC для реєстратора даних, який містить тактовий чіп DS1307.
Для годинника реального часу потрібне додаткове джерело напруги у вигляді комірки 3В (CR1225), щоб встановлений час зберігався, навіть якщо сам Arduino не має живлення. І навпаки, це означає, що годинник реального часу працює неправильно без акумулятора - тому без нього не обійтися, навіть якщо Arduino залишається постійно підключеним до джерела живлення. Зв'язок відбувається через систему шин I²C, можна використовувати будь-яке з'єднання I²C.
Бібліотека повинна бути встановлена для годинника реального часу, як для дисплея:
Завантажте бібліотеки, а потім встановіть їх за допомогою меню «Ескіз» → «Включити бібліотеку» → «Додати бібліотеки .ZIP ...».
Для всіх бібліотек є зразки програм у розділі «Файл» → «Приклади».
Встановіть і прочитайте час
Щоб встановити час, ми використовуватимемо власний ескіз замість методу setup () у кінцевій програмі. В іншому випадку час буде скинуто кожного разу при запуску Arduino:
У setup () ми спочатку відкриваємо підключення до послідовного порту, щоб відправити час на ПК для перевірки. Потім з'єднання з годинником відкривається за допомогою clock.begin (), дата, час і день тижня готуються і, нарешті, надсилаються на годинник реального часу з clock.setTime () (заздалегідь замініть значення поточним часом;-)).
У циклі () спочатку виводиться час, а потім очікується одна секунда. У Arduino Studio результат виводиться в розділі «Інструменти» → «Послідовний монітор».
Важливо: Надсилання програми на Arduino займає кілька секунд, тому складно точно встановити час. Це не проблема для цього додатка - якщо вимірюване значення записується кожні кілька хвилин, щоб записати хід виміряних значень протягом дня, то відхилення в кілька секунд не має різниці.
Остаточна програма реєстрації даних
Після того, як ми протестували всі деталі один раз, ми можемо розширити програму з останнього уроку:
Що нового в цій програмі, так це те, що існує два процеси з різною тактовою частотою. Дисплей слід оновлювати кілька разів на секунду для поточного відображення та плавних кольорових переходів. Однак кожної хвилини достатньо, щоб записати виміряні значення на карту. Тому прості паузи із затримкою () вже неможливі.
Рішення: Функцію millis () можна використовувати для запиту мілісекунд, які пройшли з моменту запуску Arduino. В lastDisplayUpdate та lastWrite зберігається останній раз, коли дисплей оновлювався або коли він був записаний на SD-карту. Кожного циклу часу () запускається порівняння щодо того, чи більша різниця між цими значеннями та мілісекундами (), ніж значення DISPLAY_UPDATE_INTERVAL або WRITE_INTERVAL, і лише тоді виконуються відповідні дії. Змінні lastWrite і lastDisplayUpdate ініціалізуються з довжиною відповідного інтервалу, щоб обидві дії відбувалися одразу при запуску програми.
Нарешті, у циклі () значення спочатку отримуються з датчика та перевіряються. Якщо виникли проблеми зі збором значень, виводиться помилка, і виконання циклу () закінчується в цей момент і починається знову з самого початку (тобто значення знову отримуються з датчика).
Потім він перевіряє, чи настав час оновити дисплей ще раз. Це так, якщо різниця між поточним часом і lastDisplayUpdate перевищує DISPLAY_UPDATE_INTERVAL. Потім колір знову визначається, і дані надсилаються на дисплей. Для читабельності зараз існує метод updateDisplay (). Тоді lastDisplayUpdate встановлюється на поточний час.
Те саме відбувається з записом даних на SD-карту. Якщо час останнього процесу запису перевищує WRITE_INTERVAL, поточний час визначається годинником реального часу, дані записуються на SD-карту, а lastWrite встановлюється як поточний час.
Час визначається методом getTime (), який запитує час з годинника реального часу і створює рядок із датою та часом. Оператор + = додає значення правого рядка до лівого.
оцінка даних
Дані записуються у файл datalog.csv і можуть бути імпортовані в Excel, LibreOffice Calc або Google Spreadsheets для аналізу.
Просто вийміть SD-карту з Arduino і прочитайте її на ПК.