МІНІСТЕРСТВО ВНУТРІШНІХ СПРАВ УКРАЇНИ

ЛЬВІВСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ ВНУТРІШНІХ СПРАВ

Навчально-науковий інститут управління, психології та безпеки

Кафедра інформаційних технологій

Розроблення мікроконтролерної системи

визначення рівня вологості грунту ДЛЯ УНИКНЕННЯ ЗСУВІВ ПІД ЧАС СПОРУДЖЕННЯ ОБОРОННИХ УКРІПЛЕНЬ

Кваліфікаційна робота

здобувача вищої освіти

4 курсу заочної форми навчання

Богдан ДУДАР

Науковий керівник:

доцент, кандидат технічних наук Леся ГЕНТОШ

Рецензент:

____________________________

вчене звання, науковий ступінь

____________________________

(Ім’я ПРІЗВИЩЕ рецензента)

Кваліфікаційна робота допущена до захисту

«___» _______________ 2025 р., протокол № ____

Завідувач кафедри інформаційних технологій

_________________Ігор ФЕДЧАК_

(підпис)

Львів

2025

Анотація

Дудар Б., Гентош Л. (керівник). Розроблення мікроконтролерної системи визначення рівня вологості грунту для уникнення зсувів під час спорудження оборонних укріплень. – Львівський державний університет внутрішніх справ, Львів, 2025.

У роботі розроблено апаратне та програмне забезпечення мікроконтролерної системи для вимірювання вологості, температури та кислотності ґрунту. Система побудована на базі мікроконтролера, до якого підключено цифрові давачі вологості, температури та pH-датчик. Отримані дані виводяться на рідкокристалічний дисплей та зберігаються у форматі CSV на карті пам'яті SD для подальшого аналізу.

У межах роботи проведено аналіз сучасних підходів до моніторингу параметрів ґрунту, розроблено електричну принципову схему системи та програмне забезпечення для мікроконтролера. Реалізовано алгоритм збору, обробки та збереження даних. Виконано тестування системи в реальних умовах, проведено аналіз точності та стабільності вимірювань.

Розроблена система має значний потенціал для використання в правоохоронних органах, де моніторинг стану ґрунту може бути важливим для вирішення різноманітних завдань, таких як визначення зміни територій, перевірка фактів контрабанди або незаконного землеволодіння. Здатність системи зберігати та аналізувати дані дає можливість забезпечити своєчасне виявлення порушень, а також сприяє точності та надійності результатів при проведенні розслідувань або моніторингу територій.

Ключові слова: мікроконтролерна система, моніторинг ґрунту, вологість ґрунту, кислотність ґрунту, датчик вологості, pH-датчик, рідкокристалічний дисплей, карта пам’яті SD, вимірювальна система.

Abstract

Dudar B., Hentosh L. (supervisor). Development of a microcontroller system for determining soil moisture levels to avoid landslides during the construction of defensive fortifications. – Lviv State University of Internal Affairs, Lviv, 2025.

In this work, hardware and software for a microcontroller system for measuring soil moisture, temperature, and pH have been developed. The system is built on a microcontroller, to which digital sensors for moisture, temperature, and pH are connected. The collected data is displayed on an LCD screen and stored in CSV format on an SD memory card for further analysis.

The work includes an analysis of modern approaches to soil parameter monitoring, the development of the system's electrical schematic, and the creation of software for the microcontroller. The algorithm for data collection, processing, and storage has been implemented. The system has been tested under real conditions, and an analysis of measurement accuracy and stability has been conducted.

The developed system has significant potential for use by law enforcement agencies, where soil monitoring can be crucial for addressing various tasks, such as detecting land changes, verifying cases of smuggling, or illegal land ownership. The system’s ability to store and analyze data enables timely detection of violations and ensures the accuracy and reliability of results in investigations or territory monitoring.

Keywords: microcontroller-based system, soil monitoring, soil moisture, soil acidity, moisture sensor, pH sensor, liquid crystal display, SD card, measurement system.

Зміст

Вступ	6

Розділ I аналіз проблемної області	9

1.1. Водневий показник та методи його вимірювання	9

1.2. Огляд сучасних пристроїв вимірювання вологості та кислотності грунту	10

Розділ II. Інструментарій проектування та програмування мікроконтролерної системи визначення рівня вологості і кислотності грунту	19

2.1. Система автоматизованого проектування та моделювання електронних пристроїв Proteus VSM	19

2.2. Інструментарій розробки ПЗ для МК Arduino – Arduino IDE	21

Розділ III. апаратне забезпечення мікроконтролерної системи визначення рівня вологості і кислотності грунту	24

3.1 Вибір елементної бази для проектування апаратного забезпечення мікроконтролерної системи визначення рівня вологості і кислотності грунту	24

3.2. Проектування мікроконтролерної системи в САПР Proteus VSM	40

Розділ IV. Програмно-алгоритмчне забезпечення мікроконтролерної системи визначення рівня вологості і кислотності грунту	44

4.1. Алгоритм калібрування давачів	44

4.2. Використання бібліотеки SD для запису інформації на SD-карту пам’яті	51

4.3. Використання бібліотеки LiquidCrystal для роботи з LCD HD44780	58

4.4. Програмна реалізація алгоритму роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту	59

4.5. Моделювання та аналіз результатів роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS	60

Висновки	68

Список використаних літературних джерел	69

ДОДАТКИ	72

Додаток A	73

Додаток Б	74

СПИСОК УМОВНИХ СКОРОЧЕНЬ

ПК – персональний комп’ютер;

МК – мікроконтролер;

ЕК – електронна схема;

ПЗ – програмне забезпечення;

АЗ – апаратне забезпечення;

CАПР (CAD) – система автоматизованого проектування;

Arduino Uno –апаратно-програмна платформа на МК ATmega328;

Arduino IDE – інтегроване середовище розробки, яке використовується для написання і прошивки програмного коду в МК плати Arduino;

AVR – лінійка мікроконтролерів фірми Atmel;

РКІ/РКД (LCD) – рідкокристалічний індикатор/дисплей;

АЦП (ADC) – аналого-цифровий перетворювач;

RAM (ОЗП) – Random-Access-Memory оперативний запам’ятовуючий пристрій – пам’ять;

Flash (флеш пам’ять) – енергонезалежна програмована пам’ять;

EEPROM (Electrically [Electrical] Erasable Programmable Read-Only Memory) – постійна пам’ять, яку можна електричним способом перепрограмувати;

UART – (Universal Asynchronous Receiver/Transmitter) універсальний асинхронний приймач та передавач, УАПП;

SPI (Serial Peripheral Interface, SPI bus) – послідовний периферійний інтерфейс, шина SPI) – послідовний синхронний повнодуплексний стандарт передачі даних, розроблений фірмою Motorola для забезпечення простого підключення мікроконтролера та периферії;

Secure Digital Memory Card (SD) – формат карт пам’яті (флеш-пам’ять), розроблений SD Association (SDA) для використання в портативних пристроях.

Вступ

Вологість ґрунту є одним із ключових факторів, що безпосередньо впливають на його родючість і здатність підтримувати ріст рослин. Оптимальний рівень вологості забезпечує кореневій системі рослин достатню кількість рідини, необхідної для нормального розвитку, фотосинтезу та засвоєння поживних речовин. Недостатня кількість вологи призводить до висихання ґрунту, що негативно позначається на врожайності та може спричинити загибель рослин. Водночас надмірна вологість сприяє розвитку патогенних мікроорганізмів, гниттю коренів та вимиванню поживних речовин.

Для різних видів сільськогосподарських культур існують певні оптимальні діапазони вологості. Зокрема, під час культивації овочевих культур рівень вологості ґрунту не повинен перевищувати 60-70% повної вологоємності, для зернових культур цей показник становить 70-80%, а для трав’янистих рослин – 80-85%. Відхилення від цих значень може значно вплинути на ріст і розвиток рослин, тому контроль цього параметра є необхідним для ефективного ведення сільського господарства.

Ще одним важливим показником ґрунту є його кислотність (pH), яка визначає, наскільки ґрунт придатний для вирощування певних видів рослин. Надмірна кислотність або лужність негативно впливає на доступність поживних речовин, процеси засвоєння мікроелементів та активність корисної мікрофлори ґрунту. Якщо рівень кислотності виходить за межі допустимого діапазону, необхідно вносити спеціальні коригуючі речовини, такі як вапнякові або сульфатні добавки, щоб нормалізувати pH до оптимального рівня.

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

Аналіз останніх досліджень і публікацій. Сучасні технології надають широкі можливості для автоматизації процесів моніторингу ґрунтових показників. На ринку електронних компонентів представлений широкий вибір мікроконтролерних платформ та сенсорних модулів, які дозволяють створювати доступні та ефективні вимірювальні системи [1-4]. Зокрема, мікроконтролерні системи для визначення рівня вологості та кислотності ґрунту можуть забезпечити оперативний збір та аналіз даних, що дозволяє користувачам своєчасно реагувати на зміни параметрів ґрунту.

Мета роботи – розроблення мікроконтролерної системи, що здійснює вимірювання вологості, температури та кислотності ґрунту, виводить отримані дані на рідкокристалічний дисплей і зберігає їх у форматі CSV на карті пам’яті SD.

Для досягнення цієї мети необхідно вирішити наступні завдання:

Провести аналіз сучасних досліджень і публікацій у сфері моніторингу вологості та кислотності ґрунту.

Визначити оптимальні технічні рішення для створення мікроконтролерної вимірювальної системи.

Розробити схему та алгоритм роботи системи, що забезпечить точність та стабільність вимірювань.

Реалізувати апаратну частину системи на основі мікроконтролера та відповідних давачів.

Розробити програмне забезпечення для збору, обробки та збереження даних.

Провести тестування системи в реальних умовах експлуатації та оцінити її ефективність.

Об'єкт дослідження – процес вимірювання вологості, кислотності та температури ґрунту.

Предмет дослідження – мікроконтролерна система для моніторингу ґрунтових параметрів.

Методи дослідження – аналіз літературних джерел, експериментальні дослідження, моделювання та тестування розробленої системи.

Структура роботи. Кваліфікаційна робота складається із вступу, чотирьох розділів, висновків, списку використаних джерел, додатків. Обсяг основного тексту роботи складає 63 сторінки, 32 рисунки, 5 таблиць, 2 додатки і 25 бібліографічних джерел. Загальний обсяг роботи – 79 сторінок.

Розділ I
аналіз проблемної області

1.1. Водневий показник та методи його вимірювання

Водневий показник (pH) відображає концентрацію вільних іонів водню у водному середовищі. Для зручності вимірювання цієї величини було запроваджено спеціальну шкалу – pH, яка являє собою від’ємний логарифм концентрації іонів водню: pH = -log[H+]. Простіше кажучи, значення pH залежить від співвідношення концентрацій іонів H⁺ і OH⁻, які утворюються внаслідок дисоціації води. Якщо вміст іонів H⁺ нижчий, ніж OH⁻ (pH > 7), вода має лужну реакцію. Якщо ж переважають іони H⁺ (pH < 7), реакція буде кислою. У дистильованій воді, де ці іони перебувають у рівновазі, pH дорівнює 7 – це нейтральне середовище. Додавання до води різних хімічних речовин може змінити цей баланс, впливаючи на рівень pH. Слідкування за pH особливо важливе на кожному етапі очищення води, адже навіть незначне відхилення цього показника може суттєво вплинути на її смак, зовнішній вигляд, якість, а також на ефективність процесу водоочищення.

Рівень pH води може суттєво відрізнятися залежно від її характеристик. Зокрема, значення pH менше ніж 3 вказує на сильнокисле середовище, від 3 до 5 – кисле, 5–6,5 – слабокисле, 6,5–7,5 – майже нейтральне, а 7,5–8,5 – слабколужне.

Оптимальний діапазон pH у системах водоочистки визначається хімічним складом води, типом матеріалів, які використовуються в трубопроводах та резервуарах, а також специфікою технологій водообробки. У більшості випадків pH води підтримується на рівні, що не впливає негативно на її споживчі властивості. Наприклад, в атмосферних опадах pH – 4,6–6,1, у болотах – 5,5–6,0, в морській воді – 7,9–8,3, у річкових водах – 6,5–8,5.

Всесвітня організація охорони здоров’я (ВООЗ) не встановлює конкретного медичного нормативу щодо pH питної води, однак відомо, що дуже кисла вода (низький pH) може спричиняти корозію труб і обладнання, а надто лужна (pH понад 11) має милкувату консистенцію, неприємний запах і може подразнювати шкіру та очі. Тому для питної та господарсько-побутової води вважається безпечним і прийнятним рівень pH у межах від 6 до 9.

Рівень pH у природних водах змінюється залежно від місця та сезону. Наприклад, у шахтних і копальневих водах він може знижуватися до 1, тоді як у содових озерах або термальних джерелах досягати значень близько 10. Крім того, сезонні зміни також впливають на кислотність: взимку pH у річках зазвичай становить 6,8–7,4, а влітку – підвищується до 7,4–8,2.

1.2. Огляд сучасних пристроїв вимірювання вологості та кислотності грунту

На сьогоднішній день pH-метри широко представлені на ринку як комерційні прилади. Аналіз наукових джерел та інтернет-ресурсів засвідчив наявність великої кількості інформації щодо розробки різноманітних пристроїв для вимірювання кислотності рідин і розчинів. Сучасні технології пропонують як стаціонарні, так і портативні рішення, засновані на використанні мікроконтролерів. На рисунках 1.1–1.3 наведені приклади цифрових pH-метрів, які відображають результати вимірювань на екрані [1].

Тестер вологості грунту, освітленості та кислотності допомагає контролювати рівень pH та достатню кількість вологи та світла для грунту (рис. 1.1).

Характеристики тестера:

pH діапазон: 3,5 - 8 рівень (3,5 - 6,5 кислий, 7 ні, 7 - 8 лужний);

діапазон вимірювання вологості: 1 - 10 (1 - 3 сухий, 4 - 7 ні, 8 - 10 мокрий);

відносна освітленість: 0 - 2000 люкс (0 - 200 низька, 200 - 500 низька+, 500 - 1000 ні, 1000 - 2000 висока).

Рис. 1.1 Три-в-одному тестер вологості грунту, освітленості та pH/кислотності

Цифровий грунтовий вологомір Walcom PMS-710

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

Особливості цифрового вологоміра PMS-710:

Цифровий вологомір PMS-710 є портативний, компактний, простий у використанні. Він має цифровой дисплей з підсвічуванням, що дає точне і чітке читання. Вологомір PMS-710 економить час і витрати, відстежуючи сухість грунту. Вимірювач вологості PMS-710 працює за допомогою електричного опору, має автоматичну температурну компенсацію, функцію автоматичного відключення через 5 хв. після останньої операції, функцію data hold зберігання останніх виміряних даних, попередження про низький заряд батареї.

Технічні характеристики цифрового вологоміра PMS-710:

дисплей: 4-х значний цифровий РК-дисплей;

діапазон вимірювань: 0 - 50%;

температура: 0 - 60 °C;

вологість: 5% - 90% RH;

роздільна здатність: 0,1;

точність: ± 2%;

джерело живлення: 4x1,5 AAA розмір (UM-4).

Рис. 1.2 Цифровий грунтовий вологомір Walcom PMS-710

Цифровий вимірювач вологості грунту Rapitest Luster Leaf

Цифровий вимірювача вологості грунту Rapitest є простий у використанні, показує останні вимірюні значення на РК-дисплеї, має біметалічний зонд (щуп) грунту. Діапазон вимірювання 0 ~ 9,9, роздільна здатність 0,1, точність: ±0,2 ~ 0,3, авто відключення через 5 хв., живлення 4,5 В від 3-х батарейок LR44. er Manual

Рис. 1.3 Цифровий вимірювач вологості грунту Rapitest Luster Leaf

Вимірювач вологості грунту Extech MO750

Вимірювач вологості грунту Extech MO750 має інтегрований 8” промисловий (підвищеної міцності) щуп, який дає змогу моніторити рівень вологості в грунті від 0 до 50%. Вимірювач має міцний, водонепроникний корпус з великим РК-дисплеєм, функцію призупинки зчитувань на дисплеї, функцію мін./макс., постачається зі змінним щупом вологості.

Рис. 1.4 Цифровий вимірювач вологості грунту Extech MO750

Вимірювач вологості грунту фірми lutron

Вимірювач вологості фірми lutron визначає рівень вологості грунту та інших подібних матеріалів (дерево, папір, зерно, насіння, рис, ячмінь). Діапазон вимірювання давача від 0% до 50% вмісту вологості грунту з роздільною здатністю (точністю) 0,1 %. Функція data hold (втртамання даних) для фіксації потрібного значення на дисплеї. Мікропроцесорна система забезпечує високу точність та спеціальні функції. Робоча температура: 0-50°C. Працює від батарейок DC 1,5 В (UM4/AAA) x 4 шт. Вбудований індикатор низького зарядку батареї. Надійні, довговічні компоненти, упаковані в міцний компактний ABS пластиковий корпус.

Рис. 1.5 Цифровий вимірювач вологості грунту фірми lutron

Вимірювач вологості грунту TDR-100

Вимірювач вологості грунту TDR-100 зручний у використанні і точний вимірювач визначення вологості грунту (рис. 1.6). Вимірювач вологості дає реальний вміст вологості в %, коефіцієнт в’янення і степінь водонасиченості грунту.

Рис. 1.6 Цифровий вимірювач вологості грунту TDR-100

з RS-232 інтерфейсом

Відсотки змінюються в залежності від типу грунту. Крупнозернисті грунти, менше повітря (40%) як дрібнозернисті грунти включають (до 60%). Якщо пропорція повітря на поверхні вища, густина грунту нижча і повітря може бути заміщене водою. Якшо досягнута умова, то це називається водо насиченим грунтом. При звичайних умовах, грунт не може втримувати всю воду, вона просочується. Стан при якому грунт може втримувати воду називається польовою ємністю (FK в %). Світлі грунти здатні зв'язувати воду не так добре, як польова ємність значно нижче насичення грунту. На тлі сили зв'язування ґрунту рослини поглинають воду зі своїх коренів для випаровування води з ґрунту. Водний потенціал рослин обмежений і не може бути взято з усієї води з ґрунту. Стан, до якого рослини витягують воду, називається точкою в'янення (WP в об.%). Таким чином, установка може використовувати воду тільки між станами в'янення і полем.

Вимірює і представляє параметри вологості грунту, має 3 різних щупа вологості, зручний у використанні для сільського господарства (агрономї), озеленення, садово-паркового будівництва. Режими RWC = відносний вміст води (відносна вологість), DEF = нестача води, VWC = об’ємний вміст води, PWP = точка в’янення.

Вимірювач має ПЗ і може бути запрограмований до відповідних потреб. Довжина щупа вологості грунту, необхідні одиниці для відображення нестачі води або обмеження на внутрішні вимірювання параметрів можуть бути введені. ПЗ може бути встановлене на ПК. Вимірювач має діапазон вимірювання вологості приблизно 0…50% абсолютної вологості, роздільну здатність 1%, точність ±3%, показує на дисплеї об’єм в % абсолютний, об’єм відносний в %, нестачу води в мм/м2. Два на вибір типи грунту, адаптовані давачі довжиною 75, 120 або 200 мм можуть бути замовлені додатково, клас захисту IP54, інтерфейс з ПК RS-232, живлення від 4-х 1,5 В батарейок типу AAA.

Вимірювач вологості DM300L

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

Рис. 1.7 Вимірювач вологості DM300L

Таблиця 1.1

Технічні характеристики вимірювача вологості DM300L

Подвійна точність	0~2%
Одинарна точність	0~90%
Точність	0,1/0,01
Температура	-5 °C ~ +60 °C
Вологість	5 до 85% RH
Час відгуку	1 сек.
Довжина щупа	~ 235 мм (може бути 400 мм, 600 мм)
Живлення	9 В(тип батарейки 6F22)

Цифровий тестер вологості грунту Delmhorst KS-D1

Тестер для вологості ґрунту KS-D1 використовується для контролю вологості ґрунту. Тестер KS-D1 розміщений у міцному пластиковому корпусі ABS, має надійну стабільну технологію напівпровідникової температури з внутрішньою батареєю та перевіркою калібрування.

Рис. 1.8 Цифровий тестер вологості грунту Delmhorst KS-D1

Рис. 1.9 Вимірювач вологості грунту AcuRite

Цифровий вимірювач вологості 4-в-1

Вимірювач (тестер) вологості ґрунту, рН, температури та освітлення визначає 4 важливих параметри: значення рН, температура, вологість та інтенсивність сонячного світла навколишнього середовища. Чутливий 200 мм щуп та давач світла забезпечує точні результати вимірювання, рН, вологості, сонячного світла, °C & °F (ґрунт і навколишнє середовище). Він також має негабаритний РК-дисплей з чітким дисплеєм, підсвічуванням і автоматичним вимкненням живлення.

Рис. 1.10 Цифровий вимірювач вологості 4-в-1

Особливості вимірювача вологості:

тестер для ґрунту 4-в-1 для рослин і газонів;

вимірює сонячне світло (9 рівнів), вологість ґрунту (5 рівнів), рН грунту (12 рівнів) і температуру (°C & °F);

восьми дюймовий або 200 мм довжиною щуп;

автоматичне вимкнення живлення;

огляд інтенсивності світла поточного середовища;

швидке та точне вимірювання;

функція підсвічування.

Розділ II. Інструментарій проектування та програмування мікроконтролерної системи визначення рівня вологості і кислотності грунту

2.1. Система автоматизованого проектування та моделювання електронних пристроїв Proteus VSM

Proteus VSM є програмним пакетом для автоматизованого проєктування та інтерактивного моделювання електронних схем [2]. Його розробником є компанія Labcenter Electronics з Великої Британії. Система моделювання в Proteus базується на віртуальному відтворенні роботи електронних компонентів.

Це середовище дозволяє виконувати моделювання аналогових, цифрових і програмованих пристроїв, зокрема мікроконтролерів, мікропроцесорів, цифрових сигнальних процесорів (DSP) тощо. У Proteus користувачі можуть створювати принципові електричні схеми, тестувати їх із допомогою віртуальних вимірювальних приладів, а також налагоджувати програмне забезпечення для МК.

Крім того, Proteus VSM включає інструменти для проєктування друкованих плат із функцією тривимірної візуалізації. Серед підтримуваних мікроконтролерів — ARM, 8051, PIC, AVR, Motorola, Basic Stamp та інші. У вбудованій бібліотеці присутні докладні дані про велику кількість компонентів, включаючи моделі мікропроцесорів/мікроконтролерів (8051, PIC, HC11, AVR, ARM7/LPC2000 тощо).

У програмі доступно понад 6000 моделей аналогових та цифрових пристроїв. Proteus VSM сумісний із різними компіляторами та асемблерами, що робить його ефективним інструментом для комплексного моделювання й відлагодження навіть складних пристроїв, які можуть містити кілька мікроконтролерів різних архітектур.

Хоча жодне моделювання не може повністю замінити реальні випробування, функціоналу Proteus VSM зазвичай достатньо для перевірки та оптимізації роботи мікроконтролерного алгоритму. У програмі передбачено широку бібліотеку електронних частин, а у разі відсутності необхідної моделі її можна створити самостійно. Також підтримуються SPICE-моделі, які часто надаються виробниками компонентів.

Система автоматизованого проєктування Proteus VSM складається з двох основних модулів:

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

ARES - це програма для розробки друкованих плат. Вона має вбудований менеджер бібліотек та автотрасувальник ELECTRA. Автотрасувальник ELECTRA автоматично розставляє компоненти на платі.

Рис. 2.1 Середовище Proteus ISIS

2.2. Інструментарій розробки ПЗ для МК Arduino – Arduino IDE

Arduino IDE – це зручне та інтуїтивно зрозуміле середовище для створення прошивок (програмного забезпечення) і подальшого їх завантаження до мікроконтролера плати Arduino [3]. Програма вирізняється простотою у використанні, що робить її доступною навіть для початківців.

Основні компоненти середовища Arduino IDE включають:

редактор коду для написання програм;

область повідомлень для виведення статусу компіляції та помилок;

текстове поле для введення вихідного коду;

панель інструментів із часто використовуваними командами;

декілька меню для доступу до основних функцій.

Рис. 2.2 Інтегроване середовище розробки ПЗ Arduino IDE

У середовищі Arduino програму прийнято називати скетчем [4–10]. Скетч створюється в текстовому редакторі, який підтримує підсвітку синтаксису для зручності написання коду. Під час збереження або компіляції проєкту в області повідомлень відображається службова інформація, включаючи повідомлення про помилки. У текстовому вікні також з'являються детальні звіти Arduino щодо результатів компіляції або завантаження.

Панель інструментів містить кнопки для перевірки (компіляції) та завантаження скетчу в мікроконтролер, а також для створення, відкриття чи збереження проєкту та запуску моніторингу послідовного порту.

Arduino IDE постачається з набором вбудованих бібліотек, таких як Serial, EEPROM, SPI, Wire та інші. Вони розміщені в підкаталозі libraries каталогу встановлення Arduino. Додаткові бібліотеки можна завантажити з різноманітних джерел. Щоб підключити їх, достатньо скопіювати папку бібліотеки до згаданого підкаталогу libraries. У самій папці бібліотеки зазвичай містяться файли з розширеннями .cpp та .h, а також приклади використання, що розміщені в папці examples.

У разі правильної інсталяції бібліотека буде автоматично відображатися в меню Sketch | Import Library.

Ця директива використовується для підключення заголовкового файлу бібліотеки, яка містить опис об’єктів, функцій та констант, доступних для використання в проєкті. Під час компіляції середовище Arduino IDE автоматично враховує цю бібліотеку у складі проєкту.

Перед завантаженням скетчу до МК слід налаштувати необхідні параметри в меню Сервіс | Плата (Tools | Board) та Сервіс | Послідовний порт (Tools | Serial Port).

Більшість сучасних плат Arduino автоматично перезавантажуються перед початком завантаження коду. Під час цього процесу зазвичай блимають індикаторні світлодіоди RX і TX, що свідчить про передачу даних. Завантаження скетчу здійснюється за допомогою спеціальної мініпрограми — завантажувача (bootloader), який попередньо записується в мікроконтролер. Завдяки цьому завантаження програмного коду можливе без використання додаткового програматора.

Початок роботи завантажувача можна впізнати за миготінням світлодіода, підключеного до цифрового контакту D13. Для перегляду інформації, що передається між комп’ютером і платою Arduino через USB або послідовний інтерфейс, використовується монітор послідовного порту (Serial Monitor).

Розділ III. апаратне забезпечення мікроконтролерної системи визначення рівня вологості і кислотності грунту

3.1 Вибір елементної бази для проектування апаратного забезпечення мікроконтролерної системи визначення рівня вологості і кислотності грунту

Елементною базою для проектування мікроконтролерної системи визначення рівня вологості і кислотності грунту було вибрано:

Платформу Arduino Uno на МК ATmega328;

Алфавітно-цифровий РК-дисплей (LCD1602A) 16×2 HD44780;

Давачі вологості та рівня кислотності грунту;

SD-картрідер з картою пам’яті на 16 МБ.

Огляд платформи Arduino

Arduino – це апаратно-програмні засоби розробки систем автоматики і робототехніки [11-16]. Програмна частина Arduino включає безкоштовне середовище розробки (IDE), яке використовується для написання, компіляції програм і завантаження прошивки в апаратну платформу. Апаратна частина – це набір зібраних друкованих плат, які виготовляються як офіційним виробником, так і незалежними розробниками. Завдяки повністю відкритій архітектурі системи користувачі мають змогу вільно копіювати, змінювати та розширювати модельний ряд пристроїв Arduino.

Arduino Uno (рис. 3.1) побудована на мікроконтролері ATmega328 [17].

Вона оснащена 14 цифровими входами/виходами (з них 6 можуть працювати в режимі ШІМ), 6 аналоговими входами, кварцовим резонатором на 16 МГц, USB-портом, роз’ємом живлення, інтерфейсом ICSP і кнопкою скидання.

Рис. 3.1 Плата Arduino Uno

Для роботи Arduino Uno можна підключити до комп’ютера через USB-кабель або забезпечити живлення за допомогою адаптера змінного/постійного струму чи батареї. На відміну від попередніх моделей, де для обміну даними через USB використовувався чип FTDI, в Arduino Uno застосовано МК ATmega8U2, що виконує функцію USB-інтерфейсу.

Таблиця 3.1

Технічні характеристики плати Arduino Uno

Плата Arduino Uno може живитися як через USB-порт, так і від зовнішнього джерела, вибір джерела відбувається автоматично. Зовнішнє живлення може надходити від адаптера AC/DC або акумулятора. Адаптер підключається до стандартного роз’єму діаметром 2,1 мм з позитивним полюсом у центрі, тоді як акумулятор під’єднується безпосередньо до контактів GND і Vin на роз’ємній колодці живлення.

Плата здатна працювати при зовнішній напрузі в діапазоні від 6 В до 20 В. Якщо напруга нижча за 7 В, вихід 5V може видавати занижену напругу, що здатне викликати нестабільну роботу системи. Якщо ж подається напруга понад 12 В, регулятор напруги може перегрітись і пошкодити плату. Тому рекомендований робочий діапазон становить 7–12 В.

Виводи живлення

VIN – вхід для подачі живлення від зовнішнього джерела у випадках, коли USB або інше джерело з напругою 5 В не використовується. Саме через цей контакт подається живлення на плату.

5V – стабілізоване джерело напруги, яке живить МК та інші компоненти плати. Напруга 5 В може надходити від регулятора, підключеного до VIN, або безпосередньо від USB чи іншого стабілізованого джерела.

3V3 – вивід, на якому присутня напруга 3,3 В, що формується внутрішнім стабілізатором. Максимально допустимий струм – 50 мА.

GND – контакти, призначені для підключення до загального (нульового) проводу, тобто «землі».

Пам’ять

Мікроконтролер ATmega328, на якому базується Arduino Uno, оснащений 32 КБ флеш-пам’яті, з яких 0,5 КБ зарезервовано під завантажувач. Крім того, він має 2 КБ оперативної пам’яті (SRAM) та 1 КБ енергонезалежної пам’яті EEPROM, доступ до якої здійснюється через стандартну бібліотеку EEPROM.

Цифрові входи/виходи

У платі Uno передбачено 14 цифрових пінів, кожен з яких може працювати на вхід або на вихід. Для керування використовуються функції pinMode(), digitalWrite() та digitalRead(). Робоча напруга пінів становить 5 В, кожен контакт має внутрішній підтягувальний резистор опором від 20 до 50 кОм (за замовчуванням вимкнений) та здатен пропускати струм до 40 мА.
Окремі виводи мають додаткові спеціальні функції:

Послідовний інтерфейс (UART): Виводи 0 (RX) і 1 (TX) використовуються для прийому (RX) і передачі (TX) даних у форматі TTL. Вони з’єднані з відповідними виводами мікросхеми ATmega8U2, що забезпечує перетворення USB у TTL.

Зовнішні переривання: Контакти 2 і 3 можуть бути налаштовані для генерації переривань за умовами: на спадному або висхідному фронті сигналу, зміні логічного рівня або при низькому сигналі. Детальніше це описано у функції attachInterrupt().

ШІМ (PWM): Виводи 3, 5, 6, 9, 10 та 11 підтримують широтно-імпульсну модуляцію з роздільною здатністю 8 біт, що реалізується через функцію analogWrite().

SPI-інтерфейс: Піни 10 (SS), 11 (MOSI), 12 (MISO) та 13 (SCK) забезпечують підтримку послідовного інтерфейсу SPI, для якого використовується стандартна бібліотека SPI.

Світлодіод (LED): На вивід 13 підключено вбудований світлодіод. При встановленні високого логічного рівня на цьому піні світлодіод засвічується.

На платі Arduino Uno розміщено шість аналогових входів з позначеннями A0–A5, кожен з яких підтримує 10-бітове перетворення, що дозволяє зчитувати значення в межах від 0 до 1023. За замовчуванням діапазон вимірювання напруги — від 0 до 5 В відносно GND, проте верхню межу можна змінити, використовуючи вивід AREF і функцію analogReference().

Деякі з цих виводів мають додаткове призначення:

I2C-інтерфейс: Виводи A4 (SDA) і A5 (SCL) слугують для організації зв’язку по протоколу I2C (TWI). Для роботи з цим інтерфейсом застосовується бібліотека Wire.

Окрім основних, плата також має додаткові виводи:

AREF: Вивід для підключення опорної напруги, яка використовується аналоговими входами. Налаштовується через функцію analogReference().

Reset: При подачі низького рівня на цей пін мікроконтролер перезавантажується. Його часто використовують для виведення кнопки скидання на шилд (модуль розширення), якщо вона перекриває штатну кнопку на платі Arduino.

Комунікації

Платформа Arduino Uno має різні засоби для обміну даними з комп’ютером, іншими платами Arduino або зовнішніми МК. МК ATmega328 підтримує послідовний інтерфейс UART TTL (5 В), який реалізовано через виводи 0 (RX) та 1 (TX).

На платі також встановлено мікросхему ATmega8U2, яка забезпечує перетворення UART у USB-інтерфейс, завдяки чому з’єднання з комп’ютером здійснюється через віртуальний COM-порт. Для взаємодії з Arduino в більшості операційних систем використовуються стандартні драйвери USB-COM, тому додаткове програмне забезпечення не потрібне. Водночас, у середовищі Windows може знадобитися файл ArduinoUNO.inf для належного розпізнавання пристрою.

Serial Monitor в Arduino IDE може передавати й приймати текстові повідомлення під час з'єднання з платою. Світлодіоди RX і TX на платі блимають під час передачі даних через USB або чип FTDI, але не активуються при використанні звичайної послідовної передачі через порти RX і TX.

Крім цього, з використанням бібліотеки SoftwareSerial можна організувати додаткову послідовну комунікацію через будь-які цифрові виводи Uno.

МК ATmega328 також підтримує інтерфейси I2C (TWI) і SPI, для роботи з якими в середовищі Arduino IDE передбачені стандартні бібліотеки, зокрема Wire для шини I2C.

Програмування

Програмування платформи робиться в середовищі Arduino IDE. У меню Tools > Board необхідно обрати тип плати – “Arduino Uno”, що відповідає встановленому мікроконтролеру. Додаткові відомості можна знайти в офіційній довідці та супровідних інструкціях. Мікроконтролер ATmega328 зазвичай постачається з уже прошитим завантажувачем (bootloader), який дає змогу записувати нові прошивки без використання зовнішнього програматора. Передача програм відбувається за допомогою стандартного протоколу STK500. Якщо ж завантажувач не використовується, мікроконтролер можна прошити напряму через виводи ICSP (програмування безпосередньо на платі – In-Circuit Serial Programming).

Автоматичне (програмне) перезавантаження

Плата Arduino Uno сконструйована так, щоб її перезавантаження перед завантаженням нового коду виконувалося автоматично програмою Arduino IDE на комп’ютері, без потреби вручну натискати кнопку Reset на самій платі. Для цього одна з ліній управління потоком даних – DTR мікросхеми ATmega8U2 – з'єднана з виводом скидання МК ATmega328 через конденсатор ємністю 100 нФ. Коли по цій лінії подається сигнал низького рівня, МК автоматично перезавантажується. Завдяки цьому механізму натискання кнопки Upload у середовищі Arduino IDE автоматично ініціює процес завантаження коду, оскільки перезавантаження і початок запису координуються, що зменшує таймаут завантажувача.

Цей механізм також впливає на поведінку плати при підключенні до комп’ютерів з macOS або Linux – Uno автоматично перезавантажується щоразу при з'єднанні з Arduino IDE через USB. Протягом наступних 500 мс після скидання активується завантажувач, тому IDE робить коротку паузу, щоб не передавати зайві байти до початку завантаження коду. Якщо скетч вже записаний у пам’ять і здійснюється налагодження або передача даних одразу після запуску, необхідно забезпечити затримку приблизно на одну секунду, щоб комп’ютерна програма не починала передачу раніше, ніж завершиться завантаження.

На платі Arduino Uno передбачена можливість відключення функції автоматичного перезавантаження. Це можна зробити, роз’єднавши відповідну лінію, яка позначена як "RESET-EN". Для відновлення функціональності автоматичного скидання контакти цієї лінії можна знову з'єднати. Альтернативний спосіб відключення автоматичного перезапуску – підключення резистора номіналом 110 Ом між виводом 5V та лінією RESET-EN.

Захист USB-порту від перевантаження

В Arduino Uno вбудовано самовідновлюваний запобіжник, який забезпечує додатковий захист порту USB комп’ютера від короткого замикання або перевищення струму. Хоча більшість сучасних комп’ютерів мають вбудований захист, цей запобіжник додає ще один рівень безпеки. Він автоматично розриває ланцюг, якщо струм перевищує 500 мА, і відновлює з’єднання після повернення струму до безпечного рівня.

Опис давача вологості грунту YL-69 (HL-69)

Для використання давача зібрано на його основі макет. Давач заживлено та підключено до мікроконтролера. Давач поміщуємо в середовище вимірювання. На платі є синій світлодіод – індикатор живлення. На платі є червоний світлодіод, який світиться, коли давач передає дані до контролера. Управління давачем може виконуватися від контролера плати Arduino, або від іншого керуючого мікропроцесорного пристрою за допомогою спеціальної програми. На платі розміщений змінний резистор, який використовується для налаштування чутливості давача. Давач вологості грунту має два інтерфейси: для живлення та для підключення чутливого елемента до мікроконтролера. В модулі давача вологості грунту є 4-х контактний штирьовий інтерфейс для підключення живлення і мікроконтролера. Позначення виводів:

Для підключення сенсора зазвичай використовується двоконтактний штирьовий роз’єм. Живлення давача може здійснюватися безпосередньо від плати Arduino, від іншого мікропроцесорного пристрою або від окремого джерела живлення, наприклад, батареї чи блоку живлення. Діапазон допустимої напруги для сенсора становить від 3,3 В до 5 В.

Характеристики давача вологості грунту YL-69 (HL-69):

Модуль давача вологості грунту складається з двох частин: давача і плати управління (електроніки обробки сигналу) [18]. Давач представляє собою пару щупів (зондів), що проводять електричний струм. Вони використовуються для вимірювання вмісту води в грунті.

Рис. 3.2 Давач вологості грунту

Плата управління (обробки сигналу) складається з компаратора напруг на мікросхемі LM393. Плата також містить всі необхідні компоненти такі як: роз’єми, світло діоди, резистори і т.д. Додатково є можливість налаштування чутливості модуля за допомогою потенціометра.

Принцип роботи давача вологості грунту

Принцип роботи давача вологості грунту досить простий. Він працює як компаратор, порівнює дві напруги. Наступна схема допомагає зрозуміти роботу типового давача вологості грунту.

Рис. 3.3 Схема управління та обробки сигналу давача вологості грунту

Як видно з рисунка, один вхід компаратора LM393 підключено до потенціометра R2 номіналом 10 кОм, тоді як інший вхід підключено до схеми подільника напруг утвореної резистором R1 10 кОм та щупом (зондом) вологості грунту k1. В залежності від кількості води в грунті, провідність щупа (між щупами, зондами (штирями)) міняється. Якщо вміст води менший, то провідність через щуп (між штирями) також менша і вхід компаратора буде високий (на вході компаратора буде високий рівень напруги). Це означає, що вихід компаратора є високий і світлодіод D2 не світитися (виключений).

Відповідно, якщо адекватна (достатня) кількість воли, то провідність між щупами k1 зростає і вихід компаратора LM393 стає низьким, засвічується світлодіод D2.

Підключення давача вологості грунту до Arduino

Основною перевагою цього давача вологості грунту є те, що він має аналоговий вихід. Отримавши аналоговий сигнал і подавши його на аналоговий вхід плати Arduino можна досить точно визначити у відсотках вміст вологи в грунті.

Рис. 3.4 Схема підключення давача вологості грунту до плати Arduino

Опис давача кислотності pH

Сучасний світовий ринок електронних комплектуючих пропонує широкий ассортимент давачів. На сьогоднішній день пропонуються різні модулі давачів для плат Arduino. Модуль давача pH спеціально спроектовано для контролерів Arduino, який просто вбудовується та має зручний і практичний інтерфейс підключення [19]. Він має світлодіодний індикатор живлення, роз’єм BNC та PH2.0 сенсорний інтерфейс. Використання такого pH метра є простим, потрібно підключити pH сенсор через роз’єм BNC до pH2.02 інтерфейсної плати метра, а її підключити до аналогового вхідного порта контролера Arduino. Для того щоб бути впевненим у точності pH щупа, потрібно регулярно використовувати еталонний розчин для його калібрування. pH метр може застосовуватися для перевірки якості води в аквакультурі.

pH метер дає змогу проводити вимірювання з точністю ± 0.1pH (25 ℃), що є для більшості потреб хорощою точністю. Він має світлоідіодний індикатор живлення, BNC роз’єм та PH2.0 сенсорний інтерфейс. Використання pH метра є досить простим, спочатку потрібно підключити pH сенсор за допомогою BNC роз’єму до інтерфейсної плати PH2.0. Тоді, інтерфейсну плату підключаємо до аналогового вхідного порта контролера Arduino.

Використання pH метра (вимірювача кислотності).

Рис. 3.5 pH давач з інтерфейсним модулем підключення до плат Arduino

На рис. 3.6 наведено схему підключення pH метра до плати Arduino.

Рис. 3.6 Схема підключення pH метра до плати Arduino

Аналоговий pH метер включає pH сенсор (щуп) з кабелем і BNC конектором (роз’ємом) та інтерфейсну плату до якої він підключається через BNC гніздо. Інтерфейсна плата має на виході аналогову напругу, яка міняється в межах сотень мілівольт. Інтерфейсна плата pH сенсора підключається до аналогового входу контролера Arduino.

Характеристики pH метра (модуля):

Напруга живлення модуля: 5,00 В

Розміри модуля: 43мм×32мм

Діапазон вимірювання: 0-14 PH

Робоча температура вимірювання: 0-60 ℃

Точність: ± 0,1 pH (25 ℃)

Час відгуку: ≤ 1 хв

pH давач з BNC конектором (роз’ємом)

PH2.0 інтерфейс (3 foot patch)

Потенціометр для налаштування (настройки) підсилення

Світлодіодний індикатор живлення

Довжина кабеля від давача до BNC конектора (роз’єму): 660 мм

Довжина pH електрода

Рис. 3.7 Конструктивні розміри pH давача

Характеристики pH електрода

Виходом pH електрода є напруга в мілівольтах (є мілівольти). Залежність значення pH від виміряної напруги при 25ºC наведено в табл. 3.2.

Таблиця 3.2

Залежність вихідної напруги давача від рівня pH

Алгоритм використання pH- метра

Напруга живлення повинна бути виставлена на платі Arduino перемикачем у положення +5,00В. Чим стабільніша напруга живлення тим більша точність давача. Рекомендовано використовувати зовнішнє джерело живлення, яке якомога близьке до +5,00В.

Кожного разу перед використанням pH електрода (давача), його потрібно відкалібрувати за допомогою стандартного (еталонного) розчину або буферного розчину, щоб отримати точніші результати. Найкраща температура навколишнього середовища є приблизно 25 ℃ і значення pH є відомим і стабільним, близьким до виміряного значення. Якщо вимірюємо кислотне середовище (зразок), значення pH стандартного (типового, еталонного) розчину є 4,00. Якщо вимірюємо лужне середовище (лужний зразок), то значення pH типового еталонного розчину має бути 9,18. Калібрування pH давача (електрода) потрібне для отримання кращої точності.

Перед початком вимірювання кислотності різних розчинів pH електродом, потрібно його вимити у воді. Рекондовано pH електрод (давач) промити в дистильованій або деоінізованій воді.

Підключення обладнання. З'єднуємо всі компоненти відповідно до схеми. Електрод pH з'єднуємо з платою pH-метра через BNC-роз’єм. Потім, використовуючи дроти з'єднання, підключаємо вихід плати pH-метра до аналогового входу A0 на контролері Arduino. Після подачі живлення на Arduino на платі pH-метра має засвітитися синій індикаторний світлодіод.

Завантаження коду. Відкриваємо Arduino IDE та завантажуємо скетч (програмний код) до мікроконтролера плати Arduino.

Базове калібрування. Занурюємо електрод у стандартний (еталонний) розчин з pH 7.00 або відповідний. У середовищі Arduino IDE відкриваємо монітор послідовного порту та спостерігаємо за показником pH. Якщо відхилення не перевищує ±0,3, то записуємо отримане значення та обчислюємо різницю з еталонним (7.00). Цю різницю вносимо у змінну Offset у коді. Наприклад, якщо відображається значення 6.88, то потрібно змінити #define Offset 0.00 на #define Offset 0.12.

Кислотне калібрування. Поміщаємо електрод у буферний розчин з pH 4.00. Через приблизно хвилину, після стабілізації показника, налаштовуємо посилення за допомогою потенціометра на платі, щоб досягти значення, близького до 4.00. Після цього етапу pH-метр готовий до вимірювання кислотних розчинів. Перед переходом до інших зразків електрод слід ретельно промити.

Лужне калібрування. Після попереднього налаштування можна проводити вимірювання pH лужних розчинів. Однак для підвищення точності виконується додаткове калібрування із використанням буферного розчину з pH 9.18. Аналогічно, після стабілізації сигналу регулюємо потенціометр так, щоб показник становив приблизно 9.18. Після завершення цього калібрування можна проводити точні вимірювання pH лужних середовищ.

Опис та вивід значень на РКІ (LCD)

Під час проектування електронних пристроїв потрібно мати недорогий пристрій для відображення інформації. З усіх доступних на ринку РК - дисплеїв, найчастіше використовується LCD 1602A [20]. Він може відображати ASCII - символи в 2 рядки (16 знаків в 1 рядку). Кожен символ у вигляді матриці 5×7 пікселів.

Рис. 3.8 Символьний LCD 1602A

LCD 1602A є електронним модулем на драйвері HD44780 від фірми Hitachi. LCD1602 має 16 контактів і може працювати в 4-бітному режимі (з використанням тільки 4-х ліній даних) або 8-бітному режимі (з використанням усіх 8-ми ліній даних).

3.2. Проектування мікроконтролерної системи в САПР Proteus VSM

Розроблювальна мікроконтрлерна система повинна вимірювати вологість, кислотність та температуру грунту, виводити виміряні значення на РК-дисплей, на ПК через послідовний інтерфейс, та зберігати їх у файлі *.CSV на SD-карті пам’яті. На рис. 3.9 зображено функціональну схему мікроконтролерної системи вимірювання вологості та кислотності грунту. Система складається з апаратного та програмного забезпечення [21-25]. Апаратне забезпечення системи вимірювання вологості і кислотності грунту складається з плати Arduino Uno R3 на МК ATmega328, модуля давача вологості грунту з аналоговим та цифровим виходами, модуля давача кислотності, давача температури, модуля SD-картрідера з SD-картою пам’яті на 16 МБ, символьного РК-дисплею 16×2 на контролері HD44780.

Рис. 3.9 Функціональна схема мікроконтролерної системи визначення рівня вологості і кислотності грунту

На рис. 3.10 зображено спроектовану апаратну частину мікроконтролерної системи визначення рівня вологості та кислотності грунту в системі автоматизованого проектування та моделювання електронних схем та програмованих пристроїв Proteus VSM. На схемі давачі вологості і кислотності грунту змодельовано як змінні резистори (потенціометри). Модуль давача вологості грунту має схему обробки сигналу, яка зібрана на компараторі LM393. Давач вологості грунту представляє собою пару щупів (зондів), які запихають в грунт. Провідність між щупами залежить від вологості грунту.

Аналоговий вихід модуля давача вологості AC підключено до входу A3 (ADC3), а давач кислотності підключено до входу A0 (ADC0) АЦП плати Arduino Uno. Виводи синхронізації SHT_SCK і даних SHT_DATA цифрового давача температури і вологості SHT75 підключено до пінів 3 та 2 плати Arduino Uno відповідно.

Рис. 3.10 Апаратне забезпечення мікроконтролерної системи визначення рівня вологості грунту в САПР Proteus VSM

Символьний РК-дисплей 1602A підключено до виводів портів D і B. Вивід вибору регістра LCD_RS підключено до піна 9, вивід LCD_E до піна 8. Виводи даних LCD_D4…LCD_D7 підключено відповідно до пінів 7…4. Картрідер карт памяті SD підключено по інтерфейсу SPI. Вивід CS до піна 10, вивід DI до піна 11, вивід DO до піна 12 і вивід CLK до піна 13. Вивід TxD підключено до виводу RxD, а RxD до виводу TxD послідовного порта МК. Кнопка Calibration призначена для калібрування давача вологості, а кнопка STORE для збереження виміряних значень у CSV-файлі на SD-карті пам’яті. На рис. 3.11 показана зібрана схема.

Рис. 3.11 Зібрана схема

Вимірювання вологості грунту у відсотках:

Аналоговий сигнал з давача вологості грунту обробляється АЦП. Вміст вологості у відсотках виводиться на монітор послідовного інтерфейсу. Вихідний сигнал давача вологості грунту змінюється в діапазоні АЦП значень від 0 до 1023. Це значення може бути представлене у відсотках використовуючи наступну формулу:

Для нульової вологості отримаємо максимальне значення 10-розрядного АЦП, тобто 1023. Після перетворення це дає значення вологості 0%.

Розділ IV.
Програмно-алгоритмчне забезпечення мікроконтролерної системи визначення рівня вологості і кислотності грунту

4.1. Алгоритм калібрування давачів

Рис. 4.1 Алгоритм калібрування давача вологості грунту

Принцип роботи давача pH

pH вимірює кислотність або лужність розчину, значення pH знаходиться в діапазоні від 0 до 14. pH визначає концентрацію іонів водню [H]+ в розчині. Сенсор вимірює різницю потенціалів між електродами: опорний електрод (reference electrode) (срібло/хлорид срібла) і скляний електрод, який сутливий до іонів водню. Для точної обробки сигналу з давача потрібна інтерфейсна електроніка, яка дасть змогу використовувати його з платою Arduino.

Таблиця 4.1

Специфікація на pH зонди

Тип електрода	Діапазон pH	Температура (ºC)	Нульова точка (pH)	Час відгуку (хв)	Шум (мВ)
65-1	0-14	0-80	7±1	<2
BX-5	0-14	0-80	7X±11	<2	<0.5
E-201	0-14	0-80	7±0.5	<2	<0.5
E-201-C	0-14	0-80	7X±0.5	<2	<0.5
95-1	0-14	0-80	7X±0.5	<2	<0.5
E-900	0-14	0-80	7X±0.5	<2

Таблиця 4.2

Характеристики модуля pH

Напруга живлення	5 В
Струм споживання	5-10 мA
Споживання	≤ 0.5 Вт
Робоча температура	10-50 ºC
Зелений світлодіод	Живлення
Червоний світлодіод	Поріг pH

Таблиця 4.3

Виводи модуля pH

To	Температура
Do	Сигнал порогового pH
Po	Аналоговий вихід значення pH
G	Аналоговий GND
G	Supply GND
V+	Supply (5В)

Калібрування давача

Модуль має в схемі два потенціометри. Один знаходиться ближче до конектора BNC сенсора для регулювання зміщення offset regulation, а інший pH limit.

Offset (Зміщення): Середній діапазон вимірювання щупа pH змінюється між від’ємним і додатним значеннями. Нульове значення напруги на виході щупа представляє значення pH 7. Щоб можна було використовувати його з Arduino в схемі потрібно додати значення зміщення (Offset value) до значення виміряного щупом, оскільки АЦП (ADC) може приймати на вхід лише додатні значення напруги. Тому, для налаштування pH на 7 відключаємо щуп від схеми і закорочуємо виводи всередині із зовні конектора BNC. За допомогою мультиметра вимірюємо значення на виході піна Po pin і відрегульовуємо потенціометр на 2,5 В. Тобто, тепер при нульовій напрузі на виході щупа модуль матимемо на виході 2,5 В (діапазон -414,12 В (0 В) до +414,12 В (+5 В)).

pH Limit (Граничне значення pH): Потенціометром можна встановити граничне значення спрацювання модуля давача при якому засвітиться червоний світлодіод і на виході Do буде сигнал високого рівня

Рис. 4.2 Графік залежності між виміряною напругою і значенням pH:

y= -5,70*x + 21,34

В додатку потрібно обчислити перетворення напруги, що дає нам pH давач. Отже, нам потрібно опорне (еталонне) pH значення і напругу на виході Po давача при цьому значенні. Найкраще використати еталонний розчин. Такі розчини продаються з різними значеннями pH, але найбільш поширені є pH 4,01, pH 6,86 і pH 9,18.

Використовуючи еталонні розчини з pH 4,01 і pH 6,86 отримаємо відповідно напруги на виході Po 3,04 В і 2,54 В. Давач має лінійну залежність, тому взявши дві точки ми можемо вивести формулу для перетворення виміряної напруги в значення pH. Загальна формула мала би бути наступна y=mx+b, отже потрібно обчислити m і b оскільки x буде напругою, а y – значенням pH.

pH1 = 4,01; pH2 = 6,86; V1 = 3,04 В; V2 = 2,54 В.

Результатом є формула y=-5,70x+21,34.

Алгоритм визначення рівня кислотності

Підключення модуля. Для з'єднання модуля з Arduino необхідно використати аналоговий вхід (A0), лінію живлення 5 В і два контакти GND, які в схемі модуля фізично розділені.

З’єднання електрода. pH-електрод підключається до pH-метра через роз’єм типу BNC. Далі pH-метр під’єднується до аналогового входу контролера Arduino.

Завантаження коду. В Arduino IDE відкриваємо відповідний скетч і завантажуємо його до мікроконтролера плати Arduino.

Первинне калібрування. Перед кожним використанням pH-електрод необхідно калібрувати за допомогою стандартного буферного розчину. Наприклад, занурюємо електрод у розчин з pH 7.00, відкриваємо монітор порту в Arduino IDE і спостерігаємо отримане значення. Якщо похибка становить не більше ±0,3, визначаємо різницю між показаним значенням і 7.00. Цю різницю вносимо в змінну-калібрування в коді. Наприклад, якщо вимірюване значення – 6.88, то потрібно змінити значення калібрувальної константи на 0.12.

Кислотне калібрування. Поміщаємо електрод у буферний розчин з pH 4.00. Після стабілізації показника (приблизно за хвилину) регулюємо посилення потенціометром до значення близького до 4.00. Таким чином завершується калібрування для вимірювання кислотних середовищ. Перед вимірюванням інших зразків pH-електрод необхідно промити в дистильованій або деіонізованій воді.

Лужне калібрування. Враховуючи лінійні властивості pH-електрода, після завершення кислотного калібрування можна вимірювати pH лужних розчинів. Для точнішого результату рекомендовано провести додаткове калібрування за допомогою буферного розчину з pH 9.18. Після занурення електрода і стабілізації показника регулюємо потенціометр так, щоб значення становило приблизно 9.18. Тепер пристрій готовий до вимірювання лужних середовищ.

Рис. 4.3 Алгоритм калібрування давача кислотності (pH)

Рис. 4.4 Алгоритм визначення рівня кислотності

При увімкненні живлення стартує виконання вбудованого ПЗ в МК AVR. Спочатку викликається функція setup(), що ініціалізує LCD 16×2, послідовний асинхронний прийомо-передавач UART (швидкість передачі 9600 біт/секунд), модуль SD – карти. Після завершення ініціалізації, система виводить на РКД текст-повідомлення “* Soil measurement *\n (C) Oleh Voloshyn” із затримкою на 2 с. Далі розпочинається процес вимірювання і визначення рівня вологості і кислотності грунту у тілі функції loop().

Результат, визначене значення вологості і pH грунту, відображаються на РК-дисплеї і виводяться на монітор послідовного порта ПК.

4.2. Використання бібліотеки SD для запису інформації на SD-карту пам’яті

Для Arduino є плати розширення, які мають роз’єм для карт пам’яті типу SD/microSD. Вони називаються SD-картрідери. Для роботи з SD-картрідером використовується бібліотека SD. Бібліотека SD призначена для читання/запису інформації, що знаходиться на SD - карті пам’яті. Вона підтримує файлові системи FAT16 і FAT32 і коректно працює лише з короткими іменами файлів по схемі вісім символів ім’я фалу і три розширення. Бібліотека підтримує відкриття декількох файлів. Бібліотека використовує виводи 11, 12 і 13 (на більшості платах Arduino) або 50, 51, 52 (Arduino Mega). При використанні цієї бібліотеки вивід 4 задіюється для сигналу SS (Slave Select). Розглянемо детальніше бібліотеку SD (знаходиться в папці libraries). Бібліотека SD містить клас SD, що надає функції для доступу до інформації на карті пам’яті. Клас SD має методи: begin(), exists(). mkdir(), open(), remove(), rmdir().

Функції класу SD:

Функція begin() ініціалізує бібліотеку SD, призначаючи вивід для сигналу SS

(Slave Select).

Синтаксис:

SD.begin();

SD.begin(pin)

Параметр: pin — вивід для сигналу SS.

Значення, що поаретається: true – у випадку успішного підключення, , false - у випадку невдачі.

Функція exists()

Функція exists() перевіряє, існує на карті SD файл або каталог.

Синтаксис:

SD.exists(path)

Параметр: path — імя файлу або каталогу.

Значення, що повертається: true — у випадку успішного підключення, false - у випадку невдачі.

Функція mkdir()

Функція mkdir() створює папку на карті памяті SD.

Синтаксис:

SD.exists(dirpath)

Параметр: dirpath — назва створюваного каталогу (папки). Якщо параметр задається у вигляді шляху з неіснуючими проміжними каталогами, то створюються і всі проміжні каталоги.

Функція rmdir()

Функція rmdir() видаляє (знищує) папку з карти пам’яті SD, папка має бути порожньою

Параметр: dirpath — назва папки, яка знищується. имя удаляемой папки.

Повертає значення: true — якщо папку знищено, false — у випадку невдачі.

Функція open()

Функція open() відкриває файл на карті пам’яті SD. Якщо файл не існує і відкривається для запису, то він буде створений.

Синтаксис:

SD.open(filepath)

SD.open(filepath, mode)

Параметри:

filepath — назва файлу, що відкривається;

mode — режим відкритого файлу:

• FILE_READ — відкрити файл для читання, починаючи з початку файлу;

• FILE_WRITE — відкрити файл для читання і запису, починаючи з кінця файлу.

Повертає значення: true — у випадку успіху, false — у випадку невдачі.

Функція remove()

Функція remove() видаляє файли з карти памяті SD.

Синтаксис:

SD.remove(filepath)

Параметр: filepath — назва файлу, що підлягаю знищенню.

Повертає значення: true — у випадку успіху, false — у випадку невдачі.

Клас File. Клас File має функції для читання і запису окремих файлів на карті памяті SD. Функції класу File: available(); close(); flush(); peek(); position();

print(); println(); seek(); size(); read(); write(); isDirectory(); openNextFile();

rewindDirectory().

Функція available()

Функція available() перевіряє, чи є доступним для читання байт у відкритому файлі.

Синтаксис:

myFile.available()

Параметр: File — екземпляр файлу File, який повертається SD.open(). Повернен значення є числом доступних для читання байтів.

Функція close()

Функція close() закриває файл і зберігає записані на нього дані на карту SD.

Синтаксис:

myFile.close()

Параметр: File — екземпляр файлу File, повернутий функцією SD.open().

Повернутого значення немає.

Функція flush()

Функція flush() гарантує, що будь-які байти, записані у файл, фізично збережуться на

SD-карті (при закритті файлу це робится автоматично).

Синтаксис:

myFile.flush()

Параметр: File — екземпляр файлу File, який повертається SD.open(). Поверненого значення немає.

Функція peek()

Функція peek() зчитує байт з файлу з поточної позиції, не пересуваючись до наступної позиції.

Синтаксис:

myFile.peek()

Параметр: File — екземпляр файлу File, який повертається SD.open(). Повернуті значення: байт з файлу або -1, якщо байт не зчитано.

Функція position()

Функція position() повертає поточну позицію у файлі, куди наступний байт буде записуватися або звідки зчитуватися.

будет записываться или откуда считываться.

Синтаксис:

myFile.position()

Параметр: File — екземпляр файлу File, який повертається функцією SD.open().

Повернене значення є поточна позиція у файлі.

Функція print()

Функція print() записує дані у файл, який було відкрито для запису.

Синтаксис:

myFile.print(data)

myFile.print(data, BASE)

Параметри:

File — екземпляр файлу File, возвращаемый SD.open();

data — дані для запису у файл;

BASE — вид передаваемых символов:

• BIN — двійковий;

• DEC — десятковий;

• OCT — вісімковий;

• HEX — шістнадцятковий.

Повернутого значення нема.

Функція println()

Функція println() записує дані у файл, який був відкритий для запису, дані доповнюються символми переведення рядка.

Синтаксис:

myFile.println()

myFile.println(data)

myFile.println(data, BASE)

Параметри:

File — екземпляр файлу File, який повертається функцією SD.open();

data — дані для запису у файл;

BASE — вид передаваних символів:

• BIN — двійковий;

• DEC — десятковий;

• OCT — вісімковий;

• HEX — шістнадцятковий.

Значення, що вертається нема.

Функція seek()

Функція seek() встановлює нову позицію у файлі для читання або запису байту.

Синтаксис:

myFile.seek(pos)

Параметри:

File — екземпляр файлу File, який повертає SD.open();

pos — нова встановлювальна позиція у файлі для читання або запису у файл.

Повернене значення: true — у випадку успіху, false — у випадку невдачі.

Функція size()

Функція size() повертає розмір файлу в байтах.

Синтаксис:

myFile.size()

Параметр: File — екземпляр файлу File, який повертає SD.open().

Повернуте значення: розмір файлу в байтах.

Функція read()

Функція read() повертає байт з відкритого файлу.

возвращает байт из открытого файла.

Синтаксис:

myFile.read()

Параметр: File — екземпляр файлу File, який повертає SD.open().

Повернуте значення: отриманий з файлу байт.

Возвращаемое значение: полученный из файла байт.

Функція write()

Функція write() записує дані у відкритий для запису файл.

записывает данные в открытый для записи файл.

Синтаксис:

myFile.write(data)

myFile.write(buf, len)

Параметри:

File — екземпляр файлу File, який повертає SD.open();

data — дані для запису. передаваемые данные;

buf — масив симолів або байтів массив символов или байтов;

len — розмір симолів в буфері для запису размер символов в буфере для записи.

Повернуте значення: кількість записаних байтів.

Возвращаемое значение: количество записанных байтов.

Функція isDirectory()

Функція isDirectory() перевіряє, чи є поточний файл каталогом чи ні.

Синтаксис:

myFile.isDirectory()

Параметр: File — екземпляр файлу File, який повертає SD.open().

Повернуте значення: true — якщо так, false — якщо ні.

Функція openNextFile()

Функція openNextFile() повертає назву наступного за позицією файлу з каталогу.

Синтаксис:

myFile.openNextFile()

Параметр: File — екземпляр файлу File, який повертає SD.open().

Повернуте значення: назва наступного файлу з каталогу.

Функція rewindDirectory()

Функція rewindDirectory() приведе назад в перший файл каталогу.

приведет вас обратно в первый файл в каталоге.

Функція використовується разом з openNextFile().

Синтаксис:

myFile. rewindDirectory()

Параметр: File — екземпляр файлу File, який повертає SD.open().

Повернуте значення: назва першого файла каталогу.

4.3. Використання бібліотеки LiquidCrystal для роботи з LCD HD44780

Для виводі інформації на РК-дисплей в Arduino є готова бібліотека LiquidCrystal. Ця бібліотека дає змогу виводити інформацію через плату Arduino на текстовий РК-дисплей з контролером Hitachi HD44780 (або сумісним). Бібліотека може працювати як в 4-х так і в 8 – ми бітному режимі (використовуючи 4 або 8 ліній даних та rs, enable, rw лінії управління). Бібілотека містить наступні функції:

lcd.print() – відображає на дисплеї довільну інформацію починаючи з поточної позиції курсора. В якості аргумента можна використовувати текстовий рядок або змінну.

lcd.setCursor(Pos, Str) – встановлює курсор РК-дисплею в позицію Pos рядка Str;

lcd.home() – встановлює курсор дисплею в нульову позицію, рядка 0 дисплею;

lcd.clear() – очищає РК-дисплей;

lcd.Display() –включає РК-дисплей;

lcd.noDisplay() – виключає РК-дисплей;

lcd.Cursor() – включає курсор;

lcd.noCursor() – виключає курсор;

lcd.blink() – включає мигання курсора;

lcd.noblink() – виключає мигання курсора;

lcd.scrollDisplayLeft() – зсув інформації на дисплеї вліво;

lcd.scrollDisplayRight() – зсув інформації на дисплеї вправо;

lcd.leftToRight() – встановлює вивід текстового рядка зліва направо;

lcd.rightToLeft() – встановлює вивід текстового рядка справа наліво;

lcd.createChar(Adr, CH[]) – створення довільного символу. Команда записує в пам’ять дисплею довільний символ. Запис виконується по одному з перших 8 адерс (від 0 до 7) в пам’яті знакогенератора. Символ CH[] повинен представляти собою масив з 8 байт. Для задання пікселів, в кожному байті використовують лише 8 молодших біт.

4.4. Програмна реалізація алгоритму роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту

void loop()

{

error=0;

error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); // вимірюємо вологість

error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); // вимірюємо температуру

if (error!=0)

s_connectionreset(); // якщо помилка: скинути підключення

else

{

humi_val.f = (float)humi_val.i; // перетворити ціле в дійсне

temp_val.f = (float)temp_val.i; // перетворити ціле в дійсне

calc_sth11(&humi_val.f, &temp_val.f); // обчислити вологість, температуру

dew_point = calc_dewpoint(humi_val.f, temp_val.f); // обчислити точку роси

lcd.setCursor(0,0);

lcd.print(temp_val.f, 1);

lcd.print(char(223));

lcd.print("C ");

//lcd.setCursor(0,1);

lcd.print(humi_val.f, 1);

lcd.print("% RH ");

// вивід даних на термінал

Serial.print("Temperature: ");

Serial.print(temp_val.f);

Serial.print(" degC \t");

Serial.print("Humidity: ");

Serial.print(humi_val.f);

Serial.println("% RH");

if ((humi_val.f != last_humi) || (temp_val.f != last_temp))

{

sdCardWrite(temp_val.f, humi_val.f);

last_humi = humi_val.f;

last_temp = temp_val.f;

}

}

static unsigned long samplingTime = millis();

static unsigned long printTime = millis();

static float pHVol = 0.0f, pHValue = 0.0f;

static String str;

if(millis()- samplingTime > samplingInterval)

{

pHArray[pHArrayIndex++] = analogRead(PH_SENSOR_PIN);

if(pHArrayIndex == ArrayLength) pHArrayIndex = 0;

pHVol = averageArray(pHArray, ArrayLength)*5.0/1024;

pHValue = -5.70 * pHVol + 21.34;

samplingTime = millis();

}

if(millis() - printTime > printInterval) // кожні 800 мілісекунд, виводити число, конвертувати стан LED індикатора

{

if (pHValue < 7)

str = "Acidic ";

else if (pHValue == 7)

str = "Neutral ";

else if (pHValue > 7)

str = "Alkaline ";

Serial.print("pH value = ");

Serial.print(pHValue, 2);

Serial.print(" Solution: ");

Serial.println(str);

lcd.setCursor(0, 1);

lcd.print("pH ");

lcd.print(pHValue, 1);

//lcd.setCursor(0, 1);

lcd.print(" ");

lcd.print(str);

printTime = millis();

}

// читаємо стан кнопки в локальну змінну:

int reading = digitalRead(STORE_BUTTON_PIN);

// перевіряємо чи кнопка натиснута

// (i.e. вхід переходить з стану LOW в стан HIGH), потрібно почекати трохи

// з останнього натиснення, щоб проігнорувати будь-який шум (дребезг брязкіт тремтіння контакту):

if (reading != lastButtonState) {

// скидаємо таймер антибрязкіту

lastDebounceTime = millis();

}

if ((millis() - lastDebounceTime) > debounceDelay) {

// якщо стан кнопки змінився:

if (reading != buttonState) {

buttonState = reading;

if (buttonState == HIGH) {

//ledState = !ledState;

sdCardWrite(temp_val.f, humi_val.f);

}

}

}

//digitalWrite(ledPin, ledState);

lastButtonState = reading;

}

4.5. Моделювання та аналіз результатів роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Програмна прошивка для мікроконтролера платформи Arduino є файлом з розширенням hex. В програмі Proteus ISIS перевіряємо коректну роботу прошивки на зібраній схемі мікроконтролерного пристрою. Proteus ISIS - це потужне програмне забезпечення для моделювання і відлагодження досить складних пристроїв, що можуть містити одночасно в одному пристрої кілька МК і навіть з різних сімейств. На рисунках нижче зображено моделювання роботи спроектованої мікроконтролерної системи.

Рис. 4.5 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис. 4.6 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис. 4.7 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис.4.8 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис. 4.9 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис. 4.10 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис. 4.11 Моделювання роботи мікроконтролерної системи визначення рівня вологості і кислотності грунту в Proteus ISIS

Рис. 4.1. Вивід інформації на монітор послідовного інтерфейсу

Висновки

У кваліфікаційній роботі розроблено мікроконтролерну систему для вимірювання кислотності та вологості ґрунту. Система здатна визначати рівень вологості, температуру та pH ґрунту, відображати ці показники на рідкокристалічному дисплеї, а також зберігати отримані дані на SD-карті після натискання кнопки STORE.

Під час розробки апаратної частини було використано сучасну елементну базу. Основу системи складає плата Arduino Uno R3 з мікроконтролером ATmega328. У якості виконавчих елементів використано датчик вологості ґрунту з аналоговим і цифровим виходами, температурний сенсор, модуль зчитування SD-карт, SD-карта об’ємом 16 МБ, а також символьний LCD-дисплей 16×2 на базі контролера HD44780.

Була розроблена принципова електрична схема та створено модель системи в середовищі автоматизованого проєктування Proteus Design Suite. Окрему увагу приділено створенню алгоритму калібрування датчика вологості. Реалізовано програмні модулі для взаємодії з датчиком вологості, температурним сенсором і SD-картридером.

Програмне забезпечення системи розроблено мовою C в середовищі Arduino IDE. Його функціональність перевірено шляхом моделювання в емуляторі Proteus ISIS, результати якого підтвердили правильну роботу апаратної частини та програмної логіки.

Також виготовлено і протестовано фізичний макет мікроконтролерної системи вимірювання вологості ґрунту.

Список використаних літературних джерел

Пристрої визначення вологості, кислотності (pH) грунту [Електронний ресурс]. – Режим доступу: https://www.amazon.com/soil-moisture-meter/s?k=soil+­moisture+­meter, https://www.bobvila.com/articles/best-soil-moisture-meter/, https://­www.aliexpress.com/w/wholesale-soil-moisture-meter.html.

САПР Proteus VSM [Електронний ресурс]. – Режим доступу: https://www.labcenter.com/downloads/.

Середовище розробки Arduino IDE [Електронний ресурс]. – Режим доступу: https://www.arduino.cc/en/Main/Software.

Massimo Banzi. Getting Started with Arduino. – 2nd Edition. O’Really Media Inc., 2011. – p. 130.

Brian Evans. Beginning Arduino Programming. Writing Code for the Most Popular Microcontroller Board in the World. – Springer Science + Business Media, 2011. – p. 271.

George Gibson. Arduino: A Beginner’s Guide to Arduino Programming. – Published by Kindle Edition, 2023. – p. 111.

Sarful Hassan, Mehadi Hasan Maruf. Arduino Programming for Absolute Beginners: Master Arduino from Scratch with Easy-to-Follow Projects and Examples. – Published by Kindle Edition, 2024. – p. 478.

Jack Purdum. Beginning C for Arduino, Second Edition: Learn C Programming for the Arduino. – Published by Apress; 2nd ed., 2015. – p. 414.

Simon Monk. Programming Arduino Next Steps: Going Further with Sketches, Second Edition. – Published by McGraw Hill TAB; 2nd ed., 2018. – p. 320.

Sarful Hassan. Arduino Programming Essentials: A Practical Handbook for Makers, Engineers, and Students. – Independently published, 2024. – p. 308.

John Baichtal. Arduino for Beginners: Essential Skills Every Maker Needs. Published by Pearson Education, Inc., 2014. – p. 376.

John Nussey. Arduino for Dummies. Published by For Dummies, 1st ed., 2013. – p. 438.

Навчальні матеріали по Arduino [Електронний ресурс]. – Режим доступу: https://www.arduino.cc/.

Arduino [Електронний ресурс]. – Режим доступу: https://www.arduino.cc/en/Tutorial/HomePage

Arduino [Електронний ресурс]. – Режим доступу: https://www.tutorialspoint.com/arduino/.

Arduino [Електронний ресурс]. – Режим доступу: https://learn.adafruit.com/category/learn-arduino.

Електронний ресурс на МК AVR ATmega328: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automo­tive-Microcontrollers-ATmega328P_Datasheet.pdf.

Електронний ресурс на сенсор вологості грунту YL-69 (HL-69): https://www.circuits-diy.com/how-to-interface-soil-moisture-sensor-yl-69-hl-69-with-arduino-uno/#google_vignette, https://randomnerdtutorials.com/guide-for-soil-moisture-sensor-yl-69-or-hl-69-with-the-arduino/.

Електронний ресурс на сенсор pH. – Режим доступу: https://wiki.dfrobot.com/RS485_Soil_Sensor_Temperature_Humidity_PH_SKU_SEN0602, https://circuitdigest.com/microcontroller-projects/arduino-ph-meter, https://www.instructables.com/ARDUINO-PH-METER/, https://robu.in/the-ph-meter-by-using-arduino-detail-guide/.

Елетронний ресурс на РК-дисплей 1602A HD44780. – Режим доступу: https://lastminuteengineers.com/arduino-1602-character-lcd-tutorial/#google_vignette, https://www.instructables.com/How-to-Control-an-LCD-Display-the-Easy-Way-Arduino/.

Michael Margolis. Arduino Cookbook, Second Edition. – Published by O’Reilly Media Inc., 2012. – p. 724.

Emily Gertz, Patrick Di Justo. Environmental Monitoring with Arduino: Building Simple Devices to Collect Data About the World Around Us. – Published by Make Community LLC, 1st ed., 2012 – p. 98.

Jonathan Oxer and Hugh Blemings. Practical Arduino: Cool Projects for Open Source Hardware. - Springer-Verlag New York, 2009. – p. 445.

Brian Huang and Derek Runberg. The Arduino Inventor’s Guide. – SparkFun Electronics, 2017. – p. 472.

Електронний ресурс. Режим доступу: https://www.hackster.io/arduino/­projects https://playground.arduino.cc/Projects/Ideas.

ДОДАТКИ

Додаток A

Модель системи визначення рівня вологості і кислотності грунту в САПР Proteus

Додаток Б

Головний програмний модуль мікроконтролерної системи визначення рівня вологості і кислотності грунту

/* Мікроконтролерна система визначення рівня вологосі і кислотності грунту

Розробив: студент групи ІТ-41з, Богдан Дудар

*/

#include <LiquidCrystal.h>

#define SOIL_MOISTURE_SENSOR_PIN A3 // аналоговий пін 2 до якого підключено давач

#define SOIL_MOISTURE_LEVEL 250 // the value after the LED goes ON

#define SOIL_MOISTURE_LEVEL_LED A2

// ініціалізація бібліотеки номерами інтерфейсних пінів

//LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup()

{

Serial.begin(9600);

pinMode(SOIL_MOISTURE_SENSOR_PIN, INPUT);

pinMode(SOIL_MOISTURE_LEVEL_LED, OUTPUT);

lcd.begin(16, 2);

lcd.setCursor(1, 0);

lcd.print("Soil moisture");

lcd.setCursor(2, 1);

lcd.print("measurement");

delay(1000);

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Developed by");

lcd.setCursor(0,1);

lcd.print("Bohdan Dudar");

delay(1000);

lcd.clear();

}

/*void calibration()

{

soil_moisture_sensor_value = analogRead(SOIL_MOISTURE_SENSOR_PIN);

Serial.print("Soil moisture sensor value: "); //Serial.print("Значення вологості грунту давача: ");

Serial.println(soil_moisture_sensor_value);

}*/

void loop()

{

float soil_moisture_percentage;

int soil_moisture_sensor_value;

soil_moisture_sensor_value = analogRead(SOIL_MOISTURE_SENSOR_PIN);

Serial.print("Soil moisture sensor value: "); //Serial.print("Значення вологості грунту давача: ");

Serial.println(soil_moisture_sensor_value);

lcd.setCursor(0, 0);

lcd.print("Value: ");

lcd.print(soil_moisture_sensor_value);

soil_moisture_percentage = map(soil_moisture_sensor_value, 750, 180, 0, 100); //982, 148, 0); // output_value = map(output_value,750,180,0,100);

if (soil_moisture_percentage > 100)

soil_moisture_percentage = 100;

else if (soil_moisture_percentage < 0)

soil_moisture_percentage = 0;

Serial.print("Soil moisture percentage: "); // Serial.print("Вологість грунту у відсотках: ")

Serial.print(soil_moisture_percentage);

Serial.println("% ");

lcd.setCursor(0, 1);

lcd.print("Moisture: ");

lcd.print(soil_moisture_percentage, 0);

lcd.print("% ");

if (soil_moisture_sensor_value > SOIL_MOISTURE_LEVEL)

{

digitalWrite(SOIL_MOISTURE_LEVEL_LED, HIGH);

} else {

digitalWrite(SOIL_MOISTURE_LEVEL_LED, LOW);

}

delay(500);

}

/* Мікроконтролерна система визначення рівня вологосі і кислотнрсті грунту

Розробив: студент групи ІТ-41з, Богдан Дудар

*/

#include "shtxx.h"

#include <LiquidCrystal.h> // бібліотека LCD - рідкокристалічного дисплею

#include <SPI.h>

#include <SD.h>

#define SD_CARD_LED A2

#define PH_SENSOR_PIN A0 // pH meter Analog output to Arduino Analog Input 0

#define READ_BUTTON_PIN A4

#define STORE_BUTTON_PIN A5

#define samplingInterval 20

#define printInterval 800

#define ArrayLength 40 // час збору замірів

// ініціалізація бібліотеки номерами інтерфейсних пінів

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

value humi_val, temp_val;

float t=0, dew_point=0;

unsigned char error, checksum, val=1;

int ledState = HIGH; // поточний стан LED

int buttonState; // поточний стан кнопки

int lastButtonState = LOW; // попередній стан кнопки

// the following variables are unsigned longs because the time, measured in

// milliseconds, will quickly become a bigger number than can be stored in an int.

unsigned long lastDebounceTime = 0; // the last time the output pin was toggled

unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers

int pHArray[ArrayLength]; //Store the average value of the sensor feedback

int pHArrayIndex = 0;

/*

SD карта пам'яті підключається по інтерфейсу SPI:

** MOSI - пін 11 на платі Arduino Uno

** MISO - пін 12 на платі Arduino Uno

** CLK - пін 13 на платі Arduino Uno

** CS - залежить від шилда або модуля SD карти

*/

// оголошення змінних використовуючи бібліотечні функції утиліти SD:

Sd2Card card;

SdVolume volume;

SdFile root;

File myFile;

const char fileName[] = "data.csv";

String dataString ="";

const int chipSelect = 10;

float last_temp = 0, last_humi = 0;

void setup()

{

Serial.begin(9600);

Serial.println("*** Microcontroller system for measuring soil moisture and acidity level ***");

// ініціалізація пінів кнопок як входи:

pinMode(READ_BUTTON_PIN, INPUT);

pinMode(STORE_BUTTON_PIN, INPUT);

//

pinMode(SD_CARD_LED, OUTPUT);

// встановлення кількості стовпців і рядків LCD:

lcd.begin(16, 2);

lcd.clear();

// ініціалізація давача вологості і температури SHT75

sht_init();

s_connectionreset();

//set SHTXX sensor resolution for temperature 12 bit and for humidity 8 bit

s_write_statusreg(&val);

s_read_statusreg(&val, &checksum);

// so you have to close this one before opening another.

Serial.print("Initializing SD card...");

if (!SD.begin(10)) {

Serial.println("initialization failed!");

while (1);

}

Serial.println("initialization done.");

lcd.setCursor(0,0);

lcd.print(" Soil moisture ");

lcd.setCursor(0,1);

lcd.print("measure system");

delay(500);

lcd.setCursor(0,0);

lcd.print(" Developed by ");

lcd.setCursor(0,1);

lcd.print("Bohdan Dudar");

delay(500);

lcd.clear();

}

/*void loop()

{

float temp_c;

float temp_f;

float humidity;

// Read values from the sensor

temp_c = sht1x.readTemperatureC();

temp_f = sht1x.readTemperatureF();

humidity = sht1x.readHumidity();

// Print the values to the serial port

Serial.print("Temperature: ");

Serial.print(temp_c, DEC);

Serial.print("C / ");

Serial.print(temp_f, DEC);

Serial.print("F. Humidity: ");

Serial.print(humidity);

Serial.println("%");

delay(2000);

}*/

double averageArray(int* arr, int number){

int i;

int max,min;

double avg;

long amount=0;

if(number<=0){

Serial.println("Error number for the array to avraging!/n");

return 0;

}

if (number < 5){ //менше 5, обчислена статистика безпосередньо

for(i = 0; i < number; i++){

amount+=arr[i];

}

avg = amount/number;

return avg;

} else{

if(arr[0] < arr[1]){

min = arr[0]; max = arr[1];

}

else{

min = arr[1]; max = arr[0];

}

for (i = 2; i < number; i++){

if(arr[i] < min){

amount += min; // arr<min

min = arr[i];

} else {

if(arr[i] > max){

amount += max;

max = arr[i];

} else{

amount += arr[i];

}

}

}

avg = (double)amount/(number-2);

}

return avg;

}

void sdCardWrite(float temp, float humi)

{

myFile = SD.open(fileName, FILE_WRITE); // відкриття файлу на SD карті для запису даних

if (myFile) {

Serial.print("Writing to ");

Serial.print(fileName);

Serial.print("...");

digitalWrite(SD_CARD_LED, HIGH);

dataString = String(temp) + " degC, " + String(humi) + "% RH";

myFile.println(dataString);

//myFile.println(humi);

myFile.close();

Serial.println("done.");

delay(100);

digitalWrite(SD_CARD_LED, LOW);

} else {

Serial.println("error opening test.txt");

}

// відкриття файлу для читання:

/*myFile = SD.open(fileName);

if (myFile) {

Serial.println(fileName+":");

while (myFile.available()) {

Serial.write(myFile.read());

}

myFile.close();

} else {

Serial.println("error opening test.txt");

}*/

}

void loop()

{

error=0;

error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); // вимірюємо вологість

error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); // вимірюємо температуру

if (error!=0)

s_connectionreset(); // якщо помилка: скинути підключення

else

{

humi_val.f = (float)humi_val.i; // перетворити ціле в дійсне

temp_val.f = (float)temp_val.i; // перетворити ціле в дійсне

calc_sth11(&humi_val.f, &temp_val.f); // обчислити вологість, температуру

dew_point = calc_dewpoint(humi_val.f, temp_val.f); // обчислити точку роси

lcd.setCursor(0,0);

lcd.print(temp_val.f, 1);

lcd.print(char(223));

lcd.print("C ");

//lcd.setCursor(0,1);

lcd.print(humi_val.f, 1);

lcd.print("% RH ");

// вивід даних на термінал

Serial.print("Temperature: ");

Serial.print(temp_val.f);

Serial.print(" degC \t");

Serial.print("Humidity: ");

Serial.print(humi_val.f);

Serial.println("% RH");

if ((humi_val.f != last_humi) || (temp_val.f != last_temp))

{

sdCardWrite(temp_val.f, humi_val.f);

last_humi = humi_val.f;

last_temp = temp_val.f;

}

}

static unsigned long samplingTime = millis();

static unsigned long printTime = millis();

static float pHVol = 0.0f, pHValue = 0.0f;

static String str;

if(millis()- samplingTime > samplingInterval)

{

pHArray[pHArrayIndex++] = analogRead(PH_SENSOR_PIN);

if(pHArrayIndex == ArrayLength) pHArrayIndex = 0;

pHVol = averageArray(pHArray, ArrayLength)*5.0/1024;

pHValue = -5.70 * pHVol + 21.34;

samplingTime = millis();

}

if(millis() - printTime > printInterval) // кожні 800 мілісекунд, виводити число, конвертувати стан LED індикатора

{

if (pHValue < 7)

str = "Acidic ";

else if (pHValue == 7)

str = "Neutral ";

else if (pHValue > 7)

str = "Alkaline ";

Serial.print("pH value = ");

Serial.print(pHValue, 2);

Serial.print(" Solution: ");

Serial.println(str);

lcd.setCursor(0, 1);

lcd.print("pH ");

lcd.print(pHValue, 1);

lcd.print(" ");

lcd.print(str);

printTime = millis();

}

// читаємо стан кнопки в локальну змінну:

int reading = digitalRead(STORE_BUTTON_PIN);

// перевіряємо чи кнопка натиснута

// (i.e. вхід переходить з стану LOW в стан HIGH), потрібно почекати трохи

// з останнього натиснення, щоб проігнорувати будь-який шум (дребезг брязкіт тремтіння контакту):

if (reading != lastButtonState) {

// скидаємо таймер антибрязкіту

lastDebounceTime = millis();

}

if ((millis() - lastDebounceTime) > debounceDelay) {

// якщо стан кнопки змінився:

if (reading != buttonState) {

buttonState = reading;

if (buttonState == HIGH) {

//ledState = !ledState;

sdCardWrite(temp_val.f, humi_val.f);

}

}

}

//digitalWrite(ledPin, ledState);

lastButtonState = reading;

}