Датчик полива растений ардуино

Урок 30. Автоматический полив растений

Система автоматического полива растений — незаменимый помощник, как для ухода за комнатными растениями, так и на огороде. Система включает мембранный насос для полива растений, если влажность почвы снизилась ниже определённого (порогового) значения. Пороговое значение влажности почвы и время на которое требуется включать насос, устанавливается при помощи кнопок.

Нам понадобится:

  • Arduino х 1шт.
  • Аналоговый датчик влажности почвы х 1шт.
  • Мембранный насос х 1шт.
  • Trema-модуль Силовой ключ х 1шт.
  • Trema-модуль Четырехразрядный LED индикатор х 1шт.
  • Trema-модуль Кнопка х 2шт.
  • Trema Shield х 1шт.
  • Коннектор Power Jack с клемником х 1шт.

Для реализации проекта нам необходимо установить библиотеку:

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Видео:

Схема подключения:

LED индикатор и кнопки, подключаются к любым выводам Arduino (как цифровым, так и аналоговым), номера указываются в скетче.

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

Силовой ключ (для управления насосом) подключается к цифровому выводу с ШИМ, номер указывается в скетче.

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

В данном уроке, LED индикатор подключён к цифровым выводам 2 и 3, кнопки подключены к цифровым выводам 11 и 12, силовой ключ к цифровому выводу 10 (с ШИМ), датчик влажности почвы к аналоговому входу A0.

Алгоритм работы:

  • При подаче питания, устройство не активно (на индикаторе мигает текущее значение влажности почвы).
    • Если однократно нажать на обе кнопки «A» и «B», то текущее состояние влажности почвы будет сохранено как пороговое (то при котором требуется начать полив) и устройство перейдёт в рабочий режим. Пороговое значение влажности почвы можно изменить в режиме ввода значений.
    • Если нажать и удерживать обе кнопки «A» и «B» дольше 2 секунд, то устройство перейдёт в режим ввода значений.

    Код программы:

    #include // подключаем библиотеку для работы с четырёхразрядным LED индикатором iarduino_4LED dispLED(2,3); // объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов индикатора ( CLK , DIO ) const uint8_t pinSensor = A0; // объявляем константу с указанием номера аналогового входа, к которому подключен датчик влажности почвы const uint8_t pinButtonA = 12; // объявляем константу с указанием номера вывода, к которому подключена кнопка A const uint8_t pinButtonB = 11; // объявляем константу с указанием номера вывода, к которому подключена кнопка B const uint8_t pinPump = 10; /* вывод с ШИМ */ // объявляем константу с указанием номера вывода, к которому подключен силовой ключ uint8_t btnState; // объявляем переменную для хранения состояний кнопок: 0-не нажаты, 1-нажата A, 2-нажата B, 3-нажата A и B, 4-удерживается A, 5-удерживается B, 6-удерживались A и B uint16_t arrMoisture[10]; // объявляем массив для хранения 10 последних значений влажности почвы uint32_t valMoisture; // объявляем переменную для расчёта среднего значения влажности почвы uint32_t timWatering; // объявляем переменную для хранения времени начала последнего полива (в миллисекундах) uint32_t timSketch; // объявляем переменную для хранения времени прошедшего с момента старта скетча (в миллисекундах) const uint8_t timWaiting = 60; // объявляем константу для хранения времени ожидания после полива (в секундах) от 0 до 99 const uint8_t pwmPump = 100; // объявляем константу для хранения скорости вращения мотора насоса (коэффициент) от 0 до 255 uint16_t timDuration = 5; /* по умолчанию */ // объявляем переменную для хранения длительности полива (в секундах) от 0 до 99 uint16_t limMoisture = 0; /* по умолчанию */ // объявляем переменную для хранения пороговой влажности почвы (для вкл насоса) от 0 до 999 uint8_t modState = 0; /* при старте */ // объявляем переменную для хранения состояния устройства: 0-не активно, 1-ожидание, 2-активно, 3-полив, 4-установка пороговой влажности, 5-установка времени полива void setup() < dispLED.begin(); // инициируем LED индикатор pinMode(pinButtonA, INPUT); // переводим вывод pinButtonA в режим входа pinMode(pinButtonB, INPUT); // переводим вывод pinButtonB в режим входа pinMode(pinPump, OUTPUT); // переводим вывод pinPump в режим выхода digitalWrite(pinPump, LOW); // выключаем насос timWatering = 0; // сбрасываем время начала последнего полива >void loop()< //*******Чтение данных:******* btnState = Func_buttons_control(); // читаем состояние кнопок, но не дольше 2 секунд timSketch = millis(); // читаем текущее время с момента старта скетча if(timWatering>timSketch) // обнуляем время начала последнего полива, если произошло переполнение millis() valMoisture = 0; for(int i=0; i arrMoisture[9]=analogRead(pinSensor); for(int i=0; i valMoisture/=10; // вычисляем среднее значение влажности почвы //*******Управление устройством:******* switch(modState) < // Устройство не активно case 0: if(btnState)< // если зафиксировано нажатие или удержание кнопок if(btnState==6)if(btnState==3) > if(timSketch%100==0)< // если начинается десятая доля секунды if(timSketch/1000%2)else > break; // Устройство в режиме ожидания (после полива) case 1: if(btnState) < // если зафиксировано нажатие или удержание кнопок if(btnState==6)if(btnState==1) if(btnState==2) if(btnState==3) > if(timSketch%100==0) < // если начинается десятая доля секунды dispLED.print("stop"); dispLED.point((timSketch/100%4)+1,true); >if(timDuration+timWaiting-((timSketch-timWatering)/1000) <=0)break; // Устройство активно case 2: if(btnState) < // если зафиксировано нажатие или удержание кнопок if(btnState==6)> if(timSketch%100==0)< // если начинается десятая доля секунды if(timSketch/1000%15else if(timSketch/1000%15<10)else else> > if(valMoisture <=limMoisture)< // если текущая влажность почвы меньше пороговой timWatering=timSketch; modState=3; dispLED.light(7); analogWrite(pinPump,pwmPump); >break; // Устройство в режиме полива case 3: if(btnState)< // если зафиксировано нажатие или удержание кнопок if(btnState==6)else analogWrite(pinPump,0); > if(timSketch%100==0) < // если начинается десятая доля секунды dispLED.print(timDuration-((timSketch-timWatering)/1000)); dispLED.point(0,true); dispLED.point((timSketch/100%4)+1,true); >if(timDuration-((timSketch-timWatering)/1000) <=0)break; // Устройство в режиме установки пороговой влажности почвы case 4: if(btnState) < // если зафиксировано нажатие или удержание кнопок if(btnState==6)if(btnState==1)0 )> if(btnState==2)> if(btnState==3) if(btnState==4)0 ) delay(100); dispLED.print(limMoisture);>> if(btnState==5) delay(100); dispLED.print(limMoisture);>> > if(timSketch%100==0) < // если начинается десятая доля секунды dispLED.print(limMoisture); >break; // Устройство в режиме установки длительность полива case 5: if(btnState) < // если зафиксировано нажатие или удержание кнопок if(btnState==6)if(btnState==1)0 )> if(btnState==2)> if(btnState==4)0 ) delay(100); dispLED.print(timDuration);>> if(btnState==5) delay(100); dispLED.print(timDuration);>> > if(timSketch%100==0) < // если начинается десятая доля секунды dispLED.print(timDuration); dispLED.point(0,true); >break; > > // Функция определения состояния кнопок uint8_t Func_buttons_control()< uint8_t a=0, b=0; // время удержания кнопок A и B (в десятых долях секунды) while(digitalRead(pinButtonA)||digitalRead(pinButtonB))< // если нажата кнопка A и/или кнопка B, то создаём цикл, пока они нажаты if(digitalRead(pinButtonA))> // если удерживается кнопка A, то увеличиваем время её удержания if(digitalRead(pinButtonB))> // если удерживается кнопка B, то увеличиваем время её удержания if(a>20 && b>20) // если обе кнопки удерживаются дольше 2 секунд, выводим на экран прочерки, указывая что их пора отпустить if(a>20 && b==0) // если кнопка A удерживается дольше 2 секунд, возвращаем 4 if(a==0 && b>20) // если кнопка B удерживается дольше 2 секунд, возвращаем 3 delay(100); // задержка на 0,1 секунды, для подавления дребезга > if(a>20 && b>20) // если обе кнопки удерживались дольше 2 секунд, возвращаем 6 if(a> 0 && b> 0)else // если обе кнопки удерживалась меньше 2 секунд, возвращаем 5 if(a> 0 && b==0)else // если кнопка A удерживалась меньше 2 секунд, возвращаем 2 if(a==0 && b> 0)else // если кнопка B удерживалась меньше 2 секунд, возвращаем 1 // если ни одна из кнопок не была нажата, возвращаем 0 >

    Ссылки:

    Источник

    Умный автополив на базе модулей Arduino

    Расскажу вам, как собрать систему, которая измеряет влажность почвы и автоматически поливает ваши растения. Эта система будет поливать растения только при необходимости, что позволит избежать чрезмерного или недостаточного полива.

    Для системы понадобится простой набор на базе модулей Arduino. В него входит:

    • Релейный модуль
    • Датчик влажности почвы. Но мы его использовать не будем, так как он подвержен коррозии. Мы сделаем свой из нержавеющего металла.
    • Модуль сравнения
    • Малый насос
    • Батарея держатель (он не понадобится)
    • USB кабель
    • Силиконовая трубка 50 см
    • F-F кабель dupont (10 шт.)

    Так же нам понадобится блок питания 5 V/0.2 A (идеально подходит обыкновенный зарядник от смартфона ) и несколько метров проводки.

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

    Работа датчика влажности почвы довольно проста. Вилка в форме зонда с двумя открытыми проводниками действует как переменный резистор (потенциометр), сопротивление которого изменяется в зависимости от содержания воды в почве.

    Это сопротивление обратно пропорционально влажности почвы: больше воды в почве — хорошая проводимость, что приводит к снижению сопротивления. Меньше воды в почве — проводимость хуже, что приводит к повышению сопротивления.

    Датчик выдает выходное напряжение в соответствии с сопротивлением, измеряя которое мы можем определить уровень влажности.

    В соответствии с сопротивлением датчика модуль выдает выходное напряжение, которое доступно на выводе аналогового выхода (AO).

    Этот же сигнал подается на высокоточный компаратор LM393 для его оцифровки, с выхода которого сигнал подается на вывод цифрового выхода (DO).

    Для регулировки чувствительности цифрового выхода (DO) модуль содержит встроенный потенциометр.

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

    Эта настройка очень полезна, когда вы хотите инициировать действие при достижении определенного порога. Например, когда уровень влажности в почве пересекает пороговое значение, вы можете активировать реле, чтобы начать перекачивание воды. Вот вам идея!

    Совет: поверните движок потенциометра по часовой стрелке, чтобы увеличить чувствительность, или против часовой стрелки, чтобы уменьшить ее.

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

    Подключаем модули согласно схеме:

    Так получилось у меня (модули я затем поместил в пластиковую коробку):

    Делаем датчик влажности

    Осталось сделать зонд (или датчик влажности почвы), так как стоковый выполнен из металла подверженного коррозии и совершенно не пригоден для использования.

    Я вырезал два электрода из нержавеющего металла, где один конец электрода соответствует разъему (мамка — как на автомобильных колонках).

    Для сборки датчика понадобится:

    • Две пластины из нержавеющего металла
    • Провод (я использовал шнур от зарядника)
    • Коробочка. Либо другая форма подходящая по размерам (мне пришлось использовать крышку от дезодоранта)
    • клей ЭДП (он позволит герметизировать контакты соединения электродов)

    При сборке зонда необходимо строго соблюсти расстояние между электродами, в точности как у стокового датчика влажности — это крайне важно! Если вы нарушите эти величины, показания датчика будут отличаться от стокового и вам придется колибровать модуль сравнения, что крайне затруднительно.

    Данный модуль обладает следующими характеристиками:

    • Рабочий диапазон влажности — 20-95% относительной влажности.
    • Температура — 0-60 ℃
    • Напряжение питания – 3,3-5 Вольт
    • Цифровые уровни выходного сигнала (0 или 1).
    • Регулировка чувствительности на компараторе LM393

    Я закрепил пластины с помощью канцелярских зажимов, прижав их к стоковому.

    После соединения контактов, залил клеем ЭДП и согласно инструкции выдержал 24 часа.

    Мой вариант датчика влажности получился таким:

    Далее подключаем наш датчик влажности:

    Сборка системы полива

    Я буду использовать 4 капельницы производительностью 8 л/час + делитель с компенсацией давления.

    Для наглядности я использую малые объемы растворной ёмкости и горшка. Вы можете применить эту систему для автополива нескольких растений, при условии использования одного и того же состава грунта и объема горшка.

    Расположение зонда, как на картинке (в области 1) не целесообразно, так как электроды зонда намокнут сразу после начала полива. В этом случае почва увлажнится лиш поверхностно и соответственно остальной объем почвы останется сухим.

    Правильное расположение зонда датчика влажности — внизу горшка (в области 2). При таком расположении полив будет эффективен. Вода поступая с верху достигнет дна и только тогда датчик влажности даст сигнал на отключение насоса. Таким образом весь объем почвы будет увлажнен.

    Укладываем наш зонд на дно горшка и засыпаем грунт.

    Соединяем капельницы с насосом и устанавливаем на рабочее место. Включаем питание и радуемся нашему умному автополиву.

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

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

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

    Данная система простейшее решение, вы можете дополнить и модернизировать её по вашим требованиям и под ваши нужды. С уважением Ваш U.H.

    Статья участника конкурса «Автор, Жги!». Автор: U.H.

    🔥 Канал конкурса: @burnwriter

    Конкурс проходит при поддержке спонсоров:

    • Надежный сид-шопEuroSeeds (@Euroseeds_shop) предоставит сертификаты на 3 000 р. для трех авторов лучших работ.
    • Отечественный производитель удобренийPlantators (@sektaplantators) предоставит аналогичный сертификат для трех авторов лучших работ.
    • Молодой, но уже завоевавший доверие сид-банкIZI (@IZI_seedbank) предоставит пачки из 7 орехов Auto Gelato genetics авторам лучших работ на дополнительные темы.

    Читай также:

    Источник

    Читайте также:  Домашний растение с кленовыми листьями
Оцените статью