автополив

tomato
Offline
Зарегистрирован: 21.07.2016

Всем привет!

Я очередной новичок :)

Нужна помощь и советы.

 

Таких проектов, как автополив много, но не все понятно. Датчик влажности почвы подвержен электролизу. Цитата: “Срок жизни сенсора можно значительно увеличить, если подключить питание к нему через силовой ключ. Когда надо получить данные — включаем питание сенсора, снимаем показания и тут же выключаем питание.”

Вопрос: я разве нельзя включать/выключать его без ключа? Ключ вроде как нужен только если питание внешнее и мощнее, чем может дать ардуина. Но датчик влажности на прямую подключается без проблем.

Araris
Offline
Зарегистрирован: 09.11.2012

Есть на этом форуме тема http://arduino.ru/forum/apparatnye-voprosy/pomogite-vybrat-sensor-vody?page=1#comment-175658 , если не читали - рекомендую. Особо обратите внимание на http://arduino.ru/forum/apparatnye-voprosy/pomogite-vybrat-sensor-vody#comment-39196 , там и код, и простейшая схема датчика типа "два гвоздя".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

tomato пишет:

Я очередной новичок :)

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

Вот, например, Вы пишете ...

tomato пишет:

Но датчик влажности на прямую подключается без проблем.

Я не знаю, что у Вас за датчик. Если, например, вот такой. То у него ток 50mA, а у ноги Ардуины - максимум 40.

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

А когда пишут "подключить питание к нему через силовой ключ" имеют в виду "не подавать питание постоянно", а уж какое Вы выберете техническое решение - дело Ваше. Нога ардуины - тоже разновидность силового ключа. Если Вам хватает её тока - подключайте на здоровье.

tomato
Offline
Зарегистрирован: 21.07.2016

Araris пишет:

Есть на этом форуме тема http://arduino.ru/forum/apparatnye-voprosy/pomogite-vybrat-sensor-vody?page=1#comment-175658 , если не читали - рекомендую. Особо обратите внимание на http://arduino.ru/forum/apparatnye-voprosy/pomogite-vybrat-sensor-vody#comment-39196 , там и код, и простейшая схема датчика типа "два гвоздя".

Спасибо! Читал это и многое другое. Вот примерный вариант:
http://wiki.amperka.ru/projects:irrigator
Цитата выше была от туда. Но вопрос про ключ остался. Вот еще цитата: "Подавать напряжение вовремя несложно - +5 от датчика подключаем не к +5 на плату, а на D1, например и перед чтением (за полсекудны, например) выдаём туда HIGH, ну, а после чтения - LOW." 

Как я понимаю, в этом случае можно без ключа? Или тогда не хватит мощности порта? Если там 40мА, а датчик потребляет 50мА, то конечно лучше через ключ.

Araris
Offline
Зарегистрирован: 09.11.2012

Что у Вас за датчик ?

tomato
Offline
Зарегистрирован: 21.07.2016

Вот такой:
http://www.ebay.com/itm/222185747871?_trksid=p2060353.m2749.l2649&ssPage...

Но можно купить любой другой, при необходимости. 

Как я понимаю, это простой аналоговый "сенсор", как два гвоздя :) и подсоединяется к аналоговому входу. Но там еще есть отделная плата с цифровым выходом и переменным резистором для установки порога. При таком подключении электролиз тоже будет или нет?

Araris
Offline
Зарегистрирован: 09.11.2012

Указанный Вами датчик потрясно выглядит, украшен светодиодами, компаратором и т.д. Но, если речь идёт не о макетно/выставочно-презентационном проекте, то я бы предпочёл систему "два гвоздя" ))). Цифровой выход (и вся связанная с ним начинка) Вам врядли понадобится, фольгированный пластик в почве долго не проживёт, ну и прочие моменты, в Интернетах, да и тут на форуме, немало об этом писано.

tomato
Offline
Зарегистрирован: 21.07.2016

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

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Закопай этот датчик на огороде поглубже и забудь.

Поливай по таймеру.

tomato
Offline
Зарегистрирован: 21.07.2016

по таймеру не получится. У меня огород на балконе в горшках. И сильно зависит от погоды. Иногда нужно поливать каждый час, иногда раз в день. В горшках очень быстро все меняется. Помидоры могут много воды выпить, а могут мало. Без датчика влажности никак.

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

dmitron1036
Offline
Зарегистрирован: 10.01.2016

примерно те же проблемы только в открытом грунте, поэтому размыты на недели.+ удобрил - получи больше влажность.

Горшководы АУУУ! где вы? как иррегатор амперки работает? 

tomato
Offline
Зарегистрирован: 21.07.2016

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

С простыми комнатными растениями все на много проще и можно только по таймеру поливать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, никто ведь не заставляет ограничиваться только одним сенсором. И никто не мешает сделать переключатель на несколько видов растений.

tomato
Offline
Зарегистрирован: 21.07.2016

Я вам больше скажу, при такой цене на ардуино и сенсоры, я сразу решил делать отдельный комплект на каждый горшок :)

dmitron1036
Offline
Зарегистрирован: 10.01.2016

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

влажность 70 процентов....летом 75 а осенью 80 - ну это прямо фантастика.

С таким то датчиком ваги...я смотрел на промышленные..о ужас - они такие же. Как ими меряют - что меряют - не пойму.

------

Подведём итог: ты не на том фруме интересуешся этими датчиками. Иди в форум проф. тепличных хозяйств - там действительно и датчики с компьютерами и гигантские помидоры.

Я вот интересовался....тем же вопросом - глухо. может у тебя получится.

Будет информация - пиши. У меня от этого датчика пока одно разочарование.

 

tomato
Offline
Зарегистрирован: 21.07.2016

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

Так же важно горшок больше объемом. Тогда перепады будут меньше. Есть высокие горшки с подводом воды снизу. Это тоже дает некий запас растению.

tomato
Offline
Зарегистрирован: 21.07.2016

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

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Золота туда....

tomato
Offline
Зарегистрирован: 21.07.2016

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

И второй вопрос: при подключении USB все работает нормально, но если отключить, то происходит пауза и ардуино перестает управлять. Если снова воткнуть USB, то программа продолжает работать. Если закомментировать строку Serial.println(sensorValue); то все работает нормально и без USB. 

Я как новичок не могу понять причину. Наверное, если нет подключения по USB, то Serial.println ставит на паузу все? Как этого избежать?

Мне не нравится, что везде используется delay, но пока не знаю, как сделать иначе.

 
Вот скетч:
int sensorPin = A0;             //назначаем номер порта для аналогово сенсора влажности
int sensorValue = 0;            //объявляем переменную для аналогово сенсора влажности
int sensorValueRun = 70;       //объявляем переменную для порога срабатываения аналогово сенсора влажности
int sensorDataDelay = 2000;     //объявляем переменную для времени стабилизации даных сенсора влажности
int sensorTimeDelay = 30000;    //объявляем переменную для интервала опроса сенсора влажности
int pumpTimeRun = 10000;        //объявляем переменную для времени работы Pump
int pumpTimeDelay = 30000;      //объявляем переменную для паузы работы Pump между порциями в цикле
int pumpTimeEndDelay = 60000;   //объявляем переменную для паузы после цикла для впитывания воды
int iloop = 5;                  //объявляем переменную для количества циклов включения Pump


void setup()
{
  Serial.begin(115200);   //устанавливаем скороcть Serial порта
  pinMode(13, OUTPUT);    //устанавливаем порт на выход (Pump)
  pinMode(12, OUTPUT);    //устанавливаем порт на выход (Питание Датчика)
}

void loop()
{
  digitalWrite(12, HIGH);                                   //включаем питание датчика влажности
  delay(sensorDataDelay);                                   //пауза для стабилизации данных
  sensorValue = analogRead(sensorPin);                      //считываем показания датчика влажности
  Serial.println(sensorValue);                              //печатаем показания датчика влажности в Serial Monitor
  delay(500);                                               //пауза 0,5сек

  if (sensorValue > sensorValueRun)                         //если значение больше заданного, то:
  {
    digitalWrite(12, LOW);                                  //выключаем питание датчика влажности
    for (int i = 1; i <= iloop; i++)                        //запускаем цикл работы помпы
    {
      digitalWrite(13, HIGH);                               //включаем Pump
      delay(pumpTimeRun);                                   //время работы Pump
      digitalWrite(13, LOW);                                //выключаем Pump
      delay(pumpTimeDelay);                                 //пауза работы Pump внутри цикла
    }
    delay(pumpTimeEndDelay);                                //пауза после цикла для впитывания воды
  }
  else digitalWrite(13, LOW);                               //иначе выключаем Pump
  digitalWrite(12, LOW);                                    //выключаем питание датчика влажности
  delay(sensorTimeDelay);                                   //пауза для интервала опроса сенсора влажности
}

 

dmitron1036
Offline
Зарегистрирован: 10.01.2016

вместо delay есть millis() и RTC модуль.

Про влияние USB на работу ардуины - можешь диссертацию написать.

Питание на датчик влажности постоянно подаёшь? следы электролиза есть?

tomato
Offline
Зарегистрирован: 21.07.2016

Спасибо за ответ.

В скетче видно, что питание подается только за две секунды до измерения. Примерно раз в 40 сек. Следов электролиза пока не видно. 

Но уже пришли графитовые старжни, возможно их поставлю позже.

На счет USB не знаю, но факт такой есть. Программа почему то от этого зависит, если не закоментировать строку Serial.println

tomato
Offline
Зарегистрирован: 21.07.2016

Уточню на счет Serial.println, если даже подключено USB, но не активировано окно Сериал Монитора в IDE, то программа останавливается до тех пор, пока не откроется окно Сериал Монитора. 

Кто знает почему так и как решить это?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Очевидных решений 2:

1. Удалить Serial.println.

2. Открыть терминальное окно.

 

Действительно:

- есть труба,

- если один конец заткнуть, а с другого что-то пихать, труба забивается,

- если либо открыть один конец, либо нимчего не пихать с другого - все нормально,

Как решить проблему?

 

PS. А "почему так происходит" - смотрите исходники Serial. Кстати, возможно, решение есть (например, аварийный клапан сбоку трубы, который нужно открыть) и искать его нужно там же - в исходниках.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Serial тебе нужен для отладки. Сейчас все настроил так закоменти Serial, это самый простой способ.

либо использовать конструкцию 

#define DEBUG

...
...
...
...

#if (DEBUG)
  Serial.println(sensorValue); 
#endif

хотя очень странно, на меге и уно у меня рабортает без каких либо танцев с бубном. А версия IDE какая?

tomato
Offline
Зарегистрирован: 21.07.2016

Спасибо за ответ :)

Сегодня специально заморочился и поискал инфу про это. Не смог найти. Полно подобного:
http://arduino.ua/ru/prog/

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

Так значит эта команда: Serial.println останавливает программу в моем случае?

tomato
Offline
Зарегистрирован: 21.07.2016

Andrey12 пишет:

Serial тебе нужен для отладки. Сейчас все настроил так закоменти Serial, это самый простой способ.

либо использовать конструкцию 

#define DEBUG

...
...
...
...

#if (DEBUG)
  Serial.println(sensorValue); 
#endif

хотя очень странно, на меге и уно у меня рабортает без каких либо танцев с бубном. А версия IDE какая?

Версия последняя 1.6.10 вроде

Arduino nano:

http://www.ebay.com/itm/152164755207?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

tomato пишет:

Так значит эта команда: Serial.println останавливает программу в моем случае?

Так как подключение отключение вывода в Serial влияет я и предположил что виноват или Serial.println или Serial.begin(115200);

попробуй их отключить. а там видно будет они или нет.

tomato
Offline
Зарегистрирован: 21.07.2016

Спасибо!

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Проблема ...экзотическая

работаю с мегой, уно, нано....ни разу не сталкивался с зависанием модуля из-за "не открытого окна serial monitor". Работает с USB. Работает без USB. Работает с гипертерминалом(можешь попробовать).

Serial monitor перезагружает модуль при открывании.

Может у тебя проблема с запуском модуля? (Reset всм.)

tomato
Offline
Зарегистрирован: 21.07.2016

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

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

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

У меня iMac, может в этом причина?

dmitron1036
Offline
Зарегистрирован: 10.01.2016

1) светодиодик на d13(или другой если этот занят) заставь моргать раз в секунду во время выполнения программы (проверенный метод).

2) подключи к windows , посмотри в гипертерминале

3) совсем без usb работает?

tomato
Offline
Зарегистрирован: 21.07.2016

на счет светодиода, как раз собирался так сделать :)

Спасибо!

tomato
Offline
Зарегистрирован: 21.07.2016

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

Проблема в том, что если датчик включается на 1 сек для замера и затем пауза 30 сек, то показания плывут в сторону уменьшения. От 80 вниз. Если включать сенсор на 5сек и пауза 3 сек, то показания наоборот плывут вверх от 80. Разумеется проверял в одно время после полива. Тут не только больщой разброс по средним числам, а еще и направление меняется. И пока не удается подобрать что то похожее на реальную картину (время включения датчика и пауза между замерами). Из-за этого невозмочно выставить порог включение полива. Что с этим делать не понятно. С гвоздями тоже самое, только цифры другие. Прям, как в квантовой механие, когда измерение влияет на результат :)

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

tomato
Offline
Зарегистрирован: 21.07.2016

И еще вопрос: пытаюсь заменить delay на millis. Пишут, что возвращаемое число переполнится (сбросится в 0) спустя приблизительно 50 дней. В коде от текущего времени будет вычитаться прошлое время, и когда произойдет сброс на 0, то нарушится логика программы. Так как прошлое время будет больше настояшего. Как этого избежать? 

Кажется разобрался. Правильно ли понимаю, что при использовании переменной unsigned long, вопрос решиается сам собой?

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

tomato пишет:

И еще вопрос: пытаюсь заменить delay на millis. Пишут, что возвращаемое число переполнится (сбросится в 0) спустя приблизительно 50 дней. В коде от текущего времени будет вычитаться прошлое время, и когда произойдет сброс на 0, то нарушится логика программы. Так как прошлое время будет больше настояшего. Как этого избежать? 

Кажется разобрался. Правильно ли понимаю, что при использовании переменной unsigned long, вопрос решиается сам собой?

нет сам собой не решится, но и проблема не так страшна. ничего не рушится.

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

Можно добавить условие что если прошлое время больше настоящего то прошлое равно настояшему и все. 

tomato
Offline
Зарегистрирован: 21.07.2016

Спасибо! Уже провел эксперимент и выяснил, что все-таки вопрос решается переменной unsigned long.

"Переменные типа unsigned long, в отличие от обычного long, хранят только положительные числа в диапазоне от 0 до 4 294 967 295 "

Например, если от 5 отнять 4 294 967 291, то получиться 10. То есть не будет отрицательных значений. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

tomato пишет:

Кажется разобрался. Правильно ли понимаю, что при использовании переменной unsigned long, вопрос решиается сам собой?

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

При правильном программировании проблема не возникает вовсе. Причём нет никакой разницы использовать unsigned long или просто long - проблема всё равно не возникакает. Пример правильного программирования.

Однако, если в нём строку

if(currentMillis - previousMillis > interval) {

заменить на

 if(currentMillis > previousMillis + interval) {

то проблема возникнет в полный рост.

Почему? Внимательно изучите правила арифметики в дополнительном коде. Материалов навалом.

tomato
Offline
Зарегистрирован: 21.07.2016

Спасибо за ответ, уже разобрался :)

tomato
Offline
Зарегистрирован: 21.07.2016

Итак, после замены delay на millis() все работает правильно и от сериал монитора не зависит. Так же заменил тип переменных int на unsigned long.

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

Всем спасибо за помощь!

Вот простой скетч, если кто из новичков захочет повторить:

unsigned long sensorPin = A0;             //назначаем номер порта для аналогово сенсора влажности
unsigned long sensorValue = 0;            //объявляем переменную для аналогово сенсора влажности
unsigned long sensorValueRun = 30;       //объявляем переменную для порога срабатываения аналогово сенсора влажности
unsigned long sensorDataDelay = 500;      //объявляем переменную для времени стабилизации даных сенсора влажности
unsigned long sensorTimeDelay = 30000;    //объявляем переменную для интервала опроса сенсора влажности
unsigned long pumpTimeRun = 10000;        //объявляем переменную для времени работы Pump
unsigned long pumpTimeDelay = 30000;      //объявляем переменную для паузы работы Pump между порциями в цикле
unsigned long pumpTimeEndDelay = 180000;  //объявляем переменную для паузы после цикла для впитывания воды
unsigned long iloop = 5;                  //объявляем переменную для количества циклов включения Pump
unsigned long currentTime;                //объявляем переменную для текущего времени
unsigned long previousTime;               //объявляем переменную для прошлого времени


void setup()
{
  Serial.begin(115200);   //устанавливаем скороcть Serial порта
  pinMode(13, OUTPUT);    //устанавливаем порт на выход (Pump)
  pinMode(12, OUTPUT);    //устанавливаем порт на выход (Питание Датчика влажности)
  Serial.println("Automatic Watering System ver.1");  //печатаем "Automatic Watering System ver.1" в Serial Monitor
}

void loop()
{
  digitalWrite(12, HIGH);                                   //включаем питание датчика влажности
  delay(sensorDataDelay);                                   //пауза для стабилизации данных
  sensorValue = analogRead(sensorPin);                      //считываем показания датчика влажности
  Serial.println(sensorValue);                              //печатаем показания датчика влажности в Serial Monitor

  if (sensorValue > sensorValueRun)                         //если значение больше заданного, то:
  {
    digitalWrite(12, LOW);                                  //выключаем питание датчика влажности
    for (int i = 1; i <= iloop; i++)                        //запускаем цикл работы помпы
    {
      digitalWrite(13, HIGH);                               //включаем Pump
      currentTime = millis();                               //присваиваем переменной текущее время из таймера
      previousTime = currentTime;                           //присваиваем прошлому времени значение из текущего времени

      Serial.print("Pump ON: ");                            //печатаем "Pump ON: в Serial Monitor
      Serial.println(i);

      while (currentTime - previousTime < pumpTimeRun)      //время работы Pump внутри цикла
      {
        currentTime = millis();                             //присваиваем переменной текущее время из таймера
      }
      digitalWrite(13, LOW);                                //выключаем Pump
      currentTime = millis();                               //присваиваем переменной текущее время из таймера
      previousTime = currentTime;                           //присваиваем прошлому времени значение из текущего времени

      Serial.print("Pump OFF: ");                           //печатаем "Pump OFF: в Serial Monitor
      Serial.println(i);

      while (currentTime - previousTime < pumpTimeDelay)    //пауза работы Pump внутри цикла
      {
        currentTime = millis();                             //присваиваем переменной текущее время из таймера
      }
    }
    currentTime = millis();                                 //присваиваем переменной текущее время из таймера
    previousTime = currentTime;                             //присваиваем прошлому времени значение из текущего времени

    Serial.print("Waiting For Absorption: ");                  //печатаем "Waiting For Absorption: в Serial Monitor
    Serial.println(pumpTimeEndDelay);

    while (currentTime - previousTime < pumpTimeEndDelay)   //пауза после цикла для впитывания воды
    {
      currentTime = millis();                               //присваиваем переменной текущее время из таймера
    }
  }
  else digitalWrite(13, LOW);                               //иначе выключаем Pump
  digitalWrite(12, LOW);                                    //выключаем питание датчика влажности
  currentTime = millis();                                   //присваиваем переменной текущее время из таймера
  previousTime = currentTime;                               //присваиваем прошлому времени значение из текущего времени
  
  while (currentTime - previousTime < sensorTimeDelay)      //пауза для интервала опроса сенсора влажности
  {
    currentTime = millis();                                 //присваиваем переменной текущее время из таймера
  }
}

 

tomato
Offline
Зарегистрирован: 21.07.2016

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

Например сухая почва 30, влажная от 0 до 5. Но в какой то момент, по непонятной причине этот диапазон может в корне поменяться. И теперь сухая почва 60, а влажная 40. Причем по графику может скакнуть резко вверх в любой момент. Как следствие, пару раз заливал горшок. Все вытекало через дренажные отверстия. Или наоборот, скакнуть вниз и земля пересыхает. Никакой логики не обнаружил. В разных горшках и растениях показания тоже разные. Это еще можно объяснить. Но такие скачки во всех происходят периодически. Так же иногда странно ведет себя график. После полива показания обычно уменьшаются, так как происходит впитывание влаги и сопротивления падает. Но иногда все с точность наоборот. После полива идет резкое падение и быстро поднимается обратно, причем на много выше, чем было при сухой почве, что совершенно не логично.

 

Использую вот такой датчик, только стержни графитовые 4мм диаметр и 5см длина.

http://www.ebay.com/itm/262434588858?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

 

Возможно причина в его “мозгах”, хотя там все элементарно вроде. Питание датчика включается на 2сек для замера. Хотя можно его все время держать под напряжением, так как графит не боится электролиза. Но не уверен, что растениям будет приятно и батарея быстрее разрядится.

 

У кого какие мысли на эту тему?

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Надо простой ёмкостной датчик влажности изобретать: http://www.compel.ru/2014/11/07/emkostnoy-datchik-priblizheniya-serii-cr-ot-autonics

тут в картинках: http://www.kit-e.ru/articles/sensor/2006_4_14.php

(S=100 мм кв. , d=1 мм => C=1нФ в воздухе)

Делаем автогенератор LC, измеряем его частоту.

Вот готовые:

http://www.it-lynx.com/equipment/capacitive-fuel-level-sensor-smartsensor/

http://www.elekitsorparts.com/product/gravity-analog-capacitive-soil-moisture-sensor-corrosion-resistant/

(5 минут терпения - и вы срисовали схему этого датчика, все номиналы видны)

tomato
Offline
Зарегистрирован: 21.07.2016

Прошло время …

 

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

 

И вот снова понадобилось сделать что то подобное, но с учетом новых возможностей. Подключил Blynk к esp8266, все работает по таймеру и в ручную. Взял емкостной датчик влажности почвы на пробу:

https://wiki.iarduino.ru/page/capacitive-soil-moisture-sensor/

 

Он простой, легко подключается. Пока собираю статистику. И обнаружил старые проблемы. Показания очень разные, как и раньше. Настроить по ним срабатывание полива пока невозможно. Например утром при показании 50 нужно включать, днем при 100, а вечером влажность растет в 1,5 раза даже без полива. На следующий день утром при 100 земля сухая, а после полива значения почти не поменялись. Толку от таких показаний никакого. В руках сенсор работает предсказуемо, а так же в воде и на суше. Все логично. Но в почве полный бардак с данными. 

 

Сейчас все работает по таймерам, которые выставлены опытным путем в течении дня. В дальнейшем можно привязать данные по температуре (солнце или пасмурно). Все управляется через Blynk, так было проще начать. Но теперь хочу сделать автономно, чтоб на Blynk только отчеты шли и ввод новых значений. То есть, чтоб автополив работал, если пропадет WiFi.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Мало статистических данных.
Возвращайся лет через 10...
Будем ждать.

Logik
Offline
Зарегистрирован: 05.08.2014

tomato пишет:

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

 

 

Такова уж специфика емкостных датчиков. А у той модели что по ссылке еще и вопрос к качеству и долговечности изоляции. Я тут показывал свое http://arduino.ru/forum/apparatnye-voprosy/uroven-vody-v-septike#comment-600113 . Сейчас ведро с керамзитом 

 

 

И показания датчиков уже не стоят как вкопанные,  а скачут. Подцепил был ESP, снял показания. Получил.

Четыре графика - 4 датчика по 2 на 2 ведра по ходу наполнения водой. Хотя датчики одинаковые - абсалютные значения раза в полтора различаются, особенно для состояния "сухо".

И это после усреднения по 8 замерам с паузами в десяток мксек. Причем различия между этими 8 замерами  не настолько большие. Получается усреднять надо с постоянной времени в 5-10сек. 

 

Это после фильтра Y(i+1)=Y(i)-Y(i)/8+X(i), Res=Y(i+1)/8

 

Вполне годно.

 

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

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

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

 

tomato
Offline
Зарегистрирован: 21.07.2016

Спасибо! 

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

 

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

 

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

 

P.S. Есть вот такой датчик, надо попробовать его прицепить на пластиковый горшок. 

https://amperka.ru/product/sensor-liquid-level-contactless

 
Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Если принять во внимание средние показатели эвапотранспирации для данного региона/культуры, можно без особых проблем настроить автополив на простой сезонный график. Грубо говоря, выливаем за период времени под каждый вид растений определенный объем воды. Например, газон - 20 литров на квадрат раз в неделю. Туи - 20 литров под дерево раз в месяц. Значимые индикаторы, влияющие на поправочные коэффициенты  - температура воздуха и дата (месяц). Дождь, сам по себе, не должен нарушать график полива. Обычная норма типичного дождя, по крайней мере в МО, крайне недостаточна для беззаботной жизни агрария. Более того, отключение полива во время легкого дождя может сильно попортить посадки. Для газона, например, это крайне нежелательно - будет слабая корневая система, здравствуйте сорняки.

Датчик интенсивности осадков нужен для внесения корректировок в расписание полива, если выпало более 20+мм осадков в течении суток. Вот тут возникает поле для творчества. В идеале, система должна фиксировать момент начала дождя, ставя на паузу текущие программы полива в ожидании развития событий. Если в течении определенного времени уровень осадков достиг предельного (20+мм), то обнуляем все расписания и ждем сигнала "подсохло". Если критический уровень не достигнут - продолжаем текущие программы полива, но, возможно, в сокращенном виде. 

Я делал 2 емкостных датчика в железной тубе из под вискаря. В доннышке тубы мелкие дырочки и геотекстиль (дренаж). В тубе мытый песок. На уровнях -50 и -150 установлены датчики. ЕСПшка читает показания и выдает приказы на контроллер полива. Проблема в том, что китайские емкостные датчики показывают всякую херь, но не то, что должны. Но общий смысл такой

PS: для "горшочников" можно не напрягаться)) Нам бы ваши проблемы))

Logik
Offline
Зарегистрирован: 05.08.2014

tomato пишет:

 

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

 

 

По таймеру я в прошлом году в горшках с землей помидоры растил.

 

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

tomato пишет:

 

P.S. Есть вот такой датчик, надо попробовать его прицепить на пластиковый горшок. 

https://amperka.ru/product/sensor-liquid-level-contactless

 

Я бы не стал с ним связываться. Его дискретный выход - ни о чем. Ведь по большому счету контролируемая среда (что в гидропонике, керамзит и вода, что почва) - смесь. Из многих компонент: 1.Твердая составляющей, в составе которой входит некоторое кол-во воды в разных формах:  химически связанной, смочившей поверхность, застрявшей в порах. 2.Жидкая, подвижная вода занимающая часть пространства в капилярах и промежутках между твердыми частицами 3. Воздух - газ, и тоже насыщенный водяными парами 4. корни растений, органика, говорят оно из воды на 90%.  И что покажет дискретный датчик? А ХЗ. Переход через некоторый порог, нам неизвестный. А надо следить за динамикой процесса. 

 

Logik
Offline
Зарегистрирован: 05.08.2014

Rumata пишет:

Например, газон - 20 литров на квадрат раз в неделю. Туи - 20 литров под дерево раз в месяц. 

Туи на куи... 

Ты вообще читал о чем тут? процитирую...

 

tomato пишет:

для овощей в горшках

 

 

 

Rumata пишет:

PS: для "горшочников" можно не напрягаться)) Нам бы ваши проблемы))

Вали к своим туям, не напрягайся о наших проблемах. У нас газон растет без полива под дождем.

ПС. Следующим явится кто-то и расскажет как он забор красит у газона и краска проливается на землю )))

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Logik пишет:

Вали к своим туям, не напрягайся о наших проблемах. У нас газон растет без полива под дождем.

Вау, бро! Вы свои горшочки из графинчика поливаете и думаете о вечной жизни)) Вот газон - это настоящий автополивный хардкор! Чуть что не так - запаришься потом репей выщипывать))

tomato
Offline
Зарегистрирован: 21.07.2016

Сделать абсолютно автономную систему надобности нет. Мне достаточно, чтоб неделю работала самостоятельно. Вода на балконе в большой пластиковой емкости, которую все-равно нужно заполнять в ручную. Так же опрыскивать иногда, подкармливать удобрениями, обрезать листья и тд. Но и собирать урожай тоже, так как черри сорт быстро созревает. А на неделю составить план по таймерам не проблема. Собственно через Blynk это можно корректировать в любую минуту по погоде. Поэтому сенсор влажности почвы пока больше, как дополнительный мониторинг и наблюдение. Если удастся по нему ориентироваться, то можно скомбинировать алгоритм с таймерами. 

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

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

tomato ,да просто настрой раз в неделю поливать на 1/5 емкости горшка и все у них будет зашибись