Оповещение о необходимости полива на датчиках влажности. Таймер полива для самотечных систем. Экран управления расписанием полива в автоматическом режиме

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

Что для этого необходимо?

Как это собрать?

Калибровка

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

    Запишите показания на дисплее при воткнутом в сухой горшок сенсоре. Это - минимум влажности.

    Полейте цветок и дождитесь пока вода полностью впитается в землю и показания сенсора установятся на одном уровне. Запишите их. Это - максимум влажности.

    В скетче исправьте значения константы HUMIDY_MIN на значение минимальной влажности и HUMIDY_MAX на значение максимальной влажности. Заново прошейте Arduino Uno.

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

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

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

Исходный код

Для работы скетча вам понадобиться скачать и установить библиотеку для работы с дисплеем QuadDisplay2

irrigator.ino // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // даём разумное для пина, к которому подключена помпа #define POMP_PIN 4 // даём разумное для пина, к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 200 // максимальный порог влажности почвы #define HUMIDITY_MAX 700 // интервал между проверкой на полив растения #define INTERVAL 60000 * 3 // переменная для хранения показания влажности почвы unsigned int humidity = 0 ; // статическая переменная для хранения времени unsigned long waitTime = 0 ; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9 ) ; void setup(void ) { // начало работы с дисплеем qd.begin () ; // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT) ; // выводим 0 на дисплей qd.displayInt (0 ) ; } void loop(void ) { // считываем текущее показания датчика влажности почвы int humidityNow = analogRead(HUMIDITY_PIN) ; // если показания текущей влажности почвы // не равняется предыдущему запросу if (humidityNow ! = humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt (humidityNow) ; } // если прошёл заданный интервал времени // и значения датчика влажности меньше допустимой границы if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) { // включаем помпу digitalWrite(POMP_PIN, HIGH) ; // ждём 2 секунды delay(2000 ) ; // выключаем помпу digitalWrite(POMP_PIN, LOW) ; // приравниваем переменной waitTime // значение текущего времени плюс 3 минуты waitTime = millis() ; } }

Демонстрация работы устройства

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

    Несмотря на золочение, контакты сенсора влажности со временем корродируют. Быстрее всего корродирование происходит при подключённом питании. Срок жизни сенсора можно значительно увеличить, если подключить питание к нему через силовой ключ. Когда надо получить данные - включаем питание сенсора, снимаем показания и тут же выключаем питание.

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

    Устройство, работающее от батареек, будет значительно безопасней питающегося от сети. Идеальным вариантом было бы питание ирригатора от батареек. Но Arduino Uno, как известно, даже в режиме сна потребляет более 10 мА. Выходом может являться использование Arduino Mini, способный в режиме сна снижать потребляемый ток до сотен мкА.

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

Хорошо известная пословица «Ничто не ново под луной» в случае применения автоматического полива растений работает на все сто. Ну чем не автомат марлевый жгут, который непрерывно «поливает» растение, если один конец в банке с водой, а другой закопан в грунт? Или совсем суперполив с помощью системы с хорошей электронной начинкой также охотно выполнит автоматический полив растений – она все может, все сделает, но… Нет же, находятся критиканы - жгут малоэффективный, электроника ценой кусается - дорого, да и не может электронный блок перенастраиваться – для каждого нового применения нужен свой. А здесь желательно что-то такое-эдакое...


Из чего состоит автомат полива?


Вот это «такое-эдакое» мы и попытаемся сделать. Оно будет дешевым, легко перенастраиваться и эффективным – дальше некуда. Логика его работы (говорят, алгоритм) следующая: если земля сухая – автомат поливает, если почва увлажнилась – полив прекращается до высыхания грунта. А сколько ждать? Да вопрос так даже не стоит. Правильным критерием будет «высыхание» грунта. Как только высохло, так и поливаем – в любое время дня и ночи...
А теперь разложим по полочкам наш автоматический полив растений с точки зрения разработчика «умной» поливалки:

  • окружающая среда – условия квартиры, наполненный грунтом цветочный горшок, который и нужно поливать;
  • блок управления – микроконтроллерная плата, в качестве которой считается наиболее приемлемым подключение ардуино;
  • объект управления – банка с водой, исполнительный механизм - насос для перекачки воды;
  • дополнительные элементы системы автоматического полива растений:
    • ее «глаза» - датчики высыхания грунта и уровня воды в банке;
    • «руки» - насос, который будет качать воду в зону полива;
    • чистая техника - ключ коммутации, фактически выключатель насоса и два светодиода, зеленый и красный, для индикации «вода есть» и «воды мало».
Вот и вся система, которую называют автоматический полив растений, способная освободить от рутины ежедневных забот.
Казалось бы, что вместо банки с водой нужно просто подключиться к водопроводной трубе, но шлангочки-трубочки по квартире – не очень украшают помещение, так что задача автоматического полива растений решается с использованием автономной емкости, которую надо ручками «заправлять» водичкой. А чтоб банка с водой не раздражала эстетические вкусы ее можно замаскировать декоративным рисунком, чтоб казалось, что так и надо.


Насос, выполняющий автоматический полив растений


Водяной насос

Насос для перекачки воды – покупной. Его можно взять от стеклоомывателя, принтера или аквариумный. Любой из них легко справится с задачей, но проще применить от автомобиля. Все просто – пришел, увидел, купил, но перед применением нужно опытным путем подобрать напряжение питания, чтоб его струя меньше напоминала самодельный домашний гейзер. Спокойная водяная струя образуется при напряжении от 8 В до 9 В.
Более сложный вопрос - рабочий ток двигателя насоса. У разных образцов это может быть 2-3 и больше ампер, а допустимая токовая нагрузка по выходу контроллера значительно меньше – 10 - 20 мА. Поэтому необходимо увеличить коммутационную способность блока управления. Для этого к его выходу подключают мощный транзистор, который, благодаря подключению ардуино и обеспечивает включение насоса. Применим сборку транзисторов uln2003 (см. схему), каждый из которых может коммутировать ток 0,5 А. Если входы и выходы объединить параллельно, то допустимый нагрузочный ток будет равняться суммарному, т.е. 0,5 * N. Так и сделаем.


Подключение ардуино – блока управления


Принципиальная схема устройства автоматического полива растений

Блок управления – одноплатный микропроцессорный контроллер Arduino, который и предназначен для таких простеньких задач. Техника работы с ним простая – отлаживают программу на компьютере и после подключения ардуино «переганяют» ее в процессор. Если что-то нужно изменить, то программу переделывают на компьютере и переустанавливают в контроллер. И при этом ничего не нужно перепаивать, переделывать. Это как раз и есть то, что называют «возможностью перенастройки».
Следующим этапом подключения ардуино к устройству, которое непосредственно выполняет функции автоматического полива растений, заключается в соединение проводов датчиков и силового провода питания насоса с самим контроллером. В данном случае лучше всего для блока питания использовать аккумулятор – полив работает очень короткое время – буквально несколько секунд, и постоянное «дежурство» сетевого блока питания нецелесообразно.


Датчики – «глаза» автомата


Датчик влажности из гвоздей

Датчик влажности лучше всего сделать из материала не подверженного окислению, например, графитовых стержней. Если не мудрствовать, то пара гвоздей, забитых в изолирующую пластину, за несколько секунд превращаются именно в такой датчик (см. рисунок), который использует подключение ардуино, чтобы дать о себе знать системе автоматического полива растений, а установку графитовых стержней можно отложить на период «сдачи» нашей поливалки в постоянную эксплуатацию.

Поплавковый датчик уровня воды

Датчик уровня воды легко реализуется таким же «гвоздиковым», как выше, но мы сделаем другой – поплавковый (см. рисунок). Его легко собрать из трубки 4, которая фиксируется на банке, а стержень 3 по ней легко перемещается. В нижней части стержня крепится поплавок 2, а в верхней его части находится перемычка 6. На верхнем конце трубки расположена диэлектрическая пластина с двумя контактами 5 провода от которых идут на подключение ардуино.
Принцип датчика прост, как мир: если воды много поплавок 2 поднимает стержень 3, замыкающая пластина поднимается вверх и контакты 5 размыкаются. При снижении уровня воды до метки и ниже, поплавок опускается, и пластина 6 замыкает контакты 5.


Алгоритм устройства управления


Алгоритм управления

Самое важное при конструировании блоков управления на микропроцессорах – правильно построить алгоритм работы. Ведь подробное описание работы на специальном языке программ всех узлов, имеющих подключенный ардуино, определяет порядок опроса и анализа входных сигналов. Кроме того, для выполнения тех или иных действий заданных разработчиком (а это как раз мы с вами), контроллер должен учитывать отрезки времени работы исполнительных механизмов. И вот, что у нас получилось (см. рисунок). Рассмотрим по шагам.
После подключения ардуино в работу, он опрашивает состояние датчика уровня воды и отражает его светодиодами – это сигнализация для нас. Следующий датчик – влажности – может сказать «а почва-то влажная» и тогда блоку управления следует возвратиться в начало – его цикл работы завершился и так далее – без устали по циклу. Как только почва высохла контроллер, благодаря датчику, об этом узнает и начнет отрабатывать свою прямую задачу – полив.
Сначала будет включен насос, например, на 2 сек. А почему не на три-четыре-пять? Да потому, что эти 2 секунды мы определили экспериментально (а вполне могло быть и другое число – все зависит от насоса). Критерием служит количество перекачанной воды. Ее должно быть достаточно для полива в течение некоторого промежутка времени – час-два, может сутки. На смачивание грунта после полива отводится 30 сек (на ваш вкус). Только после отработки этого отрезка времени контроллер продолжит работу дальше, т.е. начнется новый цикл.
Новый цикл – это опять опрос датчика через подключение ардуино, анализ информации и т.д.
Алгоритм работы можно усложнять. Например, понадобится поливать не один горшок, а несколько – не ставить же контроллер на каждый. Для этого нужно использовать и его свободные входы/выходы куда и подсоединить датчики и насосы от каждого горшка, а в алгоритме предусмотреть дополнительные блоки их опроса.
После составления алгоритма работы устройства, на его основе пишут программу и моделируют на компьютере работу программы при помощи специальных отладчиков, которые всегда есть для конкретного контроллера – в нашем случае это ардуино. Отлаженная программа записывается в процессор ардуино, для этого там уже все есть, надо только включить с компьютера соответствующий блок отладчика.
Вариант такой программы приведен ниже (Вы можете скачать текст программы внизу статьи, вместе с чертежами устройства).


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


// константы
const int dw = 12; // датчик уровня воды на 12 пин
const int dg = 11; // датчик влажности почвы на 11 пин
const int nasos = 2; // управление насосом на 2 пин
const int ledG = 3; // зеленый светодиод на 3 пин
const int ledR = 4; // красный светодиод на 4 пин
// переменные
int dwS = 0; // состояние датчика уровня воды
int dgS = 0; // состояние датчика уровня влажности почвы
//установки void setup() {
// объявляем пины светодиодов и насоса как выходы: pinMode(nasos, OUTPUT); pinMode(ledG, OUTPUT); pinMode(ledR, OUTPUT);
// объявляем пины датчиков и насоса как входы: pinMode(dw, INPUT); pinMode(dg, INPUT);
}
// рабочий цикл void 1оор(){
// считываем состояния датчика уровня жидкости dwS = digitalRead(dw);
// если воды много - включаем зеленый, иначе красный if (dwS == LOW) { digitalWrite(ledG, HIGH); digitalWrite(ledR, LOW);
}
else {
digitalWrite(ledG, LOW); digitalWrite(ledR, HIGH);
}
// считываем состояния датчика влажности почвы dgS = digitalRead(dg);
// если почва сухая, включаем полив if (dgS == LOW) { digitalWrite(nasos, HIGH); delay(2000);
digitalWrite(nasos, LOW); delay(30000);
}
else {
digitalWrite(nasos, LOW);
}
}


Конструкция автомата полива


А теперь займемся размещением узлов нашего автомата. Датчик влажности располагается в грунте горшка на углублении 2-5 см (подбирается экспериментально). Трубка, подающая воду, находится рядом с одним из его электродов. Самый простой вариант емкости – стеклянная банка, а датчик воды с насосом крепятся на ее пластиковой крышке, причем насос можно разместить внутри банки.
Электронику, выполняющую автоматический полив растений – контроллер, блок питания, микросхему ключей uln2003 и резисторы прячем в стандартный корпус, которых сейчас в продаже можно подобрать - на любой вкус. На передней панели устанавливаем светодиоды и разъем, через который осуществляется подключение ардуино с насосом и датчиками.
Вот так в нашем доме может появиться еще один умный помощник, выполняющий автоматический полив растений, который будет следить за увлажнением грунта наших цветов и не скажет «да, знаешь, как то замотался в текучке, забыл». И если все так и случилось, то настоящий «самоделкин» посмотрит вокруг пристально, как будто с вопросом, «что бы еще сделать такое-эдакое?».

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

  • Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).

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

Видео:

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

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

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

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

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

#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 последних значений влажности почвы 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){timWatering=0;} // обнуляем время начала последнего полива, если произошло переполнение millis() valMoisture = 0; for(int i=0; i<9; i++){arrMoisture[i]=arrMoisture;} arrMoisture=analogRead(pinSensor); for(int i=0; i<10; i++){valMoisture+=arrMoisture[i];} valMoisture/=10; // вычисляем среднее значение влажности почвы //*******Управление устройством:******* switch(modState){ // Устройство не активно case 0: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;} if(btnState==3){modState=2; limMoisture=valMoisture;} } if(timSketch%100==0){ // если начинается десятая доля секунды if(timSketch/1000%2){dispLED.print(valMoisture);}else{dispLED.print(" ");} } break; // Устройство в режиме ожидания (после полива) case 1: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;} if(btnState==1){modState=2;} if(btnState==2){modState=2;} if(btnState==3){modState=2;} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print("stop"); dispLED.point((timSketch/100%4)+1,true); } if(timDuration+timWaiting-((timSketch-timWatering)/1000)<=0){// если закончилось время ожидания modState=2; } break; // Устройство активно case 2: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4; dispLED.light(7);} } if(timSketch%100==0){ // если начинается десятая доля секунды if(timSketch/1000%15<5){dispLED.light(7); dispLED.print(valMoisture);}else if(timSketch/1000%15<10){dispLED.light(1); dispLED.print(limMoisture,LEN4);}else {dispLED.light(7); if(timWatering){dispLED.print(int((timSketch-timWatering)/1000%3600/60),int((timSketch-timWatering)/1000%3600%60),TIME);}else{dispLED.print("----");}} } if(valMoisture<=limMoisture){ // если текущая влажность почвы меньше пороговой timWatering=timSketch; modState=3; dispLED.light(7); analogWrite(pinPump,pwmPump); } break; // Устройство в режиме полива case 3: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;}else{modState=1;} 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){// если закончилось время полива modState=1; analogWrite(pinPump,0); } break; // Устройство в режиме установки пороговой влажности почвы case 4: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=5;} if(btnState==1){if(limMoisture>0){limMoisture--;}} if(btnState==2){if(limMoisture<999){limMoisture++;}} if(btnState==3){limMoisture=valMoisture;} if(btnState==4){while(digitalRead(pinButtonA)){if(limMoisture>0){limMoisture--;} delay(100); dispLED.print(limMoisture);}} if(btnState==5){while(digitalRead(pinButtonB)){if(limMoisture<999){limMoisture++;} delay(100); dispLED.print(limMoisture);}} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(limMoisture); } break; // Устройство в режиме установки длительность полива case 5: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=2;} if(btnState==1){if(timDuration>0){timDuration--;}} if(btnState==2){if(timDuration<99){timDuration++;}} if(btnState==4){while(digitalRead(pinButtonA)){if(timDuration>0){timDuration--;} delay(100); dispLED.print(timDuration);}} if(btnState==5){while(digitalRead(pinButtonB)){if(timDuration<99){timDuration++;} 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)){if(a<200){a++;}} // если удерживается кнопка A, то увеличиваем время её удержания if(digitalRead(pinButtonB)){if(b<200){b++;}} // если удерживается кнопка B, то увеличиваем время её удержания if(a>20 && b>20){dispLED.print("----");} // если обе кнопки удерживаются дольше 2 секунд, выводим на экран прочерки, указывая что их пора отпустить if(a>20 && b==0){return 4;} // если кнопка A удерживается дольше 2 секунд, возвращаем 4 if(a==0 && b>20){return 5;} // если кнопка B удерживается дольше 2 секунд, возвращаем 3 delay(100); // задержка на 0,1 секунды, для подавления дребезга } if(a>20 && b>20){return 6;} // если обе кнопки удерживались дольше 2 секунд, возвращаем 6 if(a> 0 && b> 0){return 3;}else // если обе кнопки удерживалась меньше 2 секунд, возвращаем 5 if(a> 0 && b==0){return 1;}else // если кнопка A удерживалась меньше 2 секунд, возвращаем 2 if(a==0 && b> 0){return 2;}else // если кнопка B удерживалась меньше 2 секунд, возвращаем 1 {return 0;} // если ни одна из кнопок не была нажата, возвращаем 0 }

После того как у меня высох очередной цветок, я понял, что неплохо было бы как-то автоматизировать процесс полива. Потому что я уверен, что она сдохла из за нехватки воды.
Я решил собрать конструкцию, которая бы поливала цветок вместо меня. В итоге у меня получился вот такой аппарат, который вполне справляется со своими обязанностями:

При помощи двух регуляторов можно настроить объём поливаемой за раз воды, а также период между поливами. Кому интересно - далее подробная инструкция, как сделать такое устройство. В основу мозга я применил Ардуино (Arduino Mega).
Для сборки поливалки вам понадобится некоторое количество компонентов и не более чем 30 минут свободного времени.

Используемые компоненты:

  • Arduino Mega (она просто была под рукой, но любая другая подойдёт)
  • Насос и силиконовая трубка (подойдёт насос омывателя автомобильных стёкол - можно купить в любых автозапчастях или можно купить маленький погружной насос на ebay)
  • Блок питания
  • Два переменных резистора для регулировки (любые)
  • Транзистор IRL3705N
  • Два резистора (100 Ом и 100 кОм)
  • Диод (любой)
  • Резервуар для воды (в моем случае пластиковая коробочка из Ikea)
  • Макетка

Собираем всё по такой схеме:

Или нагляднее:

Вот что получилось у меня:

Сначала протестим насос. Подадим на него 5В. Если он зажужжал, всё в порядке, двигаемся дальше.

Теперь подключим насос к Arduino. Сделаем для управления насоса с ардуино небольшую обвязку на макетке.

Попробуем поуправлять насосом с Ардуино. Зальём такой код

int pumpPin = 5 ; void setup() { pinMode(pumpPin, OUTPUT); digitalWrite(pumpPin, LOW); } void loop() { digitalWrite(pumpPin, HIGH); delay(1000 ); digitalWrite(pumpPin, LOW); delay(1000 ); }

Если он периодически жужжит, значит, снова всё в порядке.

Теперь нам осталось добавить два регулятора. Подцепим к нашему устройству переменные резисторы, и проверим их работоспособность.

Зальём такой код на Ардуино

int volumePin = A0; void setup() { pinMode(volumePin, INPUT); Serial.begin(9600 ); } void loop() { Serial.println(analogRead(volumePin)); delay(100 ); }

Зайдём в Serial Monitor и убедимся, что есть реакция на поворот регулятора. Он должен меняться примерно от 0 до 1024

Теперь осталось заставить заработать всё это вместе.

Вот непосредственно код поливалки:

// Первый регулятор управляет временем, которое будет литься вода (от 4 до 15 секунд) #define MAX_FLOWTIME 15 // seconds #define MIN_FLOWTIME 4 // seconds // Второй регулятор управляет частотой полива от раза в день до раза в неделю #define MAX_PERIOD 7 // days #define MIN_PERIOD 1 // days #define MAX 1015 #define MIN 0 int volumePin = A0; // Пин, к которому подцеплен регулятор, отвечающий за объём поливаемой воды int periodPin = A1; // Пин, к которому подцепелн регулятор, отвечающий за период между поливами int pumpPin = 5 ; // Пин, к которому подсоединено управление насосом int volume; int period; // Процедура, включающая насос на время, заданное в volume void water() { digitalWrite(pumpPin, HIGH); // включаем насос delay(volume); digitalWrite(pumpPin, LOW); // выключаем насос delay(period); } void setup() { pinMode(pumpPin, OUTPUT); digitalWrite(pumpPin, LOW); } void loop() { // Считываем значения регуляторов (переменных резисторов) и приводим их к заданным пределам volume = map (analogRead(volumePin), MIN, MAX, MIN_FLOWTIME, MAX_FLOWTIME) * 1000 ; period = map (analogRead(periodPin), MIN, MAX, MIN_PERIOD, MAX_PERIOD) * 1000 * 60 * 60 * 24 ; water(); }

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

Про умные дома вы, наверное, слышали. Многие идеи в этом направлении весьма футуристичны, но это не должно останавливать.

Некоторые казались фантастикой всего 20 - 25 лет назад, а сейчас применяются повсеместно. В ближайшее время все дома сильно «поумнеют» или хотя бы начнут «умнеть». Направление это не только перспективное, но и интересное, так что не стоит оставаться в стороне.

Вообще, умный дом - это очень сложная система датчиков, механических и электронных компонентов, управляемая по заложенной программе. Эта система следит за расходом (и утечкой) воды, газа, электричества. Управляет освещением. Включает противопожарные элементы. Обеспечивает удаленное управление разными устройствами по телефону или СМС. Включает элементы защиты от краж и несанкционированного доступа. Содержит устройства бесперебойного питания жизненно важных для всей системы блоков.

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

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

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

Алгоритм работы автомата полива растений простой: высохла земля в горшке - поливаем, полили - ждем, пока высохнет. Вроде все просто на первый взгляд. Составляем список необходимых компонентов: микроконтроллерная плата, насос, силовой ключ управления двигателем насоса, датчик влажности почвы, емкость с водой (на самом деле хорошо бы подключиться к водопроводу, но лучше не будем:-) Чтобы система была полностью автономной, необходимо ее оснастить устройством оповещения о расходе воды, например, зеленый светодиод - воды достаточно, красный - воды осталось мало, надо долить. Значит, нужен еще датчик уровня воды.

Насос для автомата полива растений

Из вышеперечисленного все, кроме насоса, изготовим самостоятельно. Насос подойдет любой маломощный. Можно поискать в старых и сломанных струйных принтерах или купить в автозапчастях насос для стеклоомывателя, самый простой я нашел за 90 рублей.

Важно: прежде чем подключать насос к готовому устройству, проверьте его в работе. Автомобильный насос может выдать фонтан в несколько метров; дома такое «поливание» могут не понять и запретить на корню. Подберите опытным путем оптимальное напряжение. Автонасос рассчитан на питание от бортовой сети 12 В, на моем экземпляре достаточный напор появляется уже при напряжении 8…9 В. Насос от принтера напора в несколько метров не даст, но с ним другая проблема: в принтере он качал чернила, а они очень трудно отмываются, и такой насос аккуратнейшим образом необходимо будет промыть.

О датчиках

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

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

Датчик уровня жидкости можно сделать так же, как и датчик влажности почвы, а можно придумать конструкцию поплавкового типа. Второй вариант предпочтительнее. На рисунке 3 вариант такого датчика, где 1 - емкость с водой для полива и отметкой минимума, 4 - трубка из любого материала и стержень 3, который свободно ходит в трубке. Трубку и стержень можно взять от старой шариковой ручки. Внизу на стержень крепится поплавок 2 (кусок пенопласта). В верхней, надводной, части конструкции на трубке размещаем на пластиковой пластине контакты 5, это и будут контакты датчика. Сверху на стержень крепим токопроводящую пластину 6. Ход стержня в трубке 1…2 см. К контактам 5 припаиваем провода для подключения к Arduino. Трубка 4 неподвижно крепится внутри емкости.

Принцип работы датчика следующий. Когда воды много, поплавок 2 выталкивает стержень 3 до упора вверх, при этом пластина 6 не касается контактов 5. Когда уровень воды опускается ниже отметки МИН, поплавок опускается вместе с уровнем воды и опускает стержень с пластиной б, которая, в свою очередь, касается контактов 5 и замыкает их между собой. Контроллеру остается только считывать состояние контактов 5. Если лень возиться, можно купить похожие в автозапчастях, они там продаются как датчики уровня охлаждающей жидкости, цена самых простых 100 - 150 рублей.

Управление доверим Arduino

Для нее это тривиальная задача. Датчики одним контактом подключаем к пину Arduino и через высокоомный резистор подтягиваем к «земле», другим контактом - к +5 В питания Arduino. Для выбора способа подключения насоса нам нужно знать ток, который он потребляет в режиме работы, причем обязательно при перекачивании воды; на холостом ходу ток может быть меньше. Если ток меньше 3,5 А, то можно для подключения насоса применить транзисторную сборку uln2003.

Каждый выход uln2003 может управлять нагрузкой 0,5 А. Я подключил параллельно все семь входов и выходов для увеличения тока нагрузки: 7×0,5=3,5 А. Если ток насоса больше 3,5 А, то можно поставить полевой транзистор, например irf630 (но к нему нужны дополнительные элементы). Этот транзистор выдерживает ток до 9 А. Если вашему насосу требуется больший ток, то меняйте насос, а то у нас получится не поливалка, а брандспойт:-)

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

Блок-схема управляющего алгоритма представлена на рисунке ниже. После запуска устройства в непрерывном рабочем цикле опрашиваются датчики и, исходя из состояния каждого датчика, выполняются действия. Датчик уровня воды управляет светодиодами. Датчик влажности почвы управляет насосом.

Программа простая, но требует корректировки в каждом конкретном случае. Особенно нужно уделить внимание паузе между включением и выключением насоса: чем меньше цветочный горшок и чем больше производительность насоса, тем меньше должна быть пауза. Также от размеров горшка зависит и пауза после выключения насоса. После полива земля должна пропитаться, иначе, если влага до датчика не дойдет, то система включит полив еще раз. Оптимальный вариант - трубку подачи воды разместить рядом с датчиком, чтобы земля в районе датчика пропитывалась сразу. Здесь же отмечу: уровень влажности для включения полива можно регулировать самим датчиком, погружая его на разную глубину.

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

// константы
const int dw = 12; // датчик уровня воды на 12 пин
const int dg = 11; // датчик влажности почвы на 11 пин
const int nasos = 2; // управление насосом на 2 пин
const int ledG = 3; // зеленый светодиод на 3 пин
const int ledR = 4; // красный светодиод на 4 пин
// переменные
int dwS = 0; // состояние датчика уровня воды
int dgS = 0; // состояние датчика уровня влажности почвы
//установки
void setup() {
// объявляем пины светодиодов и насоса как выходы:
pinMode(nasos, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
// объявляем пины датчиков и насоса как входы:
pinMode(dw, INPUT);
pinMode(dg, INPUT);
}
// рабочий цикл
void 1оор(){
// считываем состояния датчика уровня жидкости
dwS = digitalRead(dw);
// если воды много - включаем зеленый, иначе красный
if (dwS == LOW) {
digitalWrite(ledG, HIGH);
digitalWrite(ledR, LOW);
}
else {
digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH);
}
// считываем состояния датчика влажности почвы
dgS = digitalRead(dg);
// если почва сухая, включаем полив
if (dgS == LOW) {
digitalWrite(nasos, HIGH);
delay(2000);
digitalWrite(nasos, LOW);
delay(30000);
}
else {
digitalWrite(nasos, LOW);
}
}

Относительно кода хочу сказать следующее. Для его упрощения я поставил команды delay, на которые сам же ругался. Из-за delay в один момент наше устройство застывает на 30 секунд (а может, придется поставить и больше). Но в данном устройстве это не критично. Если в итоге устройство будет поливать 10 растений и произойдет совпадение, что все надо полить одновременно, думаю, 300 секунд, которые придется ждать последнему растению, не так уж важны.

А вот для источника питания такое решение сыграет положительную роль: оно не позволит устройству включить 10 насосов одновременно. Первый delay(2000) включает на 2 секунды насос, если у вас большое растение в большом горшке, то время надо увеличить, если насос очень производительный, то, наоборот, уменьшить. Второй delay(30000) дает почве 30 секунд пропитаться водой, об этом я писал ранее. Возможно, это время тоже нужно регулировать.

Конструктивно устройство состоит из двух частей - электронной и механической. Электронную часть и элементы питания желательно поместить в корпус, чтобы случайные брызги не вывели электронику из строя. Можно задействовать не всю Arduino, а микроконтроллер, кварц с конденсаторами и стабилизатор питания на 5 В. В этот же корпус помещаем микросхему uln2003, резисторы, выводим на лицевую панель светодиоды и устанавливаем разъем для подключения датчиков и насоса. Если насос мощный и uln греется, то в корпусе сверлим отверстия для вентиляции. Дополнительный индикатор включения устройства устанавливать не нужно, один из светодиодов уровня воды включен всегда, он и выполнит эту функцию.

Корпус для электронной части можно изготовить из любого материала или подобрать готовый. Для емкости можно применить пластиковую бутылку или стеклянную банку подходящего размера, а можно склеить из пластика. Крепим датчик уровня жидкости и устанавливаем насос. Если насос придется погружать на дно (а бывают и такие), то очень аккуратно изолируем все его токоведущие провода. От насоса до горшка с растением проводим трубку подходящего диаметра. Купить такую можно в магазине автозапчастей вместе с насосом или подобрать подходящую резиновую или силиконовую. На ободе горшка придумываем крепление для трубки таким образом, чтобы при подаче воды не было брызг. Датчик влажности устанавливаем в непосредственной близости к трубке. Чтобы стоящая рядом с растением стеклянная или пластиковая посудина не пугала окружающих своим видом, можно с помощью акриловых витражных красок придать ей авторский дизайнерский стиль.

Далее испытания. Не забывайте: от работы устройства зависит благополучие растения. Перед проведением практических испытаний проведите испытания стендовые, потестировав несколько дней устройство с горшком без растения. Земля в нем не должна быть залита или пересушена. В случае необходимости датчик влажности углубите побольше или, наоборот, приподнимите повыше. Регулируйте в программе продолжительность работы насоса. Он не должен каждые пять минут выдавать по капле, но и не должен раз в неделю заливать землю. По ходу эксперимента следите за температурой электронных компонентов.

Не допускайте перегрева!

Когда все отлажено, переходите к испытаниям практическим, взяв самое неприхотливое растение. Внимательно следите за состоянием растения, если что-то не так, останавливайте эксперимент до выяснения причин. Если все нормально, подключайте к Arduino еще один датчик и насос, дописывайте код и автоматизируйте полив еще одного растения. Без дополнительного расширения портов Arduino справится с десятком растений.

Приложение. Код без комментариев:
const int dw = 12;
const int dg = 11;
const int nasos = 2;
const int ledG = 3;
const int ledR = 4;
int dwS = 0;
int dgS = 0;
void setup() { pinMode(nasos, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(dw, INPUT);
pinMode(dg, INPUT); }
void loop(){ dwS = digitalRead(dw);
if (dwS == LOW) { digitalWrite(ledG, HIGH);
digitalWrite(ledR, LOW); }
else { digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH); }
dgS = digitalRead(dg);
if (dgS == LOW) { digitalWrite(nasos, HIGH);
delay(2000);
digitalWrite(nasos, LOW);
delay(30000); }
else { digitalWrite(nasos, LOW); }}

Предыдущая статья: Следующая статья: