Введение
Весной 2020 года мы собрались всей семьей переехать на дачу до конца лета. Мама сказала: “Нужно чтобы кто-то поливал домашние растения”. И я задумался: “Вот было бы хорошо, придумать такое устройство, чтобы растения поливались автоматически”.
С января 2020 года я начал изучать программирование на Arduino и вначале изучения прочитал, что с ним возможно решить очень много задач. Поэтому я решил изучить данную тему и сделать автополив на Arduino.
Мне хотелось, чтобы мои новые знания не только были мне интересны, но и смогли принести пользу моей семье, а в будущем решать проблемы и служить на благо человечеству.
Цель, задачи, методы исследования и алгоритм реализации
Цель моей работы: изучить теоретическую часть и среду программирования Arduino, понять и сделать автоматический полив для комнатных растений.
В процессе реализации необходимо решить следующие задачи:
провести анкетирование об интересе к устройству среди широкого круга людей;
изучить возможности платформы Arduino Uno, принципы работы микроконтроллера и способы подключения датчиков и помпы;
изучить язык C (Си) в объеме необходимом для реализации автополива при программировании микроконтроллера;
провести измерения длительности работы помпы и частоты полива;
собрать устройство автополива растений.
Методы исследования:
проведение анкетирования и подведение итогов анкетирования;
изучение принципов работы микроконтроллера Arduino, способа программирования и способов подключения датчиков и разъемов.
Алгоритм реализации:
собрать датчик влажности земли YL-69;
собрать устройство полива на базе микроконтроллера Arduino Uno;
подключить помпу d9358 для полива растения водой;
запрограммировать устройство полива;
провести эксперименты для определения времени полива (на сколько секунд необходимо включать полив);
провести эксперименты для определения частоты полива (при каких показателях датчика влажности необходимо включать полив);
собрать все воедино и подсоединить внешнее питание.
Теоретическая часть
Arduino – это торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники. [2]
Программная часть состоит из бесплатной программной оболочки для написания программ, их компиляции и программирования аппаратуры. В приложении А на рисунке 1 изображен микроконтроллер Arduino UNO. [2]
В платформе имеется 14 цифровых входов\выходов, 6 аналоговых входов, кварцевый генератор 16 МГц, USB разъем, силовой разъем, кнопка перезагрузки. [2]
Arduino Uno получает питание через подключение кабеля USB или от внешнего источника питания. Источник питания выбирается автоматически. [2]
Микроконтроллер располагает 32 кБ флэш памяти, из которых 0.5 кБ используется для хранения загрузчика. [2]
Каждый цифровой вывод из 14 платы Uno может быть настроен как вход или выход, используя функции pinMode, digitalWrite, и digitalRead. [2]
Все выводы работают при напряжении 5 В. Платформа программируется с помощью ПО Arduino. [2]
Далее рассмотрим основные функции программного кода.
Директива #define требуется для того, чтобы записывать числа, буквы, знаки и т.д. [3]
Также есть две похожие функции void setup () и void loop (). В void setup () и в void loop () имеются кроме обычных скобок еще и фигурные. В фигурных скобках пишется какие будут происходить действия. Различие void setup () и void loop () в том, что в void setup () действия происходят один раз при запуске микроконтроллера, а в void loop() действия происходят после void setup () и они происходят в бесконечном цикле. [4]
Функция pinMode определяет работу заданного вывода как вход или выход.
Функция digitalWrite подает и выключает питание. Если вывод настроен в функции pinMode на OUTPUT, то тогда если функция HIGH, то подается питание 5в. А если функция LOW, то тогда выключается питание на указанном выводе. А также может быть настроен в функции pinMode на INPUT, то тогда результатом работы является включение и выключение нагрузочного резистора, сопротивление которого 20к. [5]
Функция delay делает задержку на указанное количество миллисекунд. На это время программа не делает функции дальше.
Функция millis делает отсчет сколько времени продолжается код. Но когда включается задержка delay функция millis не считает задержку.
Условные операторы if и else нужны для разветвления кода. [1]
Практическая часть
Анкетирование
Мной было проведено анкетирование среди детей и взрослых. Общее количество опрошенных составило 50 человек. Комнатные растения дома есть у 94% опрошенных. Растения поливают 1 – 2 раза в неделю 40% человек, а 46% поливают 3 – 4 раза в неделю. 62% опрошенных ничего не слышали о микроконтроллере Arduino, на основе которого и будет выполнено создание автоматического полива растений. Это связано конечно с тем, что, во-первых, не все интересуются программированием, а во-вторых, потому что Arduino активно развивается не так давно и получает только последние годы массовое распространение. Актуальность выбранной темы подтверждает то, что 68% опрошенных хотели бы иметь автоматический полив комнатных растений у себя дома и 14% просто не определились. Ну и, конечно, на дополнительное уточнение у всех анкетируемых о том, что хотели бы вы иметь автоматический полив на время своего отпуска или длительного отъезда из дома, однозначный ответ – да. Сводные данные по анкетированию приведены в Приложении Б Таблица 1.
Процесс создания автоматического полива
В начале было создано два разных устройства для проведения исследований о длительности и частоты полива растений.
Во-первых, создано устройство измерения влажности почвы. Оно состоит из датчика влажности YL-69 и платы Arduino UNO. Оно считывает значение с датчика влажности, и отправляет на монитор порта. Всего 1024 значения от 0 до 1023. Чем больше значение, тем суше земля. Фотография устройства представлена на рисунке 2 Приложения А.
Во-вторых, создано устройство полива. В экспериментальном варианте оно состоит из помпы, батарейного отсека, двух батареек АА, шланга и крепежа для шланга. В рабочем варианте оно состоит из помпы, шланга и крепежа для шланга. Фотография устройства представлена на рисунке 3 Приложения А.
Во время проведения экспериментов устройство полива на отдельном питании. В экспериментальном виде надо вручную замыкать цепь питания и тогда будет осуществляться полив.
Первый этап экспериментов проводился для определения длительности полива, т.е. на сколько секунд будет включаться полив, чтобы растение получило достаточное количество воды и не было перелива. Проводился полив в течение 2 секунд и замеры влажности почвы на протяжении трех дней, затем полив осуществлялся в течение 3 секунд и также проводились замеры влажности почвы. Данные измерения были собраны в таблицу и представлены в Приложении Б Таблица 2. На основании полученных данных можно сделать вывод, что полив в течение 2 секунд достаточен для растения в небольшом горшке. Полив в течение 3 секунд избыточен и может привести к гибели растения.
Второй этап экспериментов проводился для определения частоты полива растений. Данное исследование проводилось на протяжении 10 дней. Также осуществлялся полив земли и считывались данные с датчика влажности почвы. Данные приведены в Таблице 3 Приложения Б. По итогам эксперимента можно сделать вывод, что полив ранее 2-х – 3- х дней производить не нужно, т.к. почва еще остается достаточно влажной на протяжении этого периода. Для рабочего варианта остановимся на 2-х днях, т.к. полив во время эксперимента осуществлялся земли в горшке без растения и соответственно необходимо учесть, что с растением почва будет высыхать быстрее. Также учтем показатели влажности почвы и полив будет осуществляться при показании влажности почвы равной 800.
После проведения всех экспериментов необходимо запрограммировать устройство и собрать рабочий вариант.
Убираем с устройства полива батарейки АА и подсоединяем его к плате Arduino. После запрограммировали устройство и к плате подсоединили батарейку крона. Фотография устройства представлена на рисунке 4 Приложения А.
Рабочий вариант состоит из:
помпы;
батарейки крона (9 Вольт);
датчика влажности;
шланга;
крепежа для шланга;
платы Arduino.
Алгоритм и программа автоматического полива
Автоматический полив работает следующим образом: когда автополив включается считывается значение и если значение больше 800, тогда осуществляется полив 2 секунды. Если значение меньше 800, тогда полив осуществляться не будет. Затем каждую минуту проверяется прошло ли 2 дня. Если да, то считывается значение датчика и при достижении значения 800, включается полив. И процесс повторяется.
Рассмотрим программный код.
Используя директиву define, объявляются переменные:
sensorPower – порт питания сенсора;
sensorPin – аналоговый порт считывания значения датчика;
motor – порт питания помпы;
timeToWatering – время полива в миллисекундах;
dayCounter – минимальное количество дней без полива.
Далее объявляется глобальная переменная previosTime, предназначенная для хранения времени последнего срабатывания помпы в миллисекундах.
Функция setup запускается один раз при старте микроконтроллера. В ней настраиваются режим работы сенсоров и номера сенсоров.
Если при старте почва сухая, то сразу запускается функция motorHigh для полива почвы и запоминается время полива.
Далее в бесконечном цикле запускается функция loop. В ней объявляются переменные:
now – прошедшее время со старта микроконтроллера;
delta – минимальное количество времени между поливами;
wetness – хранит влажность почвы.
Показания датчика снимаются при помощи функции readSensor.
Если показания датчика более 800 и прошло больше минимального времени между поливами, то запускается функция motorHigh для полива растения. Также перезаписывается переменная previosTime текущим значением времени.
В конце функции происходит задержка на 1 минуту.
Функция readSensor подает питание на датчик и ожидает 10 миллисекунд. Далее снимает показание с датчика и выключает питание датчика. По завершению работы функция возвращает значение датчика.
Функция motorHigh подает питание на помпу. Производит задержку равной переменной timeToWattering. Далее выключает питание помпы.
Чтобы увидеть программный код смотрите приложение В.
Трудности и их решения
В процессе выполнения исследования возникали некоторые трудности, которые описаны далее.
Проблема: датчик состоит из алюминия. Если датчик все время держать под напряжением, то тогда он очень быстро выйдет из строя.
Решение: подавать напряжение на датчик за 1 секунду до измерения влажности почвы, а через 1 секунду после снятия показания отключать.
Проблема: если лить воду прямо на датчик, то он выдает некорректные значения.
Решение: ставить датчик в диапазоне полива, но не прямо под струю.
Проблема: вся конструкция будет работать только если ноутбук будет включен постоянно.
Решение: перевел авто-полив на отдельный источник питания предварительно проверив, что все будет работать.
Возможности развития
Дальнейшие возможности работы в данном направлении следующие. Можно сделать пластиковый корпус для устройства.
Также можно снабдить устройство дисплеем для возможности выведения информации не только на экран ноутбука, но и на дисплей устройства.
Также можно доработать систему для полива земляных культур и корректировать в зависимости от вида культуры, вида растений.
Дальнейшая доработка текущего устройства для полива комнатных растений также возможна в направлении дополнительной корректировки под каждый вид цветка, например.
Заключение
В ходе проведения данной работы получены знания о возможностях платформы Arduino Uno, изучены принципы работы микроконтроллера и способы подключения датчиков и моторов, язык C (Си) в объеме необходимом для реализации автополива при программировании микроконтроллера. А также проведены измерения длительности работы помпы и частоты полива и собрано устройство автоматического полива растений.
На основе проведенного анкетирования можно сделать вывод, что данная тема актуальна. 68% опрошенных хотели бы иметь автоматический полив комнатных растений у себя дома и 14% просто не определились. Ну и конечно на дополнительное уточнение у всех анкетируемых о том, что хотели бы вы иметь автоматический полив на время своего отпуска или длительного отъезда из дома, однозначный ответ – да.
Авто-полив на Arduino имеет большие перспективы развития не только в домашних условиях для полива комнатных растений, но и для использования в современном сельском хозяйстве на Сити-фермах.
Интернет-источники
Руководство по языку программирования C[Электронный ресурс] // Metanit.com Сайт о программировании., 2012 – 2020 URL:https://metanit.com/cpp/c/ (Дата обращения: 25.09.2020)
Аппаратная часть платформы Arduino [Электронный ресурс] //Arduino.ru Официальный сайт компании Arduino., URL:http://arduino.ru/ (Дата обращения: 25.09.2020)
Программирование на C и C++ [Электронный ресурс] // C-cpp.ru Онлайн справочник программиста на C и C++., URL:http://www.c-cpp.ru/books/define (Дата обращения: 25.09.2020)
Функции void loop и void setup Ардуино [Электронный ресурс] // Роботехника18.рф ROBOТЕХНИКА уроки ардуино, программирования, технологии., 2016-2020 URL:https://роботехника18.рф/%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D1%8B-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE/ (Дата обращения: 25.09.2020)
Функция digitalWrite ()[Электронный ресурс] // arduinomaster.ru Российское ардуино – сообщество., 2017-2019. URL:https://arduinomaster.ru/program/funktsiya-digitalwrite/(Дата обращения: 25.09.2020)
Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера [Электронный ресурс] // Coursera.org Coursera., 2020, URL: https://www.coursera.org/learn/roboty-arduino/ (Дата обращения: 25.09.2020)
Приложение А. Фотографии
Рисунок 1. Микроконтроллер Arduino Uno
Рисунок 2. Временное устройство замера влажности
Рисунок 3. Временное устройство полива
Рисунок 4. Конечное устройство
Приложение Б. Таблицы
Таблица 1. Результаты анкетирования
№ |
Вопрос |
Количество ответивших, чел. |
Количество ответивших, % |
1 |
Есть ли у вас комнатные растения? |
50 |
|
Да |
47 |
94 |
|
Нет |
3 |
6 |
|
2 |
Как часто вы поливаете комнатные растения |
50 |
|
Один-два раза в неделю |
20 |
40 |
|
Три-четыре раза в неделю |
23 |
46 |
|
Каждый день |
3 |
6 |
|
Вообще не поливаю |
4 |
8 |
|
3 |
Хотели бы вы сделать полив автоматическим? |
50 |
|
Да |
32 |
64 |
|
Нет |
7 |
14 |
|
Не знаю |
11 |
22 |
|
4 |
Что вы знаете о микроконтроллере Arduino? |
50 |
|
Слышал что есть такой микроконтроллер |
15 |
30 |
|
Знаком с ним, могу написать простейшую программу |
1 |
2 |
|
Я профи, знаю в микроконтроллере все |
3 |
6 |
|
Ничего |
31 |
62 |
|
5 |
Хотели бы вы иметь автоматический полив для комнатных растений? |
50 |
|
Да |
34 |
68 |
|
Нет |
9 |
18 |
|
Не знаю |
7 |
14 |
|
6 |
Хотели бы вы иметь автоматический полив на время своего отпуска или длительного отъезда из дома? |
50 |
|
Да |
50 |
100 |
|
Нет |
0 |
0 |
Таблица 2. Эксперименты по длительности полива
День эксперимента |
Измерения показателя влажности почвы |
Объем воды |
||
До полива |
Полив |
После полива |
||
1 день |
1005 |
2 сек |
460 |
50 мл |
2 день |
545 |
|
||
3 день |
702 |
3 сек |
120 |
75 мл |
4 день |
126 |
|
|
|
5 день |
145 |
|
|
|
6 день |
155 |
|
|
|
Таблица 3. Эксперименты по частоте полива
Дата эксперимента |
Измерения показателя влажности почвы |
||
До полива |
Полив |
После полива |
|
1 день |
1005 |
2 сек |
230 |
2 день |
301 |
|
|
3 день |
560 |
|
|
4 день |
802 |
2 сек |
120 |
5 день |
251 |
|
|
6 день |
478 |
|
|
7 день |
756 |
2 сек |
113 |
8 день |
239 |
|
|
9 день |
514 |
|
|
10 день |
811 |
|
|
Приложение В. Программа управления микроконтроллером
#define sensorPower 7 //Порт питания сенсора
#define sensorPin A0 //Порт аналогового считывания порта
#define motor 8 //Порт питания мотора
#define timeToWatering 2000 //время полива в миллисекундах
#define dayCounter 2 //Минимальное количество дней без полива
unsigned long previousTime; //Последнее значение срабатывания мотора в миллисекунах
void setup() {
pinMode(sensorPower,OUTPUT); //Мы устанавливаем режим работы-выход
pinMode(motor,OUTPUT); // Мы устанавливаем режим работы-выход
digitalWrite(sensorPower,LOW); //Мы оставляем пин выключеным
int wetness = readSensor();// создаем переменную равняем ее readSensor
if( wetness>800)//если wetness больше 800 то начинается полив
{
motorHigh();
previousTime = millis(); //фиксируетсявремяполива
}
else
previousTime = 1; //фиксируетсявремязапуска
}
void loop(){
unsigned long now = millis(); //прошедшее время с момента запуска ардуино
unsigned long delta = dayCounter*24*60*60*1000; //минимальное количество времени между поливами
int wetness = 1; //влажностьпочвы
if(now-previousTime > delta)
//Если почва сухая и прошло больше заданного количества дней, то полив
{
wetness = readSensor();
if(wetness>800)
{
previousTime = millis(); //вводновоговременидлясравнения
motorHigh();
}
}
delay(1000);
}
int readSensor(){
//Функция возвращает результаты датчика влажности почвы
digitalWrite(sensorPower,HIGH);// включаем пин
delay (10);// делаем задержку чтобы все успело вкючится
int val= analogRead(sensorPin);// создаем переменную и записываем в нее результат датчика
digitalWrite(sensorPower,LOW);// выключаем пин
return val; //завершает функцию и возвращает результат
}
void motorHigh()
{
//Функция включает и выключает помпу
digitalWrite(motor,HIGH); //включаемпомпу
delay(timeToWatering); //задежка
digitalWrite(motor,LOW); //выключаемпомпу
delay(100);
return;
}