Введение
Комнатные растения являются неотъемлемой частью интерьера многих домов и квартир. Они выполняют несколько важных функций: создают уютную атмосферу, улучшают микроклимат, очищая воздух, и часто дарят эстетическое удовольствие. Для многих людей растения - это больше, чем просто декор; они могут быть дороги как память или представлять ботаническую ценность [3].
Однако поддержание здоровья растений требует постоянного и, что самое главное, регулярного ухода, центральным элементом которого является полив. В современном ритме жизни существует несколько серьезных проблем, мешающих обеспечить этот регулярный уход:
Длительное отсутствие дома. Во время отпусков, каникул или командировок растения остаются без присмотра. Оставить ключи соседям или родственникам не всегда возможно, а частые визиты специального человека для полива - не всегда удобно.
Человеческий фактор. В повседневной суете даже ответственный человек может просто забыть полить цветы. Недостаток опыта также может привести к неправильному режиму полива: переливу или, наоборот, длительной засухе.
Необходимость точного дозирования. Разным растениям требуется разное количество воды. Избыточный полив так же вреден, как и недостаточный, и может привести к загниванию корней и гибели растения.
Последствием этих проблем становится стресс и гибель растений, что особенно обидно, если цветок был подарен дорогим человеком, является редким сортом или выращивался годами [8].
Таким образом, задача автоматизации процесса полива является высокоактуальной для многих семей, цветоводов-любителей и даже учебных заведений, где есть "живые уголки". Существующие коммерческие системы автополива часто дороги или не обладают достаточной гибкостью. Создание же собственной, недорогой и настраиваемой системы на базе популярной платформы Arduino позволяет не только решить практическую задачу, но и получить ценные знания в области электроники, программирования и робототехники. Данный проект представляет собой доступное и эффективное решение для обеспечения жизнедеятельности комнатных растений в отсутствие хозяев.
Объект исследования: процесс автоматизации полива растений
Предмет исследования: микрокомпьютерная система на базе Arduino Uno R3
Цель: создать работающий прототип системы автоматического полива комнатных растений с помощью микрокомпьютера Arduino
Задачи:
Изучить основные компоненты платформы Arduino и принципы их работы.
Собрать электрическую схему, подключив датчики, помпу и дисплей к Arduino.
Написать и загрузить программу, которая будет управлять системой по заданному алгоритму.
Протестировать готовую систему и сделать выводы о ее работе.
Методы исследования:
Теоретический анализ: изучение специализированной литературы, онлайн-ресурсов и технической документации для получения знаний о компонентах системы и языке программирования.
Экспериментальный метод: проведение практических опытов по пайке компонентов, сборке и отладке электрической цепи, а также пошаговая отладка программного кода.
Практическое моделирование: тестирование системы в смоделированной среде (на столе с растением и резервуаром для воды) для проверки ее работоспособности и корректности реакции на различные условия (сухая/влажная почва, наличие/отсутствие воды).
Глава 1. Теоретическое обоснование проекта. Компоненты системы
Автоматический капельный полив на Ардуино представляет собой автоматизированную систему мониторинга параметров почвы и окружающей среды. В зависимости от полученных данных осуществляется управление исполнительными устройствами: включение/выключение водяных насосов для капельного полива растений. Такая система отлично подходит для автономного полива цветов дома и в саду, когда хозяева в отпуске, или для тех кто просто хочет переложить часть своих задач на роботов [1].
Для создания системы автоматического полива мне понадобились следующие основные компоненты:
1. Микрокомпьютер Arduino Uno R3 - это «мозг» всей системы. Он считывает показания с датчиков и, согласно загруженной программе, управляет другими устройствами (помпой, динамиком, дисплеем).
2. Датчик влажности почвы измеряет уровень влаги в земле. Он имеет аналоговый выход, что позволяет получать точные численные значения (например, от 200 до 700).
3. Датчик уровня воды (цифровой) определяет наличие или отсутствие воды в резервуаре. Он выдает цифровой сигнал (есть вода/нет воды).
4. Помпа (водяной насос) перекачивает воду из резервуара (банки) в горшок с растением.
5. ЖК-дисплей 1602 на этом экране, состоящем из двух строк по 16 символов, система отображает текущую влажность почвы и обратный отсчет до следующего полива.
6. Пьезодинамик издает звуковые сигналы для оповещения пользователя (например, если вода в банке закончилась).
7. Набор проводов и макетная плата для соединения всех компонентов в единую электрическую схему [2,7].
Рис.1. Компоненты, необходимые для создания системы автоматического полива
Глава 2. Практическая реализация проекта
2.1. Сборка аппаратной части
Сборка аппаратной части проекта состояла из нескольких важных этапов. Наиболее сложным и ответственным из них стала пайка электронных компонентов.
Этап 1. Подготовка компонентов к пайке
Перед началом пайки я тщательно подготовил рабочее место и все необходимые элементы:
Паяльник с подставкой
Припой и флюс
Двухжильные провода разного цвета (для удобства подключения)
Мультиметр для проверки качества пайки
Задача 1. Пайка датчиков влажности
Мне потребовалось аккуратно припаять провода к двум ключевым датчикам системы. К датчику влажности почвы нужно было подключить три провода - к контактам питания (VCC), земли (GND) и сигнальному выходу.
Такую же операцию предстояло выполнить с датчиком уровня воды, который также имеет три контакта для подключения. Особое внимание на этом этапе я уделил нескольким важным моментам.
Во-первых, использовал провода разного цвета согласно общепринятой маркировке: красный для питания +5V, черный для заземления GND и желтый для сигнальных контактов - это значительно упрощает последующее подключение и поиск возможных неисправностей.
Во-вторых, перед пайкой обязательно проводил лужение всех контактов - нанесение тонкого слоя припоя на поверхности, которые нужно соединить. Это обеспечивает лучшее сцепление и более качественное соединение.
И в-третьих, постоянно контролировал температуру паяльника, поскольку чувствительные электронные элементы датчиков могут выйти из строя при перегреве.
Задача 2. Пайка ЖК-дисплея 1602
Эта работа оказалась самой сложной технической задачей во всем проекте. ЖК-дисплей 1602 имеет целых 16 контактов, к каждому из которых нужно было припаять специальные штырьковые разъемы для последующего подключения к макетной плате. Процесс потребовал максимальной аккуратности и последовательности действий.
Начал с надежной фиксации дисплея в специальном держателе - это исключало смещение компонента во время пайки. Затем приступил к последовательной пайке всех 16 контактов, постоянно следя за тремя критически важными параметрами: обеспечивал строго перпендикулярное расположение штырьков относительно платы дисплея, наносил равномерное количество припоя на каждый контакт и тщательно следил за отсутствием так называемых "соплей" - случайных перемычек между соседними контактами, которые могли привести к короткому замыканию. После завершения пайки провел тщательную проверку мультиметром, прозванивая контакты, чтобы убедиться в отсутствии коротких замыканий между ними, что гарантировало бы безопасную и корректную работу дисплея в собранной системе.
Рис. 2 Спаивание основных компонентов
Этап 2. Сборка электрической схемы
После успешного завершения пайки всех компонентов я приступил к сборке системы на макетной плате.
Первым делом я организовал систему питания, создав общие шины для плюса (+5V) и минуса (GND) вдоль всей макетной платы. Я использовал красные провода для шины +5V и черные для GND, чтобы всегда видеть, где что подключено.
Далее начал подключать датчики. Датчик влажности почвы, который будет "ощущать" сухость земли, я подключил к аналоговому пину A0 Arduino. Это важно, потому что он передает не просто сигнал "сухо/влажно", а точные численные значения от 0 до 1023, что позволяет программе точно определять уровень влажности. Датчик уровня воды я подключил к цифровому пину 7 - он сообщает только два состояния: "вода есть" или "воды нет".
Самой интересной частью было подключение исполнительных устройств системы. Водяную помпу нельзя подключать напрямую к Arduino, так как ей нужно больше энергии. Поэтому я использовал транзисторный ключ, который работает как мощный выключатель, управляемый слабым сигналом от пина 8. Это похоже на использование рычага: маленькое усилие от Arduino включает большую мощность для помпы. Пьезодинамик, который будет "голосом" системы, предупреждающим об отсутствии воды, я подключил непосредственно к пину 9 - для него не нужна большая мощность.
Особого внимания требовало подключение ЖК-дисплея, которое будет показывать всю информацию. Вместо того чтобы использовать все 16 контактов, я организовал подключение по 4-битной шине данных к пинам 2-5 Arduino. Отдельно подключил контакты питания и подсветки дисплея, чтобы он красиво подсвечивался.
Каждое соединение я проверял дважды, сверяясь со схемой. Особенно тщательно проверял подключения питания - перепутав плюс и минус, можно мгновенно вывести компонент из строя.
Этап 3. Организация питания и программирования
На завершающем этапе я установил Arduino Uno в центр системы и подключил USB-кабель к компьютеру. Это обеспечило одновременное питание всех компонентов (+5V) и возможность загрузки программы. С помощью мультиметра проверил напряжение в ключевых точках схемы.
При сборке использовал цветовую маркировку проводов для удобства: красный - питание, черный - земля, желтый - сигнальные линии. Для защиты от скачков напряжения установил диоды на помпу, а продуманное расположение компонентов помогло избежать помех.
После визуальной проверки всех соединений система была готова к программированию и тестированию [1,2,6,10].
2.2 Разработка программного обеспечения
Программа для Arduino была написана на упрощенном языке, основанном на C++. Она состоит из трех основных частей:
1. Функция setup
В этой функции происходит начальная настройка: какие порты будут использоваться для чтения данных (от датчиков), а какие - для управления устройствами (помпой, дисплеем, динамиком).
2. Функция loop
Это главный цикл, который повторяется постоянно. В нем происходит чтение данных с датчика влажности почвы, с датчика уровня воды. Логика системы: если почва сухая (показание датчика выше порогового значения) и в банке есть вода, то включается помпа для полива. Если почва сухая, но воды в банке нет, то включается пьезодинамик, чтобы подать звуковой сигнал. На дисплей выводится текущая влажность и время до следующей проверки.
3. Вспомогательная функция
Функция для организации задержки, во время которой на экран выводится обратный отсчет в минутах [1,2,6,10].
Рис.3 Разработка программного обеспечения
2.3 Тестирование и результаты
После завершения сборки и загрузки программного кода я провел комплексное тестирование автоматической системы полива в условиях, максимально приближенных к реальным. Тестирование включало проверку двух основных режимов работы, предусмотренных программой.
В режиме нормальной работы, когда датчик влажности почвы определял недостаточный уровень увлажненности (показывая значения выше порогового уровня), а датчик уровня жидкости, погруженный в воду, подтверждал наличие достаточного количества воды в резервуаре, система демонстрировала четкую и отлаженную работу: автоматически включалась водяная помпа, начинался процесс полива, а на ЖК-дисплее в реальном времени отображались текущие показания влажности грунта, что позволяло визуально контролировать процесс насыщения почвы влагой.
Особое внимание было уделено проверке аварийного режима, который я смоделировал, извлекая датчик уровня воды из резервуара, тем самым имитируя ситуацию опустевшей банки. В этом случае система корректно срабатывала по защитному алгоритму: немедленно подавался четкий звуковой сигнал через пьезодинамик, привлекающий внимание пользователя, а помпа оставалась выключенной, несмотря на то, что датчик почвы продолжал сигнализировать о необходимости полива. Эта логика надежно предотвращает возможность работы помпы вхолостую, что защищает ее двигатель от перегрева и преждевременного выхода из строя.
Рис. 4 Работа автоматической системы полива
Результатом проведенных испытаний стала стабильная и полностью автоматическая работа собранной системы. Устройство продемонстрировало способность самостоятельно, без какого-либо вмешательства человека, поддерживать заданный уровень влажности почвы, обеспечивая растения своевременным поливом, и мгновенно оповещать пользователя о возникновении критических ситуаций, таких как отсутствие воды в резервуаре, что делает систему надежным помощником в период отпусков или длительного отсутствия.
Заключение
В ходе данной проектной работы мне удалось достичь поставленной цели – создать автоматическую систему полива комнатных растений на базе Arduino.
Выводы
Платформа Arduino является удобным и мощным инструментом для создания простых систем «умного дома».
Собранная система успешно решает задачу автоматического полива и может быть использована в реальных условиях, например, во время отпуска.
Система обладает элементом «интеллекта»: она не просто поливает по таймеру, а анализирует состояние почвы и наличие воды.
Для придания системе законченного вида необходимо разработать и напечатать на 3D-принтере защитный корпус, который скроет все провода и платы, сделав устройство безопасным и эстетичным. Кроме того, в будущем систему можно улучшить, добавив возможность полива нескольких растений одновременно и подключив ее к Wi-Fi для удаленного контроля.
Список используемых источников
1. Автоматический полив своими руками на Ардуино. – URL: https://giant4.ru/blog/sovety-pokupatelyam/avtopoliv-statya/ (дата обращения: 26.10.2023).
2. Автополивщик растений на Arduino. – URL: https://wiki.amperka.ru/projects:irrigator (дата обращения: 26.10.2023).
3. Васильев В. В. Умный дом: автоматизация и управление. – М.: Эксмо, 2017. – 288 с.
4. Иванов И. И. Основы автоматизации систем полива. – М.: Техносфера, 2020. – 180 с.
5. Кузнецов К. К. Разработка и применение микроконтроллеров в системах управления. – М.: Инфра-М, 2021. – 300 с.
6. Петров П. П. Arduino для начинающих: практическое руководство. – СПб.: Питер, 2018. – 256 с.
7. Писчик А. С., Науменко Д. К. Система автоматического полива растений // Компьютерные системы и сети: 55-я юбилейная научная конференция аспирантов, магистрантов и студентов, Минск, 22-26 апреля 2019 г. / Белорусский государственный университет информатики и радиоэлектроники. – Минск, 2019. – С. 56–57.
8. Сидоров С. С. Сенсорные системы в сельском хозяйстве. – М.: Агропромиздат, 2019. – 210 с.
9. Смирнов С. С. Проектирование и реализация систем автоматического орошения. – М.: Наука, 2022. – 160 с.
10. Урок 30. Автоматический полив растений. – URL: https://lesson.iarduino.ru/page/urok-30-avtomaticheskiy-poliv-rasteniy/ (дата обращения: 26.10.2023).
Приложение 1
Схема подключения компонентов
Приложение 2
Исходный код программы
#define sensorPort A1 // порт для подключения датчика
#define pompaPort 13 // порт для подключения помпы
#define waterLevelPort 8 // порт для проверки уровня воды в источнике
#define buzzerPort 3 // порт для динамика
#include <LCDI2C_Multilingual.h>
LCDI2C_Russian lcd(0x27, 16, 2); // Адрес 0x27 для I2C
int maxSensor = 800; // максимальное значение сухости почвы
int sensValue;
int noWater;
void setup(){
lcd.init(); // Инициализация ЖК-дисплея
lcd.backlight(); // Включение подсветки
lcd.print("Starting...");
delay(1000);
pinMode(sensorPort, INPUT);
pinMode(waterLevelPort, INPUT);
pinMode(pompaPort, OUTPUT);
pinMode(buzzerPort, OUTPUT);
}
void loop(){
lcd.clear();
sensValue = analogRead(sensorPort);
noWater = digitalRead(waterLevelPort);
lcd.print("Sensor: ");
lcd.println(sensValue);
lcd.print("Water: ");
if (noWater) {
lcd.print("Empty");
} else {
lcd.print("Ok");
}
if (sensValue > maxSensor) {
if (noWater) {
tone(buzzerPort, 1000 , 250);
delay(200);
tone(buzzerPort, 2000 , 250);
delay(200);
tone(buzzerPort, 3000 , 250);
} else {
digitalWrite(pompaPort, HIGH);
for (int i = 0; i <= 9; i++) {
lcd.clear();
lcd.print("The pump is working: ");
lcd.print(i+1);
delay(1000);
}
digitalWrite(pompaPort, LOW);
waitForDay();
}
}
delay(1000);
}
void waitForDay() {
for (int i = 0; i <= 86400; i = i + 60) {
lcd.clear();
sensValue = analogRead(sensorPort);
lcd.print("Sensor: ");
lcd.println(sensValue);
lcd.print("Wait: ");
lcd.print((86400-i)/60);
lcd.print(" min");
delay(60000);
}
}