Полив теплицы дедовским способом: одна ESP8266.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 июл 2016.

  1. ИгорьК

    ИгорьК Гуру

    Если вам нужен крутой проект полива теплицы - вам сюда.
    А если нужно её поливать - можно задержаться и здесь.
    --------------------------------------------------------------
    Исходная обстановка.
    Теплица появилась у меня в этом году и достаточно поздно. Автоматизацией занялся еще позже. Видения как и что должно быть - пока нет.
    Вот она:
    000.jpg

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

    Решение очень немудреное. Трубки, капельницы - все продается. Однако те капельницы, что я видел, сделаны приблизительно одинаково: это пластиковое устройство с маленьким отверстием. Если оно засорится - чистить его проблемно.
    Был обнаружен утенок Аквадуся непонятного происхождения но, ИМХО, с гениальным решением капельниц.
    0019.jpg

    Капельница - это просто "заглушка" на трубку с бороздками. Такую чистить - достал, прополоскал в воде и вставил на место. Просто!

    Перфекционисты могут попробовать капельницы от Гардены.

    Дальше был сварен металлический каркас и установлена бочка.
    0004.jpg

    Прикуплена система Аквадуся-Старт и все установлено на свое место. А именно, соединения:
    0005.jpg

    Поплавок в бочку, который идет в комплекте:

    0006.jpg

    И сам контроллер:
    0011.jpg

    В тепличку подведена вода, ввод внутрь:
    0009.jpg

    Ввод в бочку:
    0010.jpg

    Итого, все вместе выглядит так, слева зеленый - датчик температуры на батарейках:
    0002.jpg
     
    Последнее редактирование: 19 июл 2016
    NikitOS, issaom и DIYMan нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Как же поливать теплицу не по-науке, а по-старинке?
    Днем, когда жарко, надо открыть форточки. Форточки в теплице можно открывать, путем сравнения температуры с необходимой, отправлять команду на приводы... а можно поставить специальные гидравлические толкатели (это пример, их много разных), что и было сделано. Вопрос снят.
    0022.jpg
    Капельницами управляет устройство Аквадуся. Принцип работы таков:
    • на небольшое время включается насос, который загоняет воду из бочки в систему трубок, после чего вода сифонит сама;
    • через требуемое время насос засасывает воду обратно. В устройство включена воздушная трубка, воздух из которой засасывается в систему и сифон останавливается.
    Устройство Аквадуси позволяет регулировать время полива и частоту: каждый день, через день и т.д.
    Добавить сюда тоже не чего - Вопрос снят.
    0024.jpg

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

    Остается автоматическое наполнение бочки водой и сопряжение с работой контроллера Аквадуся - этим и займемся.
     
    Последнее редактирование: 25 дек 2017
    NikitOS и DIYMan нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Что требуется еще?
    Кроме теплицы и помидоров в ней - нужен контроллер ESP8266 ESP-201:
    [​IMG]

    Кроме того, два МОСФЕТ IRF9630, микросхема IR442, фоторезистор, светодиод, преобразователь 12v -> 3.3v, провода, резисторы на 10 ком, 4,7 ком, 1 ком и 220 ом - по вкусу. Также сетевой блок питания на 12 в.

    Нужен кран. Кран - с электроприводом. Из доступных придумано два типа - мембранный и шаровый.
    Вот есть такой у МастерКита, из Поднебесной, конечно, дешевле.
    [​IMG]

    Однако, мне не верится, что он проработает хотя бы сезон на неочищенной воде из колодца, в которой туча ржавчины, поэтому был приобретен и установлен (пока не установлен, а присобачен) шаровый кран:
    0014.jpg
    Шаровый кран удобнее мембранного еще и тем, что расходует электричество лишь в момент открытия и закрытия. Мембранный должен все время быть включенным, пока идет движение воды через него.

    Как вы думаете, сколько этот шаровый кран потребляет электричества, когда открывается и закрывается? 0,08 А! В момент старта (короткий импульс) - до 0.2А. Время открытия/закрытия чуть больше 20 секунд.

    С учетом того, что ESP8266 тоже не слишком прожорлив, всю систему подачи воды можно сделать на одном старом автомобильном аккумуляторе, которого с лихвой должно хватить на сезон.
     
    Последнее редактирование: 24 мар 2017
    NikitOS и DIYMan нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Собираем такое устройство:
    Тепличка3.jpg
    И заливаем такой код:

    Код (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. Скрипт подправлен с учетом вот этого.
     

    Вложения:

    Последнее редактирование: 8 дек 2016
    NikitOS, ostrov и DIYMan нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Вторая версия программы. Подключил еще одну бочку для наполнения, поэтому необходимо увеличить время заполнения бочек.
    [​IMG]

    Общее время наполнения двух бочек - 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)
     
     
    Последнее редактирование: 8 дек 2016
  6. ИгорьК

    ИгорьК Гуру

    Продолжение.
    В прошлом году проект склепал на скорую руку с целью немедленной добычи помидоров и перца, а также плохого понимания сельского труда.
    Дисклаймер 2.
    Этот проект абсолютно неправильный. Ссылка на правильный в первом посте.
    Этот проект не делает:
    1. измерение влажности воздуха;
    2. измерение влажности почвы;
    3. открытие дверей/форточек;
    4. не имеет никаких дисплеев - смотри комп и смартфон.
    Тепличка выращивает в бОльшей части помидоры и перец. Оные любят сухой воздух. Увлажнителей/осушителей в теплице нет, поэтому знание влажности воздуха бесмыслено.

    Измерять влажность почвы при капельном поливе - странное занятие.

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

    Этот проект делает:
    • ручное включение/выключение полива (кнопка, смартфон)
    • ручное включение/выключение заполнения бочки (кнопка, смартфон)
    • ручное назначение времени полива (кнопка, смартфон)
    • автоматическое заполнение бочки после полива
    • по времени полив и сразу после него заполнение бочки
    • установку интервала полива в днях
    • дополнительное заполнение бочки по времени
    • включение досветки по снижению освещенности
    • выключение досветки по времени
    • измерение температур любым количеством датчиков DS1b20
    • установку всех временных констант через Интернет по протоколу MQTT (смартфон, умный дом)
    • установку уровня освещенности включения досветки через Интернет
    • сохранение в памяти всех полученных констант
    • отправку информации обо всех показателях на брокер MQTT (смартфон, умный дом)
    На компьютере это выглядит так:
    Snap2.jpg

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

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

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

    Все сделано на железе, описанном в начале темы.
     
    Последнее редактирование: 6 июл 2017
  7. ИгорьК

    ИгорьК Гуру

    Последнее редактирование: 5 июл 2017
  8. ИгорьК

    ИгорьК Гуру

    Схема устройства:
    garden22.jpg

    upload_2017-12-16_13-43-31.png
     
    Последнее редактирование: 16 дек 2017