Автоматический полив на Arduino. Делаем автополив растений с помощью Arduino

Что такое датчик влажности почвы и как он работает?

датчик влажности почвы для Arduino

Существует бесконечное множество датчиков влажности почвы и практически все варианты работают по схожему принципу; подключение датчиков, соответственно, тоже не претерпевает сложных изменений.

У всех подобных датчиков имеется 3 выхода – VCC (питание), GND (земля) и S (сигнальный выход). Из-за особенностей работы датчика и относительно небольшого его потребления, питать датчик желательно от цифрового пина микроконтроллера, включая лишь на время замера и выключая после него.

Для подключения датчика к Arduino в комплекте обычно идут все необходимые компоненты:

  • Микросхема
  • Щуп для установки в почву
  • Провода для подключения

Предупреждение – если планируется использование датчика в экстремальных (отличных от идеальных) условиях, желательно (очень желательно, практически обязательно!) предусмотреть защиту микросхемы и контактов датчика от попадания грязи и влаги.

Один из возможных вариантов защиты – применение так называемой жидкой изоленты или обычного лака для ногтей, оба варианта справятся с задачей!

Подключение датчика влажности почвы к Arduino

Измерение производится по простому принципу – на один из контактов датчика подаётся питание, а с другого оно считывается. Чем влажнее будет почва – тем меньше будет разница между двумя этими сигналами.

Из-за такого способа измерения процессы окисления разрушают контакты датчика, поэтому питание лучше подавать только на время измерения. Также, различные компании применяют специализированные покрытия контактов (например иммерсионное золото)

Необходимые инструменты и периферия

Ирригатор – устройство, контролирующее влажность почвы. Приспособление передает данные на датчик влажности, который укажет сконструированному автополиву на начало работы. Для составления программы используется язык программирования С++.

Таблица с требуемыми материалами:

КомпонентОписание
Микроконтроллер Arduino UnoПлатформа соединяет периферийные устройства и состоит из 2 частей: программная и аппаратная. Код для создания бытовых приборов программируется на бесплатной среде – Arduino IDE.

Чтобы составить и внедрить программу на микроконтроллер, необходимо приобрести usb-кабель. Для автономной работы следует купить блок питания на 10 В.

На платформе располагаются 12 пинов, роль которых заключается в цифровом вводе и выводе. Пользователь индивидуально выбирает функции каждого пина.

USB-кабельОбязателен в конструировании системы «автополив на ардуино» для переноски кода.
Плата для подключения сенсора – Troyka ShieldС помощью платы подключается сенсорная периферия посредством обычных кабелей. По краям располагаются контакты по 3 пина – S + V + G.
Нажимной клеммникСлужит фиксатором для пучковых проводов. Конструкция фиксируется с помощью кнопки на пружине.
Блок питания, оснащенный usb-входом

Анализатор влажности почвы

Идеальное средство для подключения платформ. В конструкции предусмотрен фонарик, который говорит о начале работы.

Приспособление подает сигналы, если почва чрезмерно или недостаточно увлажнена. Подключение к плате производится с помощью 3 проводков.

●      MAX глубины для погружения в землю – 4 см;

●      MAX потребление электроэнергии – 50 мА;

●      Напряжения для питания – до 4 В.

Помпа с трубкой для погружения в водуУправление осуществляется с помощью коммутатора. Длина кабеля достигает 2 метров.
Силовой ключСоздан для замыкания и размыкания электрической цепи. Если использовать приспособление при конструировании автополива ардуино, не потребуется дополнительных спаек. Подключение к основной панели осуществляется также 3 проводами.
Соединительный провод – «отец-отец»Несколько проводов соединяют периферийные устройства.
Соединительный провод – «мать-отец»Проводки также соединяют устройства периферии.
Комнатный цветокСистема пригодна для разного типа комнатных растений.

Схема подключения и алгоритм работы в проекте «Автополив» на базе мк Arduino

Ниже представлен алгоритм и схема подключения проекта на платформе arduino. Автополив строится следующим образом:

  1. Помещаем плату для сенсора на микроконтроллер.
  2. Подключаем анализатор влажности с помощью платы, описанной выше, к аналогичному пину – А0.
  3. Присоединяем сенсор к микроконтроллеру:
    1. Контакт CS подключается к пину № 9 на плате.
    2. Дисплейные контакты SPI соединяются с соответствующим разъемом на той же плате.
  4. Силовой ключ вставляем в пин №4.
  5. Коммутатор подводим к силовому ключу в разъемы, обозначаются буквами p+, p-.
  6. Теперь подключаем водяную помпу с трубкой с помощью клеммника в контакты с буквами l+ и l-. Постепенно перед конструирующим человеком построится схема.
  7. Втыкаем сенсорную панель, анализирующую влажность, в горшок с цветком.
  8. Конец трубки вставляем с водой в почву. В случае, если растение вместе с горшком по весу не превышает 2 кг, закрепляем шланг отдельно. Иначе водяная капель может опрокинуть цветок.
  9. Опускаем водяную помпу в бутылку, наполненную водой.
  10. Подключаем конструкцию к электрическому питанию.
Будет интересно➡  Электрические схемы: виды и обозначения. Как читать монтажные схемы и делать по ним монтаж

Датчик анализирует статус влажности путем определения кислотности земли. Перед вставкой ирригатора в систему необходимо протестировать и откалибровать оборудование:

  1. Записываем сведения, выведенные на дисплей. При этом сенсор воткнут в сухой горшок. Это обозначается, как min влажности.
  2. Поливаем землю с растением. Ждем, когда вода до конца пропитает почву. Тогда показания на сенсорном экране покажут один уровень. Необходимо записать полученные сведения. Это значит max влажности.
  3. В записном блокноте фиксируем константы HUM_MIN и HUM_MAX тем значением, которое было получено в результате калибровки. Прописываем значения в программе, которую переносим затем на микроконтроллер.

Выше описано конструирование автополива для одного цветка. Однако у любителей комнатных растений дом обставлен горшками с цветами. С одной стороны такой вопрос кажется сложным: необходимо подключить несколько помп и анализаторов увлажнения почвы. Но существует более дешевое и простое решение по конструированию автополива.

В шланге от помпы проделываются 25 сантиметровые отверстия с помощью шила. В полученные дырочки втыкаются кусочки стержней ручек шарикового формата. В итоге получается:

  • горшки с растениями выстраиваются в ряд на подоконнике;
  • трубка устанавливается на цветочный горшок так, чтобы вода из каждого отверстия лилась в отдельный горшок;
  • вуаля: изобретение одновременно поливает все растения.

Пользователь самостоятельно выбирает время для полива, но только для одного цветка. Нередко цветки по массе и размерам одинаковы. Следовательно, почва в горшках сохнет за одинаковое время. Для этого придуман метод комбинации: количество горшков делится по группам равного веса и размера.

Система автоматического полива на Arduino – инструкция

Настало время применить полученные нами знания в серьёзном деле – сейчас мы соберем установку для автоматического полива растений при высыхании почвы до определённого уровня. Вот пример получившейся у нас установки:

Система автоматического полива на Arduino

Для автоматизации полива нам понадобится ещё кучка радио- и не только радиоэлементов! Вообще, ваша цель – сварганить насос для подачи воды, а вот как вы это сделаете – решайте сами.

Мы использовали запатентованную технологию передачи воды по шкиву, а вы можете за “недорого” купить насос с рабочим напряжением 12В и будет вам счастье, а не куча мороки.

Система автоматического полива на Arduino

В любом случае, для управления двигателем понадобится резистор (от 100 до 1000 Ом), полупроводниковый диод Шоттки и биполярный транзистор типа PNP.

Подробная схема подключения представлена ниже:

Система автоматического полива на Arduino

Естественно, потребуется еще и программа для работы проекта. Вот она:

Подключение датчика влажности почвы к Arduino и съем показанийArduino <текстареа wrap=”soft” class=”crayon-plain print-no” data-settings=”dblclick” readonly=”” style=”-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;”> // В данном скетче считываются данные с датчика и отображается уровень влажности почвы // если почва сухая, начинает работать двигатель // Для работы с дисплеем используется библиотека softwareserial library #include // Подключите контакт для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому контакту 2 Arduino SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (unused) // Управляем двигателем с помощью контакта 9. // Этот контакт должен обязательно поддерживать ШИМ-модуляцию. const int motorPin = 9; // Тут мы настраиваем некоторые константы. // Настройка констант зависит от условий внешней среды, в которой используется датчик int levelUp = 400; int levelDown = 250; // Настраиваем контакт A0 на Arduino для работы с датчиком: int sensorPin = A0; void setup(){ pinMode(motorPin, OUTPUT); // устанавливаем контакт, к которому подключен двигатель в качестве выхода mySerial.begin(9600); // устанавливаем скорость обмена данными на 9600 baud delay(500); // ждем пока дисплей загрузится } void loop(){ // Здесь мы объявляем строку, в которой хранятся данные для отображения на дисплее. // Значения будут изменяться в зависимости от уровня влажности почвы String DisplayWords; // В переменной sensorValue хранится аналоговое значение датчика с контакта А0 int sensorValue; sensorValue = analogRead(sensorPin); // перемещаем курсор к началу первой строки дисплея: mySerial.write(254); mySerial.write(128); // очистка дисплея: mySerial.write(” “); mySerial.write(” “); // перемещаем курсор к началу первой строки дисплея: mySerial.write(254); mySerial.write(128); // запись необходимой информации на дисплей: mySerial.write(“Water Level: “); mySerial.print(sensorValue); //Использование.print вместо .write для значений // Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами. // Если значение меньше levelDown, отображаем слова: // “Dry, Water it!” if (sensorValue <= levelDown){ // перемещаем курсор к началу второй строки дисплея: mySerial.write(254); mySerial.write(192); DisplayWords = “Dry, Water it!”; mySerial.print(DisplayWords); // запуск двигателя на небольших оборотах (0 – остановка, 255 – максимальная скорость): analogWrite(motorPin, 75); // Если значение не ниже levelDown надо провести проверку, не будет // ли оно больше нашего levelUp и, если, больше, // отобразить надпись “Wet, Leave it!”: } else if (sensorValue >= levelUp){ // перемещаем курсор к началу второй строки дисплея: mySerial.write(254); mySerial.write(192); DisplayWords = “Wet, Leave it!”; mySerial.print(DisplayWords); // выключение двигателя (0 – остановка, 255 – максимальная скорость): analogWrite(motorPin, 0); // Если полученное значение в диапазоне между минимальным и максимальным и почва была раньше влажной, а теперь сохнет, отображаем надпись “Dry, Water it!” (когда приближаемся к levelDown). // Если почва была сухой, а теперь быстро увлажняется, отображаем слова “Wet, Leave it!” (когда приближаемся к levelUp): } else { // перемещаем курсор к началу второй строки дисплея: mySerial.write(254); mySerial.write(192); mySerial.print(DisplayWords); } delay(500); //Задержка в 500 миллисекунд между считываниями }

Будет интересно➡  Как подключить светодиодную ленту? Простые способы подключения светодиодной ленты
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061// В данном скетче считываются данные с датчика и отображается уровень влажности почвы// если почва сухая, начинает работать двигатель// Для работы с дисплеем используется библиотека softwareserial library#include // Подключите контакт для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому контакту 2 ArduinoSoftwareSerialmySerial(3,2);// pin 2 = TX, pin 3 = RX (unused)// Управляем двигателем с помощью контакта 9.// Этот контакт должен обязательно поддерживать ШИМ-модуляцию.constintmotorPin=9;// Тут мы настраиваем некоторые константы.// Настройка констант зависит от условий внешней среды, в которой используется датчикintlevelUp=400;intlevelDown=250;// Настраиваем контакт A0 на Arduino для работы с датчиком:intsensorPin=A0;voidsetup(){pinMode(motorPin,OUTPUT);// устанавливаем контакт, к которому подключен двигатель в качестве выходаmySerial.begin(9600);// устанавливаем скорость обмена данными на 9600 bauddelay(500);// ждем пока дисплей загрузится}voidloop(){ // Здесь мы объявляем строку, в которой хранятся данные для отображения на  дисплее. // Значения будут изменяться в зависимости от уровня влажности почвыStringDisplayWords;// В переменной sensorValue хранится аналоговое значение датчика с контакта А0intsensorValue;sensorValue=analogRead(sensorPin);// перемещаем курсор к началу первой строки дисплея: mySerial.write(254);mySerial.write(128);// очистка дисплея:mySerial.write(” “);mySerial.write(” “);// перемещаем курсор к началу первой строки дисплея: mySerial.write(254);mySerial.write(128);// запись необходимой информации на дисплей:mySerial.write(“Water Level: “);mySerial.print(sensorValue);//Использование.print вместо .write для значений // Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами.// Если значение меньше levelDown, отображаем слова:// “Dry, Water it!”if(sensorValue<=levelDown){// перемещаем курсор к началу второй строки дисплея: mySerial.write(254); mySerial.write(192); DisplayWords = “Dry, Water it!”; mySerial.print(DisplayWords); // запуск двигателя на небольших оборотах (0 – остановка, 255 – максимальная скорость): analogWrite(motorPin, 75); // Если значение не ниже levelDown надо провести проверку, не будет // ли оно больше нашего levelUp и, если, больше, // отобразить надпись “Wet, Leave it!”: } else if (sensorValue >= levelUp){// перемещаем курсор к началу второй строки дисплея:mySerial.write(254);mySerial.write(192);DisplayWords=”Wet, Leave it!”;mySerial.print(DisplayWords);// выключение двигателя (0 – остановка, 255 – максимальная скорость):analogWrite(motorPin,0); // Если полученное значение в диапазоне между минимальным и максимальным и почва была раньше влажной, а теперь сохнет,  отображаем надпись “Dry, Water it!” (когда приближаемся к levelDown). // Если почва была сухой, а теперь быстро увлажняется, отображаем слова “Wet, Leave it!” (когда приближаемся к levelUp):}else{// перемещаем курсор к началу второй строки дисплея:mySerial.write(254);mySerial.write(192);mySerial.print(DisplayWords);}delay(500);//Задержка в 500 миллисекунд между считываниями}

Программный код

#define WATERPUMP 13 // насос подключен к контакту 13 #define SENSOR 8 // цифровой контакт датчика влажности подключен к контакту 8 #define LDR A0// фоторезистор подключен к A0 #define PORTNUMBER 9600 // открываем последовательный порт, устанавливаем скорость передачи данных 9600 бит void setup() { Serial.begin(PORTNUMBER); pinMode(WATERPUMP,OUTPUT); // Определяем вывод 13 как вывод pinMode(SENSOR,INPUT); // Определяем вывод 8 в качестве входного, чтобы получать данные от датчика влажности почвы. pinMode(LDR,INPUT); // Определяем А0 как ввод digitalWrite(WATERPUMP,LOW);// Насос выключен } void loop() { int val = digitalRead(SENSOR); // сохраняет значение, полученное от датчика влажности почвы, в переменной val int LDRValue=analogRead(LDR);// сохраняет значение, полученное от фоторезистора, в переменной LDRValue if(LDRValue<= 400)// Сравниваем данные фоторезистора с пороговым значением { // если неравенство выполняется, значит ночь, полив выключен Serial.print(“Ночь, полив не требуется”); Serial.println(LDRValue);//Выводим значение фоторезистора digitalWrite(WATERPUMP, LOW);//Насос выключен return;// Возвращаемся к началу кода } //Если неравенство не выполняется, значит день, необходима проверить влажность if( val == HIGH)// Если влажность низкая { Serial.print(“День, влажность низкая, необходим полив”); Serial.println(LDRValue);// Выводим значение фоторезистора Serial.println(val);// Выводим значение влажности digitalWrite(WATERPUMP,LOW); //Насос включен } else { Serial.print(“День, влажность высокая, полива не требуется”); Serial.println(LDRValue);// Выводим значение фоторезистора digitalWrite(WATERPUMP,HIGH);//Насос выключен } delay(400); }

Будет интересно➡  Крепеж для провода и кабеля по стене и потолку

Калибровка

Показания датчика влажности сильно зависят от кислотности почвы. Поэтому перед началом пользования ирригатором требуется провести простую процедуру калибровки.

  1. Запишите показания на дисплее при воткнутом в сухой горшок сенсоре. Это — минимум влажности.
  2. Полейте цветок и дождитесь пока вода полностью впитается в землю и показания сенсора установятся на одном уровне. Запишите их. Это — максимум влажности.
  3. В скетче исправьте значения константы HUMIDY_MIN на значение минимальной влажности и HUMIDY_MAX на значение максимальной влажности. Заново прошейте Arduino Uno.

Масштабирование решения

Мы описали решение для одного растения. Но обычно требуется поливать несколько растений. Помимо очевидного решения — подключения к Arduino нескольких помп и датчиков влажности — существует более простое и дешёвое. Достаточно в трубке, которая идёт в комплекте с помпой проделать шилом дырочки на расстоянии около 30 см и воткнуть в эти дырочки куски стержней от обычных шариковых ручек. Выглядеть это будет так:

Горшки с цветами дома часто стоят в ряд на подоконнике. Вам достаточно просто положить трубку на горшки так, чтобы отверстия в ней приходились по одному на горшок. Теперь наше устройство может поливать сразу несколько горшков. Однако в таком случае принимать решение о необходимости полива можно только по одному горшку. Однако обычно горшки примерно одинаковые по размерам и, соответственно, сохнут с примерно равной скоростью. Можно так же комбинировать два решения, разделяя все горшки на группы примерно равных по размерам.

Что ещё можно сделать?

  1. Несмотря на золочение, контакты сенсора влажности со временем корродируют. Быстрее всего корродирование происходит при подключённом питании. Срок жизни сенсора можно значительно увеличить, если подключить питание к нему через силовой ключ. Когда надо получить данные — включаем питание сенсора, снимаем показания и тут же выключаем питание.
  2. Если оставить наш ирригатор работающим на длительный срок без присмотра, вода в резервуаре может закончиться. При работе без воды помпа быстро выходит из строя. Решением проблемы может быть автоматическое определение опустошения резервуара. Сенсор подбирается исходя из типа резервуара. Если он не глубок, то подойдёт ещё один датчик влажности. Когда же высоты его не хватает, можно воспользоваться УЗ-дальномером, сделать поплавок с датчиком наклона или просто опустить на дно два провода.
  3. Устройство, работающее от батареек, будет значительно безопасней питающегося от сети. Идеальным вариантом было бы питание ирригатора от батареек. Но Arduino Uno, как известно, даже в режиме сна потребляет более 10 мА. Выходом может являться использование Arduino Mini, способный в режиме сна снижать потребляемый ток до сотен мкА.
  4. Существует много правил полива домашних растений, как, например: не стоит поливать зимой вечером. Можно добавить сенсоров света или часы реального времени и скорректировать программу так, чтобы она старалась поливать в нужное время.
Предыдущая
РазноеЗачем нужны сервисы приема СМС и с чем их едят
Следующая
РазноеИмпульсный и аналоговый блоки питания, принципы работы и основные отличия. Что такое импульсный блок питания (ИБП) и как он работает
Понравилась статья? Поделиться с друзьями:
Electroinfo.net  онлайн журнал
Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять