Наверняка многие из вас любят выращивать какую-нибудь зелень у себя дома или на даче. При этом растения, в отличие от животных, достаточно неприхотливы и могут спокойно расти без вашего надзора в течение достаточно продолжительного времени. Но, тем не менее, растения могут погибнуть если уровень влажности почвы, на которой они растут, будет низким в течение продолжительного времени (неделя и более). Если вы находитесь постоянно дома, то поливать растения каждый день не представляет особого труда. Но что делать если вы уехали в отпуск или командировку на достаточно продолжительное время?
В данной статье мы рассмотрим создание автоматической оросительной системы (Automatic Irrigation System) на основе платы Arduino Uno и датчика влажности (Moisture sensor) почвы, которая будет автоматически поливать ваши растения и поддерживать оптимальный уровень влаги в почве во время вашего отсутствия. Систему можно использовать как в домашних условиях внутри помещений, так и в вашем саду. Также на нашем сайте вы можете посмотреть аналогичный проект системы полива растений с самодельным датчиком влажности почвы, выводом сообщений на экран ЖК дисплея и оповещениями о работе системы с помощью SMS.
Принцип работы автоматической оросительной системы
Логика работы нашей оросительной системы будет достаточно проста. Датчик влажности будет измерять уровень влаги в почве и когда этот уровень будет достаточно низок, то с помощью платы Arduino Uno будет подаваться сигнал на водяной насос (water pump), который будет подавать воду в почву и тем самым орошать наши растения. После подачи воды уровень влаги в почве будет повышаться и когда он достигнет необходимого уровня, датчик влажности обнаружит это и будет подан сигнал на остановку водяного насоса.
Датчик влажности почвы (Soil Moisture Sensor)
Принцип работы датчика влажности почвы достаточно прост – он содержит 2 зонда с оголенными контактами, которые работают как резистор с переменным сопротивлением – их сопротивление изменяется в зависимости от уровня влаги в почве. Сопротивление данных зондов обратно пропорционально влажности почвы, то есть чем выше содержание влаги почвы, тем лучше ее проводимость и тем меньше ее сопротивление. Низкий уровень влаги в почве свидетельствует о ее плохой проводимости и, следовательно, ее большом сопротивлении. Датчик обеспечивает на своем выходе уровень аналогового напряжения, пропорциональный сопротивлению почвы.
Датчик поставляется вместе с электронным модулем, который упрощает его подключение к плате Arduino. Данный электронный модуль содержит компаратор с высокой точностью на основе микросхемы LM393, преобразующий аналоговый сигнал в цифровой, который в дальнейшем и подается на плату Arduino (или любой другой микроконтроллер).
Водяной насос
В данном проекте мы использовали небольшой водяной насос, который вполне справится с орошением ваших домашних растений, его можно подключать напрямую к плате Arduino. Но в данном случае мы его подключили к плате Arduino с помощью модуля реле чтобы обеспечить универсальность схемы. Дело в том, что если вы захотите использовать подобную систему для орошения вашего сада, то в данном случае маленький насос, использованный нами, уже не справится с орошением больших объемов и почвы и вам будет необходим водяной насос значительно большего размера. Запитываться такой насос будет уже от сети переменного тока. В этом случае вам всего лишь будет необходимо заменить источник постоянного тока в нашей схеме (батарейку) на питание от сети переменного тока, а плату Arduino запитать от отдельного источника постоянного тока, а вся логика работы нашей оросительной системы останется точно такой же.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль датчика влажности почвы (купить на AliExpress).
- Модуль реле 5v (купить на AliExpress).
- Маленький водяной насос (мini water pump with small pipe) с питанием от 6v (купить на AliExpress).
- Батарейка.
- Соединительные провода.
Внешний вид компонентов, необходимых для сборки проекта, показан на следующем рисунке.
Схема проекта
Схема автоматической оросительной системы на основе платы Arduino Uno представлена на следующем рисунке.
Для питания схемы мы использовали внешний источник питания – батарейку. Можно использовать батарейку на 9v или 12v. Батарейка подключается к контактам Vin и ground платы Arduino. Водяной насос получает питание от батарейки через модуль реле. Выход датчика влажности почвы подключен к аналоговому контакту платы Arduino.
Сборка конструкции проекта
Подключите контакт VCC модуля реле к контакту 5v платы Arduino, а землю (ground) модуля реле – к земле платы. Затем подключите сигнальный контакт модуля реле к любому цифровому контакту платы Arduino кроме контакта 13. В нашем случае мы подключили его к контакту 3 как показано на рисунке ниже.
На следующем шаге подключите датчик влажности почвы к плате Arduino. Соедините VCC и gnd датчика с контактами 5volt и ground платы. Аналоговый выход датчика подключите к любому аналоговому контакту платы Arduino, в данном случае мы его подключили к контакту A0.
Затем подключите водяной насос к модулю реле. Модуль реле обычно имеет 3 точки подключения: общий провод, нормально замкнутый и нормально разомкнутый контакты. Нам необходимо подключить положительный вывод водяного насоса к общему контакту реле, а нормально разомкнутый контакт реле – к положительному выводу батареи. Далее необходимо подключить землю водяного насоса к земле Arduino и подключить небольшой шланг к водяному насосу.
После этого подключите батарейку к схеме и если водяной насос начнет работать, то значит все в порядке и можно приступать к загрузке кода программы в плату Arduino.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В данном проекте мы не будем использовать никаких подключаемых библиотек, только базовые функции. В начале кода программы объявим две переменные целого типа, одну для хранения значения влажности почвы, а вторую – для конвертированного в проценты значения влажности почвы.
1 2 |
int soilMoistureValue = 0; int percentage=0; |
Далее в функции setup() зададим режимы работы используемых контактов и инициализируем последовательную связь для целей отладки.
1 2 3 4 |
void setup() { pinMode(3,OUTPUT); Serial.begin(9600); } |
Основную часть программы мы начнем со считывания значения с датчика влажности почвы с помощью функции analogRead(A0). Считанное значение мы будем сохранять в переменной soilMoistureValue – оно будет в диапазоне от 0 до 1023.
1 2 |
void loop() { soilMoistureValue = analogRead(A0); |
Далее мы конвертируем это значение в проценты (то есть в диапазон от 0 до 100) с помощью функции map. То есть экстремально сухой почве будет соответствовать значение 0%, а экстремально влажной – 100%.
1 2 |
percentage = map(soilMoistureValue, 490, 1023, 0, 100); Serial.println(percentage); |
Калибровка датчика влажности почвы
В функции map для конвертирования значения влажности в проценты нам необходимо указать значения влажности, при которых мы будем, соответственно, считать почву сухой и влажной. Для этого нам необходимо произвести калибровку датчика влажности почвы. Напишем небольшую программу для мониторинга значений, считываемых с датчика влажности почвы, и загрузим ее в плату Arduino.
1 2 3 4 5 6 7 |
void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); Serial.println(sensorValue); delay(1); |
После загрузки этой программы в плату Arduino откройте окно монитора последовательной связи (serial monitor). Поместите датчик влажности в очень сухую почву или просто подержите его на воздухе – запишите полученное значение в окне монитора последовательной связи и поставьте его вместо значения 490 в функцию map в основной программе нашего проекта.
Затем поместите датчик влажности в очень влажную почву или воду, запишите полученное значение в окне монитора последовательной связи и поставьте его вместо значения 1023 в функцию map в основной программе нашего проекта. Эти значения и будут калибровочными для вашего датчика влажности почвы.
После получения значения влажности почвы в процентах мы можем на основе этого значения управлять водяным насосом. Если значение влажности почвы будет менее 10% мы будем включать водяной насос при помощи подачи низкого уровня напряжения (LOW) на контакт 3 платы Arduino и выводить соответствующее сообщение в окно монитора последовательной связи.
1 2 3 4 5 |
If (percentage < 10) { Serial.println(" pump on"); digitalWrite(3,LOW); } |
Когда измеренная влажность почвы окажется более 80% (это будет свидетельствовать о том, что почва в достаточной степени насыщена водой) плата Arduino будет выключать водяной насос и выводить сообщение ‘pump off’ в окно монитора последовательной связи.
1 2 3 4 5 |
if(percentage >80) { Serial.println("pump off"); digitalWrite(3,HIGH); } |
Тестирование работы оросительной системы
Мы поместили всю собранную конструкцию проекта кроме водяного насоса и датчика влажности почвы в пластиковый контейнер как показано на рисунке ниже.
После того как программная и аппаратная части проекта будут готовы можно приступить к тестированию работы проекта. Поместите датчик влажности почвы как можно ближе к корням растений для более высокой точности работы системы.
На заключительном шаге поместите водяной насос в емкость, наполненную водой. Теперь ваша автоматическая система полива растений готова к работа и готова позаботиться о ваших растениях когда вас нет рядом.
Вы можете изменить границы влажности почвы, по которым принимается решение о поливе растений, на необходимые вам, поскольку различные виды растений имеют различающиеся требования к своему поливу.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
int soilMoistureValue = 0; int percentage=0; void setup() { pinMode(3,OUTPUT); Serial.begin(9600); } void loop() { soilMoistureValue = analogRead(A0); Serial.println(percentage); percentage = map(soilMoistureValue, 490, 1023, 100, 0); if(percentage < 10) { Serial.println(" pump on"); digitalWrite(3,LOW); } if(percentage >80) { Serial.println("pump off"); digitalWrite(3,HIGH); } } |
не могу прошить код в ардуино
Сочувствую, можете тогда посмотреть следующие статьи чтобы попытаться найти в чем проблема:
- 10 самых распространенных ошибок при работе с Arduino;
- причины из-за которых плата Arduino может не работать и как их исправить.
Подскажите начинающему агроному, как подключить часы реального времени. Нужно к примеру делать опрос параметра влажности почвы в 7:00 утра, а так же в 19:00 вечера. Если почва сухая - включать полив. Часы реального времени нужны т.к. у нас иногда но выключают свет.
Это достаточно просто, примеры подключения модуля реального времени к плате Ардуино можно посмотреть в следующих статьях на нашем сайте:
- Регистратор (логгер) данных на Arduino;
- Бинарные часы на светодиодах с использованием Arduino;
- Автоматическая кормушка для животных на Arduino;
- Автоматический напоминатель приема лекарств на Arduino.
Из представленных примеров, я думаю, вам лучше всего подойдет проект с автоматической кормушкой или напоминателем приема лекарств - в них можно с помощью кнопок или клавиатуры задать время срабатывания. Ну, естественно, вам необходимо к условию проверки времени добавить условие на проверку состояния датчика влажности почвы. Достаточно просто, как видите.
Здравствуйте. А можно через плату Ардуино Уно управлять (написать программу) последовательно электромагнитными клапанами DC12вольт допустим 10 клапанов. Условия включения клапана размыкание (сухая почва) между двумя щупами (двумя проводами). Допустим одновременно разомкнуло шесть пар щупов, плата должна включить один клапан на линии сработавших щупов потом остальные пять клапанов. И выключить клапана когда пара щупов замкнуты (почва влажная)
Добрый вечер. Да, конечно такую логику запрограммировать с помощью платы Ардуино можно, но нужно предусмотреть другое питание (вместо батарейки) для клапанов и посмотреть потянет ли плата Ардуино питание нескольких пар датчиков почвы
Можно Ваш адрес почты. Можно на мою почту связаться. Есть к вопросы и предложения.
Я написал вам на почту
Сможете помочь сделать такую программу?
Программа работает так
Помп он
100
- насос качает воду
Помп офф
2
-насос качает воду
При этом
If percentage 80
Написано только помп офф, но помпа включина, помп он вообще не появляется
А если в программе вам просто подавать команды digitalWrite(3,LOW) и digitalWrite(3,HIGH) (то есть не использовать условия), например, одну за другой с задержкой, то у вас что с помпой будет происходить? Может у вас модуль реле подключен не так как в схеме и тогда вам нужно просто в этих командах поменять местами LOW и HIGH чтобы схема правильно работала
здравствуйте я немного переделал код до правильного (были перепутаны HIGH и LOW)вот поправленный скетч:
int soilMoistureValue = 0;
int percentage=0;
void setup() {
pinMode(3,OUTPUT);
Serial.begin(9600);
}
void loop() {
soilMoistureValue = analogRead(A0);
Serial.println(percentage);
percentage = map(soilMoistureValue, 490, 1023, 100, 0);
if(percentage 80)
{
Serial.println("pump off");
digitalWrite(3,LOW);
}
}
Хорошо, спасибо вам за помощь сайту
Здравствуйте. Есть вопрос. Собрала я значит схему, насос работает, но когда я опускаю датчик влажности в воду, насос не перестаёт работать, как на видео, в чем может быть проблема?
Добрый вечер. А посмотрите какие значения влажности в окне мониторе последовательной связи выводятся? Если они не поднимаются больше 80, то насос никогда не выключится - так прописано в коде программы. Это будет свидетельствовать о том, что у вас что то не так с датчиком влажности
Здравствуйте, у меня работает без прекращения насос, хотя я укозал percentage>80
Здравствуйте!
Можно мне тоже скинуть доработанный скетч для 4-х канального полива, который доработал Александр?
Добрый день. К сожалению, у меня этого скетча нет, а Александр, доработавший этот скетч, не поделился им с нами
А, если у меня 4-х канальный релейный модуль, тогда можно этот скетч использовать, добавив только в код программы только входы с датчиков и выходы сигнальных контактов?
Да, вы можете использовать только один из 4-х каналов вашего релейного модуля, только в коде программы правильно укажите контакт платы Ардуино, к которому вы его подключите.
А, вы могли бы мне прислать скетч для 4-канального модуля?, благодарю за раннее!
Так скетч же не изменится если вы собираетесь использовать только один канал из вашего модуля. Может измениться только контакт платы Ардуино, к которому вы его подключите. Я же не знаю какой вы выберите контакт
Мне нужно на 4-канала.
Вот отсюда можете скачать https://disk.yandex.ru/d/FTLGBhJ7kG4epw
Спасибо!
Вот, у меня вопрос, такой, в этом проекте, получается нужно использовать два источника питания, а можно ли использовать только один, как тогда будет выглядеть схема? Или этот проект можно испльзовать только так, как указано выше
А где вы увидели два источника питания в схеме? Я вижу только один - батарейку
А порт usb, служит только для программирования Ардуино?, правильно?
Нет, через него на плату Ардуино можно также подавать питание. Но в данном проекте он используется только для загрузки программы в плату Ардуино, после этого плата отключается от компьютера и устройство работает автономно, получая питание от батарейки
Собрал я как у вас , если шнурок в компьютер вставлен то работает отлично , если с блока питания телефона или же с батареек , то реле постоянно щёлкает вкл/выкл не могу понять в чём дело .
А значения percentage, выводимые в окно монитора последовательного порта, у вас при этом какие? Программа предельно проста, ну если только с командой percentage = map(soilMoistureValue, 490, 1023, 100, 0) поиграться. У вас при смене источника питания, скорее всего, меняется порог срабатывания датчика относительно контакта Ардуино и его нужно откорректировать с помощью данной команды
Что то схема не работает. Реле постоянно переключается с on на off. И так непрерывно.
А реле само исправно? Что у вас показывается в окне монитора последовательной связи при работе системы?
В мониторе порта поочерёдно идёт запись pump on pump off
А добавьте тогда вывод в монитор последовательного порта значения переменной percentage. Тогда, я думаю, уж точно станет ясна причина этих ваших частых переключений насоса
Попробую. По результату напишу. Спасибо.
Хорошо, будем ждать
В общем я переписал немного программу, и все заработало. Сделал все через sensorValue и analogRead, далее ввёл функцию map и принцип сравнения оставил как у Вас. Спасибо за программу, время потратил не зря.
Я рад что у вас все заработало, заходите к нам еще.
Здравствуйте, не могли бы скинуть свой код. Точно такая же проблема, никак не могу исправить проблему. Буду очень сильно благодарен.
А можете прислать свой скетч доработанный , а то у меня тоже эта проблема .
Модуль реле однозначно исправен, т.к. при подаче питания на S контакт модуля, все работает корректно.
Добрый день, можете пожалуйста скинуть программу, сын пытается сделать не получается. У него просто плата, насос, реле, датчик влажности. Монитора нет. Помогите если не затруднит, для школы надо, я сам не особо в программах).
Здравствуйте, код программы приведен в статье. Монитор у него должен быть иначе как он плату Ардуино программирует