Подбор оборудования для автополива

Добрый день.
По просьбе супруги автоматизирую оранжерею. Требуется система автополива.
В ветке по подбору оборудования для теплиц:

Вы давали ссылку на сайт с датчиком влажности почвы:

Закупился такими датчиками на Али, подскажите как можно снимать показания с данного датчика?
Также подскажите, с помощью каких реле лучше всего управлять несколькими насосами типа:

Здравствуйте. В то время, когда мы использовали датчики влажности почвы, мы использовали вот такие:

И то мы “лажанули” и заказали не те, которые были нужны (без протокола RS-485).
Но они вполне себе работали. Была только проблема с калибровкой.
На данный момент мы поливаем по времени, а необходимость полива определяем вручную. Сценарий, по времени, может быть разный, в зависимости от растений и необходимой частоты. Мы поливаем по 10мин каждые 2 часа в дневное время. Но у нас есть дренаж. Возможно вам будет достаточно по чуть-чуть раз в день.
Для включения насоса используем модули WB-MR6CU v.2. Но можете посмотреть и подобрать что-то более подходящее из релейных модулей.
сценарий для полива по времени (может немного кривоватый в плане описания, но сделан на основе другого сценария и работает, а это, лично для меня, самое главное):

//Pump1.js (внести в название правила)
//'use strict';
var grow_box = "1"; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств
log.info("light_"+grow_box+"START######################"); //Это лог.

var dimmer_relay = "wb-mr6cu_22/K1"; //CHANGE_ME! устройство-реле питания диммера (доработка, используемй диммер подтягивает свой вход к VCC)

var ps = new PersistentStorage("storage_"+grow_box, {global: true});// Определим объект-хранилище.

var pumpStartTime; //Время начала "полива"
var pumpStopTime; //Время конца "полива"
setTimeVariable();

//Элементы виртуального устройства
//управления
var deviceCells = { 
  
  //Начало рассвета hh:mm
  "Pump (start) time": {
    type: "text",
    readonly: false,
    value: ps["pump_start_time"],
  },
  //Длительность рассвета
  "Pump duration": {
    type: "text",
    readonly: false,
    value: ps["sun_start_duration"],
  },

  pumpON : {
          type : "switch",
          value : false,
  },   

  pumpOFF : {
          type : "switch",
          value : false,
  },
};


//Создадим виртуальное устройство и добавим в него элементы 
  defineVirtualDevice("pump_"+grow_box, {
    title:"Pump "+grow_box,
    cells: deviceCells
  });

defineRule("Sunraise start time change", { //название правила 
whenChanged: "pump_"+grow_box+"/Pump (start) time", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("pump_"+grow_box+"/Pump start time ", newValue); //Это лог. Он попадает в /var/log/messages
    ps["pump_start_time"] = newValue;
    setTimeVariable();
  }
});

defineRule("Sunraise duration change", { //название правила 
whenChanged: "pump_"+grow_box+"/Pump duration", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("pump_"+grow_box+"/Pump duration", newValue); //Это лог. Он попадает в /var/log/messages
    ps["sun_start_duration"] = newValue;
    setTimeVariable();
  }
});

defineRule("dayProcess change", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpOFF",
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if (newValue){ //Включаем "день"
      dev["pump_"+grow_box+"/pumpON"] = false; 
    }
  }
});

defineRule("dayProcess change off", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpON", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if ((dev["pump_"+grow_box]["pumpON"] == true)){ 
      dev["pump_"+grow_box+"/pumpOFF"] = false; 
    }
  }
});

//*Дополнение для реле диммера

defineRule("dimmer_relay_on", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpON", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
  if ((dev["pump_"+grow_box]["pumpON"] == true)){ 
    dev[dimmer_relay] = true; //включаем реле
  }
}
});  
defineRule("dimmer_relay_off", { //название правила 
whenChanged:"pump_"+grow_box+"/pumpON", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
   if ((dev["pump_"+grow_box]["pumpON"] == false)){ 
    dev[dimmer_relay] = false;
  }
}
});

//*Конец дополнения

defineRule("cron minute timer", { //Просто задание, которое выполняется каждую минуту
  when: cron("00 * * * * *"),
  then: function () {
    //log.info(grow_box, "cron timer executed! DEBUG ONLY.");
    d = new Date(); //Текущее время
    //pumpStartTime
    if ((dev["pump_"+grow_box]["pumpON"]==false) && (d > pumpStartTime) && (d<pumpStopTime)){
      log.info(grow_box, "cron timer executed! Sunraise process START", "pumpStartTime",pumpStartTime,"pumpStopTime",pumpStopTime);
      dev["pump_"+grow_box]["pumpON"] = true;
    }
    //dayProcess
    if ((dev["pump_"+grow_box]["pumpOFF"]==false) && (d > pumpStopTime)){
      log.info(grow_box, "cron timer executed! DAY process START","pumpStopTime",pumpStopTime);
      dev["pump_"+grow_box]["pumpOFF"] = true;
    }
  }
});

defineRule("cron day timer", { //Просто задание, которое выполняется раз в сутки и меняет дату в переменных на текущую.
  when: cron("01 00 00 * * *"),
  then: function () {
    setTimeVariable();
  }
});

function string_to_time(srcString) { 
  //log.info("string_to_time_"+grow_box, srcString)
  var d = new Date();
  var datetime = new Date(d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()+'T' + srcString + 'Z');
  datetime.setMinutes(datetime.getMinutes() + datetime.getTimezoneOffset());//Приведем к локальному:
  return datetime; 
};


function setTimeVariable() { 
  pumpStartTime = string_to_time(ps["pump_start_time"]); 
  pumpStopTime = new Date(pumpStartTime);
  pumpStopTime.setMinutes(pumpStopTime.getMinutes() + parseInt(ps["sun_start_duration"])); 
};


defineRule("SunRaise_starter", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpON",
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("pump_"+grow_box+" pumpON function", newValue, devName, cellName); //Это лог.
    if (newValue){
      dura = (pumpStopTime - pumpStartTime)/1000; //время в секундах
	  log.info("pump_"+grow_box+" pumpON", "dura", dura); //Это лог.
      startTicker(grow_box+"raiseTicker", 1000); //Запуск таймера, отрабатывает раз в секунду.
    } else {
      timers[grow_box+"raiseTicker"].stop(); 
      log.info("pump_"+grow_box+"Ticker STOP sunraise");
    }
  }
});

Получится такого плана штука:
Screenshot_1
Время начала (start) вводится вручную ввиде hh:mm (или h:mm)
Продолжительность (duration) вводится просто минутами.

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

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

1 Like

Добрый день. По поводу датчиков, если у вас не более 4х и не задействованы аналоговые и дискретный входы на контроллере, то можете подключить к ним, иначе Модуль аналогового ввода WB-MAI6.

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

На датчике есть цифровой и аналоговый выходы, куда их подключить - на разобрался.
пробовал подключить на порты W1 и W2 - но никаких показаний на контроллере не увидел.
Может надо подключать аналоговый выход датчика к порту А1 контроллера?

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

Я сам использую вот такие: https://aliexpress.ru/item/32889929664.html
Пока тестово - но работают неплохо.

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

Возникли новые:

  1. Если датчики будут отстоят от контроллера на расстоянии примерно 25 метров, можно ли подать на них питание 5В непосредственно от контроллера по экранированной витой паре? А по соседним парам в этом же кабеле вернуть показания с данных датчиков? Или лучше поставить отдельный источник питания 5В рядом с датчиками? Стабильный ли будет сигнал с датчиков на таком расстоянии?
  2. Если параметры насосов таковы: напряжение 12 В, мощность 4 Вт, можно ли управлять ими с помощью модуля WBIO-DO-SSR-8?
  3. Если можно, то с помощью какого кабеля лучше подать напряжение на насос, если учесть что расстояние между модулем WBIO-DO-SSR-8 и насосом будет пример но 25 метров? Можно ли использовать для этого экранированную витую пару?
  1. Можно.
  2. Максимальный коммутируемый ток модуля 400 мА. При ваших параметрах ток насоса 333 мА. Т.е. в пределах нормы. Но у насоса может быть высокий пусковой ток, существенно превышающий 400 мА. Я бы не рисковал, использовал что-то более мощное.
  3. Хорошая статья на тему, в конце таблица с ответом на ваш вопрос: Диапазон передачи мощности - Delta

Если насосы бесщеточные типа
Screenshot_20230411_112401
то можно, у них пускового тока по сути нет.
У меня они успешно коммутируются вообще полевиками в sot23 корпусе.

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

1 Like

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.