Програмиране на температурния дневник с Arduino Uno - Част 2
В последното ръководство за Arduino изградихме дисплей за температура и влажност. Сега това се разширява, за да включва съхранението на данните на SD карта; съответният момент във времето също се записва за всяко измерване. Новите допълнения са щит за SD карта и часовник в реално време. Дисплеят може да остане на Grove-Shield. Ако искате да управлявате регистратора на данни без дисплей, можете просто да го изключите от контакта.

Подходящ за: Разширено
Необходимо време: около 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 се използва само за отчитане на непрекъснатите процеси на запис, за да се запише числото на картата.
При настройката () първо се установява серийна връзка за отстраняване на грешки, след това връзка със SD картата. Методът SD.begin () връща дали връзката може да бъде установена успешно.
Линията се изгражда в цикъл () и след това се записва на SD картата с writeToSD (). За това използваме класа String, който позволява гъвкава работа със струни. Операторът + свързва два низа, така че променливата count първо се преобразува в низ с String (count). Стойността на броя се увеличава с един и накрая се изчаква една секунда.
Писането се случва в writeToSD (). Там първо се отваря или създава файл със SD.open (), ако все още не съществува (важно: името на файла не може да бъде по-дълго от 8 знака). FILE_WRITE показва, че файлът трябва да бъде отворен по начин за запис.
Ако отварянето е било успешно, файлът съдържа обект от класа File, с който записваме реда, съставен в цикъл (). След това отново затваряме файла. Това гарантира, че файлът няма да бъде повреден, ако картата бъде извадена между записите или ако захранването прекъсне. За отстраняване на грешки, ние също извеждаме стойността на ред на серийния интерфейс.
Ако отварянето е неуспешно (например, защото липсва SD картата), тогава файлът е празен и на серийния интерфейс се извежда съобщение за грешка.
Часовникът в реално време
Описание и монтаж
За разлика от компютър, Arduino няма вграден часовник, защото не е необходим за много приложения. Следователно използваме модула Grove RTC за регистратора на данни, който съдържа чип с часовник DS1307.
Часовникът в реално време изисква допълнителен източник на напрежение под формата на клетка с бутон 3V (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 и я прочетете на компютъра.