Если вам нужен крутой проект полива теплицы - вам сюда. А если нужно её поливать - можно задержаться и здесь. -------------------------------------------------------------- Исходная обстановка. Теплица появилась у меня в этом году и достаточно поздно. Автоматизацией занялся еще позже. Видения как и что должно быть - пока нет. Вот она: Прежде чем заняться ее поливом, надо было заняться посадками - это еще время. Принял решение сделать капельный полив: под каждый кустик подведена трубочка с капельницей. Вода потихоньку вытекает под корешок растения. Выглядит это так: Решение очень немудреное. Трубки, капельницы - все продается. Однако те капельницы, что я видел, сделаны приблизительно одинаково: это пластиковое устройство с маленьким отверстием. Если оно засорится - чистить его проблемно. Был обнаружен утенок Аквадуся непонятного происхождения но, ИМХО, с гениальным решением капельниц. Капельница - это просто "заглушка" на трубку с бороздками. Такую чистить - достал, прополоскал в воде и вставил на место. Просто! Перфекционисты могут попробовать капельницы от Гардены. Дальше был сварен металлический каркас и установлена бочка. Прикуплена система Аквадуся-Старт и все установлено на свое место. А именно, соединения: Поплавок в бочку, который идет в комплекте: И сам контроллер: В тепличку подведена вода, ввод внутрь: Ввод в бочку: Итого, все вместе выглядит так, слева зеленый - датчик температуры на батарейках:
Как же поливать теплицу не по-науке, а по-старинке? Днем, когда жарко, надо открыть форточки. Форточки в теплице можно открывать, путем сравнения температуры с необходимой, отправлять команду на приводы... а можно поставить специальные гидравлические толкатели (это пример, их много разных), что и было сделано. Вопрос снят. Капельницами управляет устройство Аквадуся. Принцип работы таков: на небольшое время включается насос, который загоняет воду из бочки в систему трубок, после чего вода сифонит сама; через требуемое время насос засасывает воду обратно. В устройство включена воздушная трубка, воздух из которой засасывается в систему и сифон останавливается. Устройство Аквадуси позволяет регулировать время полива и частоту: каждый день, через день и т.д. Добавить сюда тоже не чего - Вопрос снят. Влажность! Вы серьезно? При капельном поливе измерять влажность? Где и для чего? Она будет в разных местах - разная. Под каждый куст ставить датчик влажности? Хм... Нет, я не буду. Вы - как хотите. Остается автоматическое наполнение бочки водой и сопряжение с работой контроллера Аквадуся - этим и займемся.
Что требуется еще? Кроме теплицы и помидоров в ней - нужен контроллер ESP8266 ESP-201: Кроме того, два МОСФЕТ IRF9630, микросхема IR442, фоторезистор, светодиод, преобразователь 12v -> 3.3v, провода, резисторы на 10 ком, 4,7 ком, 1 ком и 220 ом - по вкусу. Также сетевой блок питания на 12 в. Нужен кран. Кран - с электроприводом. Из доступных придумано два типа - мембранный и шаровый. Вот есть такой у МастерКита, из Поднебесной, конечно, дешевле. Однако, мне не верится, что он проработает хотя бы сезон на неочищенной воде из колодца, в которой туча ржавчины, поэтому был приобретен и установлен (пока не установлен, а присобачен) шаровый кран: Шаровый кран удобнее мембранного еще и тем, что расходует электричество лишь в момент открытия и закрытия. Мембранный должен все время быть включенным, пока идет движение воды через него. Как вы думаете, сколько этот шаровый кран потребляет электричества, когда открывается и закрывается? 0,08 А! В момент старта (короткий импульс) - до 0.2А. Время открытия/закрытия чуть больше 20 секунд. С учетом того, что ESP8266 тоже не слишком прожорлив, всю систему подачи воды можно сделать на одном старом автомобильном аккумуляторе, которого с лихвой должно хватить на сезон.
Собираем такое устройство: И заливаем такой код: Спойлер: Код на Lua Код (Lua): pins = { open = 7, close = 6, ledOpen = 2 } data = { false, -- isOpen false, -- isWater true, -- isWork } for _, pin in pairs(pins) do gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.HIGH) end gpio.write(pins.ledOpen, gpio.LOW) function debounce (func) local last = 0 local delay = 50000 return function (...) local now = tmr.now() local delta = now - last if delta < 0 then delta = delta + 2147483647 end; if delta < delay then return end; last = now return func(...) end end function onChange () if gpio.read(1) == 0 then if data[1] == true then turnOn(pins.close) else turnOn(pins.open) end end end function turnOn(pin) -- tmr 1,2 tmr.stop(1) gpio.write(pins.open, gpio.HIGH) gpio.write(pins.close, gpio.HIGH) gpio.write(pin, gpio.LOW) print('Power ON pin '..pin) tmr.alarm(1, 30000, tmr.ALARM_SINGLE, function() gpio.write(pin, gpio.HIGH) print("Power OFF from 30 sec. pin "..pin) end) if pin == pins.open then data[1] = true -- isOpen gpio.write(pins.ledOpen, gpio.HIGH) print("Valve is open") tmr.alarm(2, 2700000, tmr.ALARM_SINGLE, function() print("Time to Close by Time") turnOn(pins.close) end) else -- pin close tmr.stop(2) gpio.write(pins.ledOpen, gpio.LOW) print("Valve is closed") data[1] = false -- isOpen end end function delayStart() local counter = 0 tmr.alarm(5, 3600000, tmr.ALARM_AUTO, function() counter = counter + 1 if counter > 3 then counter = 0 tmr.stop(5) tmr.unregister(5) if data[3] then turnOn(pins.open) end end end) end tmr.alarm(4, 10000, tmr.ALARM_AUTO, function() -- check ight local light = adc.read(0) print("Light: ", light) if light > 1020 and data[2] == false and data[3] == true then data[2] = true print("delayStart") delayStart() end if light < 350 and data[2] == true then data[2] = false print('Day now!') end end) gpio.mode(1, gpio.INT) gpio.trig(1, 'down', debounce(onChange)) Прошивка NodeMCU - в приложении. Этот код не задействует wi-fi ресурсы ESP8266. Суть его - проверить не темно ли на улице, если темно - выждать три часа открыть на 45 минут кран а затем закрыть его. Почему так? Дело в том, что управление Аквадуся включается вечером, по его внутреннему таймеру в одно и то жесть время. Работает не менее 40 минут. Мы могли бы поступить также, но тогда нужны или RTC или питание модуля от аккумулятора. В ESP8266 есть неплохие внутренние часы, но надо обеспечивать непрерывность питания. Проще ограничиться фоторезистором и привязаться к солнышку, оно надежнее. Закат летом сдвигается каждый день на все более раннее время, и может наступить такой момент, что заполнение бочки произойдет во время полива, а то и раньше. Вот это и предотвращает отложенный старт. Можно было бы наполнить бочку на рассвете. Но у меня в колодце вода настолько холодная, что будучи залитой в бочку и ночью - начинает нагреваться. Кран можно, также, открыть и закрыть кнопкой. Если кран открывается кнопкой - он сам закроется через те же 45 минут. Повторное нажатие кнопки при открытом кране закрывает его в любой момент работы. Светодиод включен когда кран открыт. А что же wi-fi? А его, безусловно, можно включить и он действительно задействован. В результате этого, устройство интегрируется по протоколу MQTT с OpenHab и кроме всего прочего, управляется через Интернет. Но об этом - в соответствующей теме. Однако... Уверен, что найдутся огородники, которые будут делать орошение не на системе Аквадуся, а на простом поливе водой из бочки насосом. Еще вариант - самотеком из бочки через "сочащийся шланг" или тот же капельный полив но без насоса Аквадуси. Для них будет неплохо иметь еще один контур управления, который включает и выключает насос /открывает другой кран, после чего наполняет бочку водой. И это есть у меня. Но, чуть позже. UPD 05/12/2016. Скрипт подправлен с учетом вот этого.
Вторая версия программы. Подключил еще одну бочку для наполнения, поэтому необходимо увеличить время заполнения бочек. Общее время наполнения двух бочек - 1,5 часа с этой арматурой. Код (Lua): rtctime.set(1000, 0) -- Установка начального времени при запуске системы от "балды" delOFFvl = 2*60*60 -- Задержка выключения крана после его включения в секундах - два часа delStart = 3*60*60 -- Задержка включения крана после темноты в секундах pins = { open = 7, -- пин открытия крана close = 6, -- пин закрытия крана ledOpen = 2, -- пин светодиода read = 1 -- пин кнопки } data = { false, -- isOpen false, -- isWater true, -- work "valve", "watering", "working" } for _, pin in pairs(pins) do -- устанавливаем все в HIGH gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.HIGH) end gpio.write(pins.ledOpen, gpio.LOW) -- а светодиод гасим function debounce (func) local last = 0 local delay = 50000 return function (...) local now = tmr.now() local delta = now - last if delta < 0 then delta = delta + 2147483647 end; if delta < delay then return end; last = now return func(...) end end function turnOn(pin) -- работа с пинами крана tmr.stop(1) -- при вызове функции все останавливаем tmr.stop(2) gpio.write(pins.open, gpio.HIGH) gpio.write(pins.close, gpio.HIGH) gpio.write(pin, gpio.LOW) -- выполняем пин что вызвали print('Power ON pin '..pin) -- запускаем таймер чтобы его выключить через 30 секунд tmr.alarm(1, 30000, tmr.ALARM_SINGLE, function() gpio.write(pin, gpio.HIGH) print("Power OFF from 30 sec. pin "..pin) end) -- если это включение - дополнительно задаем выключение if pin == pins.open then data[1] = true -- isOpen gpio.write(pins.ledOpen, gpio.HIGH) print("Valve is open") local delOFF = function() -- готовим фнкию выключения local timeToOff = rtctime.get() + delOFFvl -- засекаем время print("OFF at ", timeToOff) tmr.alarm(2, 1000, 1, function() -- читаем каждую секунду if (rtctime.get()) > timeToOff then -- если время пришло print("Time to Close by Time") turnOn(pins.close) -- выключаем tmr.stop(2) -- тормозим таймер tmr.unregister(2) end end) end delOFF() else -- pin close data[1] = false -- isOpen tmr.stop(2) -- тормозим таймер выключения, потому что выключаем сейчас tmr.unregister(2) gpio.write(pins.ledOpen, gpio.LOW) print("Valve is closed") end end tmr.alarm(4, 10000, tmr.ALARM_AUTO, function() -- Проверяем освещенность local light = adc.read(0) print("Light: ", light) -- если ночь и нет захода для наполнения бочек if light > 1020 and data[2] == false and data[3] == true then data[2] = true -- начали заполнение бочек... print("delayStart") local delayStart = function() -- заполняем, но через некоторое время local timeToStart = rtctime.get() + delStart -- когда будем заливать? print("Will Start at ", timeToStart) tmr.alarm(5, 1000, 1, function() -- проверяем ежесекундно не пора ли залить бочки if rtctime.get() > timeToStart then -- Ура! Наконец то! tmr.stop(5) tmr.unregister(5) if data[3] then turnOn(pins.open) end -- если устройство в режиме работы - заполняем end end) end delayStart() -- вызов end if light < 350 and data[2] == true then -- наступил день data[2] = false print('Day now!') end end) gpio.mode(pins.read, gpio.INT) gpio.trig(pins.read, 'down', function() -- наблюдение за кнопкой с антидребезгом local a = debounce -- подгружаем функцию антидребезга local onChange = function() -- функция для исполнения if gpio.read(pins.read) == 0 then if data[1] == true then turnOn(pins.close) else turnOn(pins.open) end end end a(onChange()) -- вызываем функцию по ниспадающеу фронту end)
Продолжение. В прошлом году проект склепал на скорую руку с целью немедленной добычи помидоров и перца, а также плохого понимания сельского труда. Дисклаймер 2. Этот проект абсолютно неправильный. Ссылка на правильный в первом посте. Этот проект не делает: измерение влажности воздуха; измерение влажности почвы; открытие дверей/форточек; не имеет никаких дисплеев - смотри комп и смартфон. Тепличка выращивает в бОльшей части помидоры и перец. Оные любят сухой воздух. Увлажнителей/осушителей в теплице нет, поэтому знание влажности воздуха бесмыслено. Измерять влажность почвы при капельном поливе - странное занятие. Форточки открываются термогидравлическими толкателями, и они зарекомендовали себя отлично. Продаются в каждом садовом магазине. Этот проект делает: ручное включение/выключение полива (кнопка, смартфон) ручное включение/выключение заполнения бочки (кнопка, смартфон) ручное назначение времени полива (кнопка, смартфон) автоматическое заполнение бочки после полива по времени полив и сразу после него заполнение бочки установку интервала полива в днях дополнительное заполнение бочки по времени включение досветки по снижению освещенности выключение досветки по времени измерение температур любым количеством датчиков DS1b20 установку всех временных констант через Интернет по протоколу MQTT (смартфон, умный дом) установку уровня освещенности включения досветки через Интернет сохранение в памяти всех полученных констант отправку информации обо всех показателях на брокер MQTT (смартфон, умный дом) На компьютере это выглядит так: На смартфоне выглядит - в зависимости от любимого клиента MQTT. Передача показаний с устройства - каждые 30 секунд. Можно прицепиться к публичному MQTT брокеру, можно обойтись и без MQTT, но тогда все задается при написании программы. Ограничение проекта: проект не имеет RTC - время берется из Интернет, поэтому хотя бы иногда возможность выхода в Интернет должна появляться. При старте и один раз в день часы модуля синхронизируются с сервером времени. Если все так плохо, и Интернет не появляется, несложно будет допилить переход в аварийный режим - поливать, например, на рассвете или на закате. Но это пока не рассматривается. Все сделано на железе, описанном в начале темы.