Умная теплица

s987654321
Offline
Зарегистрирован: 06.02.2015

измерительный сигнал нужно подавать двуполярный - синусоиду. Тогда датчик будет великолепно себя вести и не будет столь сильно деградировать. А так вы сделали ему "травилку" постоянным током = вот он у вас и вытавился.

Satboy
Offline
Зарегистрирован: 30.05.2014

Если не боитесь 220 вольт - то рекомендую проверенную годами вещь - электроклапан от стиральной машины...

Найти их за копейки можно в любом городе, достаточно найти тех, кто стиралки на запчасти распродает...   Я за 300 рублей купил 4клапанный от Brandt  - 4Wx180, с запиткой через реле

 

kriss
Offline
Зарегистрирован: 24.01.2014

Из своего опыта выращивания томатов - их достаточно поливать по таймеру раз в неделю.   Главное не   лить воду сверху.

У меня в грядке, на глубине 15см, проложена  ПП труба с маленьким отверстиями. Клапан открывает подачу воды на время, соответствующее  "жаркости" воздуха  вне парника.    И этого достаточно.   А ежели сверху почва замульчирована, то и "жаркостью" можно не  интересоваться. Еще надо учесть, что вода постепенно забивает солями всяческие   капельные трубочки.     Они непрактичны  без водоподготовки.     А измерение влажности  электродами  в парнике  считаю извращением - это чистые понты.         Все это  уже проходил:

www.forumhouse.ru/useralbums/9440/view

s987654321
Offline
Зарегистрирован: 06.02.2015

kriss пишет:
А измерение влажности  электродами  в парнике  считаю извращением - это чистые понты.

никаких понтов. Очень удобно. У меня, например, участок с приличным южным склоном. Подпочвенные воды очень сильно влияют на влажность почвы внутри теплицы. 

С таймером мне пришлось бы играться после каждого дождика.

а так - подсмотрел удачную конструкцию http://we.easyelectronics.ru/antonluba/prostoy-datchik-urovnya-vody-dlya-kolodca.html и на основе этого решения датчик работает вполне прилично.

dachnik
Offline
Зарегистрирован: 26.07.2013

Satboy пишет:

Если не боитесь 220 вольт - то рекомендую проверенную годами вещь - электроклапан от стиральной машины...

Найти их за копейки можно в любом городе, достаточно найти тех, кто стиралки на запчасти распродает...   Я за 300 рублей купил 4клапанный от Brandt  - 4Wx180, с запиткой через реле

Эти клапана рассчитаны на высокое давление, когда система на самотёке они бесполезны

Об этом в теме уже писали.

kriss
Offline
Зарегистрирован: 24.01.2014

s987654321 пишет:

kriss пишет:
А измерение влажности  электродами  в парнике  считаю извращением - это чистые понты.

никаких понтов. Очень удобно. У меня, например, участок с приличным южным склоном. Подпочвенные воды очень сильно влияют на влажность почвы внутри теплицы. 

С таймером мне пришлось бы играться после каждого дождика.

а так - подсмотрел удачную конструкцию http://we.easyelectronics.ru/antonluba/prostoy-datchik-urovnya-vody-dlya-kolodca.html и на основе этого решения датчик работает вполне прилично.

Согласен, что на открытой  и возвышенной грядке  влага быстрее накапливается и исчезает, но в парнике этот процесс очень инерционный  даже с подпочвенными водами.   Так что ритм полива в парнике от дождя   мало зависит. Если затяжные дожди можно просто разрывать цепь таймера.

Я контролирую влажность только при выращивании рассады  в боксе, потому что у рассады маленькие корни сильно зависят от влажности верхнего слоя почвы. А томат в парнике найдет воду ВСЕГДА-у него корни до 2хметров вглубь.    А кондуктометрические датчики уровня это  усложненный анахронизм по сравнению с герконом.

 

s987654321
Offline
Зарегистрирован: 06.02.2015

kriss пишет:
А кондуктометрические датчики уровня это  усложненный анахронизм по сравнению с герконом.

та не. Вы неправильно поняли.

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

neustupovn
Offline
Зарегистрирован: 17.01.2015

Добрый день.

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

dachnik
Offline
Зарегистрирован: 26.07.2013

neustupovn пишет:

Добрый день.

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

Кода пока нет, есть опробованные функции,

В ф-цию boolean drip_irrigation() в качестве аргументов передаём - (вкл или выкл полива, аналоговый пин датчика влажности земли, канал реле, мин влажность земли и макс влажность земли. функция  int h_pochva(int ch) берёт аргумент из ф-ции drip_irrigation  аналоговый пин.


void drip_irrigation(boolean on_off, int analog_pin, int ch_rele, int hum_min, int hum_max) {
 boolean i = EEPROM.read(on_off);
  if (i) { 
    int _min = EEPROM.read(hum_min);
    int _max = EEPROM.read(hum_max);
//    boolean val = 0;
    if (h_pochva(analog_pin) < _min){digitalWrite(ch_rele, LOW); }//val = 1; 
//      Serial.print("drip ch_rele="); Serial.print(ch_rele); Serial.print(val);}
    if (h_pochva(analog_pin) > _max){digitalWrite(ch_rele, HIGH);}// val = 0;
//      Serial.print("drip ch_rele="); Serial.print(ch_rele); Serial.print(val);}

  }
//функция преобразования аналогового значения влажности почвы в проценты влажности
byte h_pochva(int ch){
int val=analogRead(ch);
val =constrain(val, 200, 700);
val =map(val, 200, 700, 100, 0);
return val; //}

Резисторы в схеме нужны для подтяжки кнопок и датчиков. Номиналы для кнопок и DHT датчика 10кОм, для DS18b20 4,7кОм

Sim0012
Offline
Зарегистрирован: 26.02.2015

А можете дать часть кода которая работает с датчиками влажности почвы и релле?

neustupovn
Offline
Зарегистрирован: 17.01.2015

Всем привет. Я дома пока пробую вот такой код

[code]
 
const int dg = 11; //датчик влажности
const int dg2 = 12; //датчик влажности
const int dg3 = 13; //датчик влажности
const int nasos = 2; // реле насоса
const int rele = 14; // реле клапана полива
const int rele2 = 15; //  реле клапана полива
const int rele3 = 16; //  реле клапана полива
 
int dgS = 0;
int dgS1 = 0;
int dgS2 = 0;
 
void setup() { 
pinMode(nasos, OUTPUT);
pinMode(rele, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(dg, INPUT);
pinMode(dg2, INPUT);
pinMode(dg3, INPUT);
}
void loop(){
dgS = digitalRead(dg);
if (dgS == HIGH) { digitalWrite(nasos, LOW);
digitalWrite(rele, LOW);
 
else { digitalWrite(nasos, HIGH);
digitalWrite(rele, HIGH);}
 
// второй датчик
dgS1 = digitalRead(dg2);
if (dgS1 == HIGH) { digitalWrite(nasos, LOW);
digitalWrite(rele2, LOW);}
 
else { digitalWrite(nasos, HIGH);
digitalWrite(rele2, HIGH);}
// третий датчик
 
dgS2 = digitalRead(dg3);
if (dgS2 == HIGH) { digitalWrite(nasos, LOW);
digitalWrite(rele3, LOW);}
else { digitalWrite(nasos, HIGH);
digitalWrite(rele3, HIGH);}
}
 
[/code]
Код на три контура полива и один насос, при включении хотя бы одного контура одновременно включается насос.
Единственное у меня датчики влажности почему то наооборот работают, у всех когда влажно у меня по этим параметрам сухо, поэтому менял команды LOW и HIGH, датчик временно сделал самодельный из медной проволоки, и подсоединил к плате к с которой шел датчик, данные брал с цифрового выхода. 
bwn
Offline
Зарегистрирован: 25.08.2014

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

monah3000
Offline
Зарегистрирован: 23.02.2015

dachnik пишет:

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

Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.

dachnik
Offline
Зарегистрирован: 26.07.2013

monah3000 пишет:

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

Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.

Шток который держит актуатор? На саморезах по металу вроде ничего сложного... ну если надо фото то сделаю на выходных

 

monah3000
Offline
Зарегистрирован: 23.02.2015

Ну на фотке я так вроде расмотрел, сделайте фотки открытого и закрытого окна. А на сколько актуатор высовывается?

dachnik
Offline
Зарегистрирован: 26.07.2013

monah3000 пишет:

Ну на фотке я так вроде расмотрел, сделайте фотки открытого и закрытого окна. А на сколько актуатор высовывается?

Длину высовывания можно регулировать колёсиками(хз как их обозвать=) ) в коробке актуатора, которые нажимают концевые выключатели. Шток актуатора вылазит примерно на 80% длинны

bes666x13
Offline
Зарегистрирован: 28.03.2015

А я вот сейчас подумаыаю только над подобным!

Только совсем не разбираюсь в этом.

Вопросы для опытных банальные, но я даже в руках такие платы не держал.

Хотел бы спросить, что надо приборести для создания следующего "проекта".

Требования:

1)

2 разовый полив в определенное время, посредством открытия клапана, чтоб каждый шланг поливался одинаково. (например в 9.00 и 21.00 - независимо от влажности земли, т.к. датчик влажности установленный в одном месте - не может гарантировать что через 30 см уровень влажности будет такой же)

2)

- Открытие/закрытие 2 форточек по температуре внутри теплицы. Например чтоб при +30 градусах открылись обе форточки, при +25 одна из форточек закрывалась, при +20 закрывалась вторая форточка.

- Включение/отключение кулеров 4 шт.*120 мм на подачу воздуха, и вытягивание. (так кстати можно создать постоянный микроклимат, без открытия форточек, по крайней мере мне так кажется)

 

Что подскажите? С чего начать?

neustupovn
Offline
Зарегистрирован: 17.01.2015

А кто нибудь пробовал открывать дверь сервой, напримор такой

http://ru.aliexpress.com/item/Servos-Digital-MG996R-Servo-Metal-Gear-for...

Pyotr
Offline
Зарегистрирован: 12.03.2014

Мож кому понравятся мои варианты привода для фрамуг/дверей в теплице..

http://www.greentalk.ru/forum/blog/83/entry-573-sistema-ventilyatcii-dly...

bes666x13
Offline
Зарегистрирован: 28.03.2015

Общий вопрос по открытию дверерй/форточек, а как поступать с ситуацией, когда человек сам заходит в теплицу? Отключать привод? И насколько широко вообще открывать окно?

neustupovn
Offline
Зарегистрирован: 17.01.2015

я планирую, открывать дверь на определенное время по нажатию кнопки (например минуту). как поеду к родителям испытаю в действии. кнопки сделаю две, одна с наружи одна внутри

bes666x13
Offline
Зарегистрирован: 28.03.2015

neustupovn пишет:

я планирую, открывать дверь на определенное время по нажатию кнопки (например минуту). как поеду к родителям испытаю в действии. кнопки сделаю две, одна с наружи одна внутри

 

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

Я вижу решение в том чтоб системой рычагов - отталкивать дверь, т.е. толкатель не будет соеденяться жестко с дверью. 

Шток вышел - окно открылось, шток зашел - окно закрылось.

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

neustupovn
Offline
Зарегистрирован: 17.01.2015

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

dachnik
Offline
Зарегистрирован: 26.07.2013

[/quote]

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

Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.

[/quote]

 

Кстати в тему как открывать верхнии форточки, сфоткал на выставке домов у МЕГи:

Sim0012
Offline
Зарегистрирован: 26.02.2015

Ребят помогите немогу разобраться ... Пытаюсь сделать полив по 3 датчикам влажности почвы и 4 релле (1 для включения насоса) 

Вот так вот код работает более менее 

void setup()
{
  pinMode( 5 , OUTPUT);
   pinMode( 4 , OUTPUT);
   pinMode( 3 , OUTPUT);
   pinMode( 2 , OUTPUT);
}

 
void loop()
{
 
 digitalWrite(5,(analogRead(2) > 200));
 digitalWrite(2,(analogRead(2) > 200));
 digitalWrite(4,(analogRead(1) > 200));
  digitalWrite(2,(analogRead(1) > 200));
digitalWrite(3,(analogRead(3) > 200));
  digitalWrite(2,(analogRead(3) > 200));
 

  
}

А вот если вставлять его во весь код то както некорректо... Как правильнее будет написать?

#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
#include <dht11.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием



Time t; // Инициализация струк

int d, Counter=0;
dht11 sensor;

void setup()
{
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  //rtc.setDOW(7);        // Установка дня недели
  //rtc.setTime(14, 25, 00);  // Установка времени 10:59:10 
  //rtc.setDate(01, 03, 2015);   // Установка даты 20 июля 2013
  pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(1); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10)
  {
    display.setCursor(42,0);
    display.print("0");
    display.setCursor(48,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(42,0);
    display.print(t.hour);}
    display.setCursor(53,0);
    display.print(".");
    
    display.setCursor(68,0);
    display.print(".");
    
  if(int(t.min)<10){
    display.setCursor(57,0);
    display.print("0");
    display.setCursor(63,0);
    display.print(int(t.min)); // Вывод минут  
  }
  else{  
    display.setCursor(57,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(72, 0);
    display.print("0");
    display.setCursor(79, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(72, 0); 
    display.print((t.sec));} // Вывод секунд
    

//  display.setCursor(13,17);
  //display.print(rtc.getDateStr()); // Вывод даты
  sensor.read(6);
  display.setTextSize(1); // Установка набора символов
  display.setCursor(7, 0);
  display.print(sensor.temperature);
  display.setCursor(0, 0);
  display.print("С");
    
   display.setCursor(27, 0);
  display.print(sensor.humidity);
  display.setCursor(21, 0);
  display.print("%");
  display.setCursor(15, 37);
  display.print("Влаж.%");
  display.setCursor(60, 37);
  display.print(analogRead(3));
  display.setCursor(15, 27);
  display.print("Влаж.%");
  display.setCursor(60, 27);
  display.print(analogRead(2));
  display.setCursor(15, 17);
  display.print("Влаж.%");
  display.setCursor(60, 17);
  display.print(analogRead(1));
  
 
 digitalWrite(5,(analogRead(2) > 200));
 digitalWrite(2,(analogRead(2) > 200));
 digitalWrite(4,(analogRead(1) > 200));
  digitalWrite(2,(analogRead(1) > 200));
digitalWrite(3,(analogRead(3) > 200));
  digitalWrite(2,(analogRead(3) > 200));
 

 
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Почему analogRead(2)? Это мы читаем состояние цифрового пина D2, т.е. будет всегда или 0 или 1023.

пин 2 - это насос, остальные клапаны?

// это перед setup
#define PUMP_PIN 2 // пин для подключения реле и насоса
#define VALVE1_PIN 3 // пин для подключения реле и клапана
#define VALVE2_PIN 4  // эти синонимы в коде не используются, они для наглядности - как писать в будущем
#define VALVE3_PIN 5
const int soilTreshhold = 200; // порог включения/выключения по влажности почвы

// это вместо строк 109-114
checkSoil(A1, 3); // проверка влажности почвы на аналоговом пине A1, при  необходимости включаем реле на пине 3. 
checkSoil(A2, 4); 
checkSoil(A3, 5); 

// это после loop
void checkSoil(byte sensorPin, byte relayPin) // Входные значения - номер проверяемого пина и номер включаемого пина
{
  int soilMoisture = analogRead(sensorPin); // читаем влажность почвы
  if (soilMoisture < soilTreshhold)	// если сухо
    {
      digitalWrite(relayPin, HIGH);  //  открываем заданный клапан
      digitalWrite(PUMP_PIN, HIGH); // включаем насос
      // delay (20000); // отключение полива по времени (если датчик сгнил :)
      // stopPoliv();
    }
  else stopPoliv();
}

void stopPoliv(byte sensorPin) //  отключение полива
{
  // отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
  if(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW); 
  digitalWrite(relayPin, LOW);  // закрываем заданный клапан
}

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

"Почему analogRead(2)? Это мы читаем состояние цифрового пина D2" по чему цифрового если analogRead?

Да пин 2 это насос а остальные клапана

Sim0012
Offline
Зарегистрирован: 26.02.2015

Что-то у меня не сходиться всю голову уж сломал((( 

#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
#include <dht11.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием

#define PUMP_PIN 2 // пин для подключения реле и насоса
#define VALVE1_PIN 3 // пин для подключения реле и клапана
#define VALVE2_PIN 4  // эти синонимы в коде не используются, они для наглядности - как писать в будущем
#define VALVE3_PIN 5
const int soilTreshhold = 200; // порог включения/выключения по влажности почвы


Time t; // Инициализация струк

int d, Counter=0;
dht11 sensor;

void setup()
{
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  //rtc.setDOW(7);        // Установка дня недели
  //rtc.setTime(14, 25, 00);  // Установка времени 10:59:10 
  //rtc.setDate(01, 03, 2015);   // Установка даты 20 июля 2013
  pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(1); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10)
  {
    display.setCursor(42,0);
    display.print("0");
    display.setCursor(48,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(42,0);
    display.print(t.hour);}
    display.setCursor(53,0);
    display.print(".");
    
    display.setCursor(68,0);
    display.print(".");
    
  if(int(t.min)<10){
    display.setCursor(57,0);
    display.print("0");
    display.setCursor(63,0);
    display.print(int(t.min)); // Вывод минут  
  }
  else{  
    display.setCursor(57,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(72, 0);
    display.print("0");
    display.setCursor(79, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(72, 0); 
    display.print((t.sec));} // Вывод секунд
    

//  display.setCursor(13,17);
  //display.print(rtc.getDateStr()); // Вывод даты
  sensor.read(6);
  display.setTextSize(1); // Установка набора символов
  display.setCursor(7, 0);
  display.print(sensor.temperature);
  display.setCursor(0, 0);
  display.print("С");
    
   display.setCursor(27, 0);
  display.print(sensor.humidity);
  display.setCursor(21, 0);
  display.print("%");
  display.setCursor(15, 37);
  display.print("Влаж.%");
  display.setCursor(60, 37);
  display.print(analogRead(3));
  display.setCursor(15, 27);
  display.print("Влаж.%");
  display.setCursor(60, 27);
  display.print(analogRead(2));
  display.setCursor(15, 17);
  display.print("Влаж.%");
  display.setCursor(60, 17);
  display.print(analogRead(1));
  
 
checkSoil(A1, 3); // проверка влажности почвы на аналоговом пине A1, при  необходимости включаем реле на пине 3.
checkSoil(A2, 4);
checkSoil(A3, 5);
 

 
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
 
}
  void checkSoil(byte sensorPin, byte relayPin) // Входные значения - номер проверяемого пина и номер включаемого пина
{
  int soilMoisture = analogRead(sensorPin); // читаем влажность почвы
  if (soilMoisture < soilTreshhold)	// если сухо
    {
      digitalWrite(relayPin, HIGH);  //  открываем заданный клапан
      digitalWrite(PUMP_PIN, HIGH); // включаем насос
      // delay (20000); // отключение полива по времени (если датчик сгнил :)
      // stopPoliv();
    }
  else stopPoliv();
}

void stopPoliv(byte sensorPin) //  отключение полива
{
  // отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
  if(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW); 
  digitalWrite(relayPin, LOW);  // закрываем заданный клапан
}

 

 Говорит( Буду очень благодарен за помощь
sketch_apr25a.ino: In function 'void checkSoil(byte, byte)':
sketch_apr25a.ino:133:18: error: too few arguments to function 'void stopPoliv(byte)'
sketch_apr25a.ino:17:6: note: declared here
sketch_apr25a.ino: In function 'void stopPoliv(byte)':
sketch_apr25a.ino:142:16: error: 'relayPin' was not declared in this scope
Ошибка компиляции.
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
void stopPoliv() //  отключение полива
  digitalWrite(PUMP_PIN, LOW);  // закрываем заданный клапан

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Теперь вообще весело) При включение ардуино: включаються все релле(т.к почва сухая датчики не куда не воткнуты ), при замыкание датчиков влажности релле выключаються, но обратно включаеться только релле насоса при размыкание 3 датчика аналогово

 

 

#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
#include <dht11.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием

#define PUMP_PIN 2 // пин для подключения реле и насоса
#define VALVE1_PIN 3 // пин для подключения реле и клапана
#define VALVE2_PIN 4  // эти синонимы в коде не используются, они для наглядности - как писать в будущем
#define VALVE3_PIN 5
const int soilTreshhold = 200; // порог включения/выключения по влажности почвы


Time t; // Инициализация струк

int d, Counter=0;
dht11 sensor;

void setup()
{
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  //rtc.setDOW(7);        // Установка дня недели
  //rtc.setTime(14, 25, 00);  // Установка времени 10:59:10 
  //rtc.setDate(01, 03, 2015);   // Установка даты 20 июля 2013
  pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(1); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10)
  {
    display.setCursor(42,0);
    display.print("0");
    display.setCursor(48,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(42,0);
    display.print(t.hour);}
    display.setCursor(53,0);
    display.print(".");
    
    display.setCursor(68,0);
    display.print(".");
    
  if(int(t.min)<10){
    display.setCursor(57,0);
    display.print("0");
    display.setCursor(63,0);
    display.print(int(t.min)); // Вывод минут  
  }
  else{  
    display.setCursor(57,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(72, 0);
    display.print("0");
    display.setCursor(79, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(72, 0); 
    display.print((t.sec));} // Вывод секунд
    

//  display.setCursor(13,17);
  //display.print(rtc.getDateStr()); // Вывод даты
  sensor.read(6);
  display.setTextSize(1); // Установка набора символов
  display.setCursor(7, 0);
  display.print(sensor.temperature);
  display.setCursor(0, 0);
  display.print("С");
    
   display.setCursor(27, 0);
  display.print(sensor.humidity);
  display.setCursor(21, 0);
  display.print("%");
  display.setCursor(15, 37);
  display.print("Влаж.%");
  display.setCursor(60, 37);
  display.print(analogRead(3));
  display.setCursor(15, 27);
  display.print("Влаж.%");
  display.setCursor(60, 27);
  display.print(analogRead(2));
  display.setCursor(15, 17);
  display.print("Влаж.%");
  display.setCursor(60, 17);
  display.print(analogRead(1));
  
 
checkSoil(A1, 3); // проверка влажности почвы на аналоговом пине A1, при  необходимости включаем реле на пине 3.
checkSoil(A2, 4);
checkSoil(A3, 5);
 

 
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
 
}
  void checkSoil(byte sensorPin, byte relayPin) // Входные значения - номер проверяемого пина и номер включаемого пина
{
  int soilMoisture = analogRead(sensorPin); // читаем влажность почвы
  if (soilMoisture < soilTreshhold)	// если сухо
    {
      digitalWrite(relayPin, HIGH);  //  открываем заданный клапан
      digitalWrite(PUMP_PIN, HIGH); // включаем насос
      // delay (20000); // отключение полива по времени (если датчик сгнил :)
      // stopPoliv();
    }
  else stopPoliv();
}

void stopPoliv()//  отключение полива
{
  // отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
  if(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW); 
  digitalWrite(PUMP_PIN, LOW);  // закрываем заданный клапан
}

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Sim0012 пишет:

Теперь вообще весело) При включение ардуино: включаються все релле(т.к почва сухая датчики не куда не воткнуты ), при замыкание датчиков влажности релле выключаються, но обратно включаеться только релле насоса при размыкание 3 датчика аналогово

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

Sim0012
Offline
Зарегистрирован: 26.02.2015

Даже так не работает((( Может проблемма в 21,22,23 строках?

#define PUMP_PIN 2 // пин для подключения реле и насоса
#define VALVE1_PIN 3 // пин для подключения реле и клапана
#define VALVE2_PIN 4  // эти синонимы в коде не используются, они для наглядности - как писать в будущем
#define VALVE3_PIN 5
const int soilTreshhold = 200; // порог включения/выключения по влажности почвы


void setup()
{
 
 pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{

 
checkSoil(A1, 3); // проверка влажности почвы на аналоговом пине A1, при  необходимости включаем реле на пине 3.
checkSoil(A2, 4);
checkSoil(A3, 5);
 

 
 
 
}
  void checkSoil(byte sensorPin, byte relayPin) // Входные значения - номер проверяемого пина и номер включаемого пина
{
  int soilMoisture = analogRead(sensorPin); // читаем влажность почвы
  if (soilMoisture < soilTreshhold)	// если сухо
    {
      digitalWrite(relayPin, HIGH);  //  открываем заданный клапан
      digitalWrite(PUMP_PIN, HIGH); // включаем насос
      // delay (20000); // отключение полива по времени (если датчик сгнил :)
      // stopPoliv();
    }
  else stopPoliv();
}

void stopPoliv()//  отключение полива
{
  // отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
  if(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW); 
  digitalWrite(PUMP_PIN, LOW);  // закрываем заданный клапан
}

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Клапана выключаються но не включаються

 

Вот этот код полность работает

const int dg = 11; //датчик влажности
const int dg2 = 12; //датчик влажности
const int dg3 = 13; //датчик влажности
const int nasos = 2; // реле насоса
const int rele = 3; // реле клапана полива
const int rele2 = 4; //  реле клапана полива
const int rele3 = 5; //  реле клапана полива
 
int dgS = 0;
int dgS1 = 0;
int dgS2 = 0;
 
void setup() { 
pinMode(nasos, OUTPUT);
pinMode(rele, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(dg, INPUT);
pinMode(dg2, INPUT);
pinMode(dg3, INPUT);
}
void loop(){
dgS = digitalRead(dg);
if (dgS == HIGH) { digitalWrite(nasos, LOW);
digitalWrite(rele, LOW);
 
} 
else { digitalWrite(nasos, HIGH);
digitalWrite(rele, HIGH);}
 
// второй датчик
dgS1 = digitalRead(dg2);
if (dgS1 == HIGH) { digitalWrite(nasos, LOW);
digitalWrite(rele2, LOW);}
 
else { digitalWrite(nasos, HIGH);
digitalWrite(rele2, HIGH);}
// третий датчик
 
dgS2 = digitalRead(dg3);
if (dgS2 == HIGH) { digitalWrite(nasos, LOW);
digitalWrite(rele3, LOW);}
else { digitalWrite(nasos, HIGH);
digitalWrite(rele3, HIGH);}
}

 

 

Но он по цифровым выходам а мне по аналоговым надо( переделать чтото неполучаеться

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Вы после 32-й строчки:

int soilMoisture = analogRead(sensorPin); // читаем влажность почвы

вставьте Serial.print(soilMoisture); и посмотрите: меняется ли результат при помещении датчика в сухую и влажную почву. Навскидку - не срабатывает условие для включения клапанов.

Sim0012
Offline
Зарегистрирован: 26.02.2015

Да значения меняться при 200 реле  полива выключается, но обратно потом не выключается .   

А как сделать разный порог включения реле по влажности для каждого датчика?

Pyotr
Offline
Зарегистрирован: 12.03.2014

Sim0012 пишет:

Даже так не работает((( Может проблемма в 21,22,23 строках?

#define PUMP_PIN 2 // пин для подключения реле и насоса
#define VALVE1_PIN 3 // пин для подключения реле и клапана
#define VALVE2_PIN 4  // эти синонимы в коде не используются, они для наглядности - как писать в будущем
#define VALVE3_PIN 5
const int soilTreshhold = 200; // порог включения/выключения по влажности почвы


void setup()
{
 
 pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{

 
checkSoil(A1, 3); // проверка влажности почвы на аналоговом пине A1, при  необходимости включаем реле на пине 3.
checkSoil(A2, 4);
checkSoil(A3, 5);
 

 
 
 
}
  void checkSoil(byte sensorPin, byte relayPin) // Входные значения - номер проверяемого пина и номер включаемого пина
{
  int soilMoisture = analogRead(sensorPin); // читаем влажность почвы
  if (soilMoisture < soilTreshhold)	// если сухо
    {
      digitalWrite(relayPin, HIGH);  //  открываем заданный клапан
      digitalWrite(PUMP_PIN, HIGH); // включаем насос
      // delay (20000); // отключение полива по времени (если датчик сгнил :)
      // stopPoliv();
    }
  else stopPoliv();
}

void stopPoliv()//  отключение полива
{
  // отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
  if(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW); 
  digitalWrite(PUMP_PIN, LOW);  // закрываем заданный клапан
}

 

Не уверен, но попробуйте в 35 строке  digitalWrite(relayPin, HIGH);  заменить HIGT на глобальную переменную, например valveState=1; или объявленную внутри функции void checkSoil()   static valveState=1;

 

 

vladdon
Offline
Зарегистрирован: 03.05.2015

Здравствуйте!

Планирую запустить аналогичную систему.

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

И вопрос как освоить систему ардуино?

 

Спасибо!

Sim0012
Offline
Зарегистрирован: 26.02.2015

Pyotr пишет:

Не уверен, но попробуйте в 35 строке  digitalWrite(relayPin, HIGH);  заменить HIGT на глобальную переменную, например valveState=1; или объявленную внутри функции void checkSoil()   static valveState=1;

Вот так вот? 

#define PUMP_PIN 2 // пин для подключения реле и насоса
#define VALVE1_PIN 3 // пин для подключения реле и клапана
#define VALVE2_PIN 4  // эти синонимы в коде не используются, они для наглядности - как писать в будущем
#define VALVE3_PIN 5
const int soilTreshhold = 200; // порог включения/выключения по влажности почвы


void setup()
{
 
 pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{

 
checkSoil(A1, 3); // проверка влажности почвы на аналоговом пине A1, при  необходимости включаем реле на пине 3.
checkSoil(A2, 4);
checkSoil(A3, 5);
 

 
 
 
}
  void checkSoil(byte sensorPin, byte valveState) // Входные значения - номер проверяемого пина и номер включаемого пина
{
  int soilMoisture = analogRead(sensorPin); // читаем влажность почвы
  if (soilMoisture < soilTreshhold)	// если сухо
    {
      digitalWrite(valveState=1);  //  открываем заданный клапан
      digitalWrite(PUMP_PIN, HIGH); // включаем насос
      // delay (20000); // отключение полива по времени (если датчик сгнил :)
      // stopPoliv();
    }
  else stopPoliv();
}

void stopPoliv()//  отключение полива
{
  // отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
  if(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW); 
  if(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW); 
  digitalWrite(PUMP_PIN, LOW);  // закрываем заданный клапан
}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Набросал такой скетч, может подойдёт. Сам не проверял, но должен работать.

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {15, 16, 17};//А1,А2,А3
boolean stateValue[3];
const int soilTreshhold = 200;//или можно массив с разным значением для каждого датчика
unsigned long prevMillis;
 
void setup(){
  for(byte i=0; i++; i<4){
    pinMode(arrayPinOut[i], OUTPUT);
  }
} 
void loop(){
  if((millis() - prevMillis) > 60000){
    irrigatSoil(); //вызываем функцию каждую минуту, например.
    }
   //делаем что то ещё..
}
//-----------------------------------
void irrigatSoil(){
  static boolean statePump=0;
  byte i=0;
  for(i=0; i++; i<3){
    //измеряем влаж. каждым датчиком и откр/закр. нужный клапан
    stateValue[i] = soilTreshhold > analogRead(arrayPinSensor[i]);
    digitalWrite(arrayPinOut[i], stateValue[i]);
     }
  //если один из клапанов открыт-насос включен   
  statePump = stateValue[0] | stateValue[1] | stateValue[2];
  digitalWrite(arrayPinOut[3], statePump);
  prevMillis = millis();
}

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Sim0012 пишет:

А как сделать разный порог включения реле по влажности для каждого датчика?

Добавить во входных переменных функции checkSoil() третий параметр = "порог срабатывания". :)

void checkSoil(byte sensorPin=2, byte valveState=0, int soilTreshold=200)

Я бы еще добавил в код пропуски циклов или задержки на худой конец. Влажность ведь не меняется с частотой 8МГц.

Sim0012
Offline
Зарегистрирован: 26.02.2015

Pyotr пишет:

Набросал такой скетч, может подойдёт. Сам не проверял, но должен работать.

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {15, 16, 17};//А1,А2,А3
boolean stateValue[3];
const int soilTreshhold = 200;//или можно массив с разным значением для каждого датчика
unsigned long prevMillis;
 
void setup(){
  for(byte i=0; i++; i<4){
    pinMode(arrayPinOut[i], OUTPUT);
  }
} 
void loop(){
  if((millis() - prevMillis) > 60000){
    irrigatSoil(); //вызываем функцию каждую минуту, например.
    }
   //делаем что то ещё..
}
//-----------------------------------
void irrigatSoil(){
  static boolean statePump=0;
  byte i=0;
  for(i=0; i++; i<3){
    //измеряем влаж. каждым датчиком и откр/закр. нужный клапан
    stateValue[i] = soilTreshhold > analogRead(arrayPinSensor[i]);
    digitalWrite(arrayPinOut[i], stateValue[i]);
     }
  //если один из клапанов открыт-насос включен   
  statePump = stateValue[0] | stateValue[1] | stateValue[2];
  digitalWrite(arrayPinOut[3], statePump);
  prevMillis = millis();
}

 

 

 

Что-то вообще не работает((( 

Pyotr
Offline
Зарегистрирован: 12.03.2014

А если в цикле поменять местами условие (i<3) с инкрементом (i++) :) 

Код с новой, улучшеной формулой)

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {15, 16, 17};//А1,А2,А3
int soilTreshold[3] = {200, 300, 250};//массив с разным значением для каждого датчика

void setup(){
  //Serial.begin(9600); 
  for(byte i=0; i<4; i++){
  pinMode(arrayPinOut[i], OUTPUT);
  }
} 
void loop(){
  static unsigned long prevMillis = 0;
  if((millis() - prevMillis) > 60000){ //вызываем функцию каждую минуту, например.
    digitalWrite(arrayPinOut[3], irrigatSoil()); 
    prevMillis = millis();
    }
   //делаем что то ещё..
}
//-----------------------------------
boolean irrigatSoil(){
  static boolean stateValue[3] = {0, 0, 0};
  for(byte i=0; i<3; i++){
    //измеряем влаж. каждым датчиком и откр/закр. нужный клапан
    stateValue[i] = soilTreshold[i] > analogRead(arrayPinSensor[i]);
    digitalWrite(arrayPinOut[i], stateValue[i]);
    /*Serial.print("levelHum "); Serial.print(i+1);
    Serial.print(" = "); Serial.println(analogRead(arrayPinSensor[i]));
    Serial.print("stateValue "); Serial.print(i+1);
    Serial.print(" = "); Serial.println(stateValue[i]);*/
    }
  //если один из клапанов открыт-насос включен
  return stateValue[0] | stateValue[1] | stateValue[2];  
}

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Pyotr пишет:

 

Код с новой, улучшеной

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {15, 16, 17};//А1,А2,А3
int soilTreshold[3] = {200, 300, 250};//массив с разным значением для каждого датчика

void setup(){
  //Serial.begin(9600); 
  for(byte i=0; i<4; i++){
  pinMode(arrayPinOut[i], OUTPUT);
  }
} 
void loop(){
  static unsigned long prevMillis = 0;
  if((millis() - prevMillis) > 60000){ //вызываем функцию каждую минуту, например.
    digitalWrite(arrayPinOut[3], irrigatSoil()); 
    prevMillis = millis();
    }
   //делаем что то ещё..
}
//-----------------------------------
boolean irrigatSoil(){
  static boolean stateValue[3] = {0, 0, 0};
  for(byte i=0; i<3; i++){
    //измеряем влаж. каждым датчиком и откр/закр. нужный клапан
    stateValue[i] = soilTreshold[i] > analogRead(arrayPinSensor[i]);
    digitalWrite(arrayPinOut[i], stateValue[i]);
    /*Serial.print("levelHum "); Serial.print(i+1);
    Serial.print(" = "); Serial.println(analogRead(arrayPinSensor[i]));
    Serial.print("stateValue "); Serial.print(i+1);
    Serial.print(" = "); Serial.println(stateValue[i]);*/
    }
  //если один из клапанов открыт-насос включен
  return stateValue[0] | stateValue[1] | stateValue[2];  
}

 

 

Как поменять состояния релле насоса? он вместо того чтобы включиться выключаеться)

Pyotr
Offline
Зарегистрирован: 12.03.2014

return !(stateValue[0] | stateValue[1] | stateValue[2]); 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Pyotr пишет:

return !(stateValue[0] | stateValue[1] | stateValue[2]); 

Все равно не то. У меня насос включаеться только после того как на все остальные релле включены. Если хоть одно релле выключено то и насос выключен.

Pyotr
Offline
Зарегистрирован: 12.03.2014

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

Sim0012
Offline
Зарегистрирован: 26.02.2015

Pyotr пишет:

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

 

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

Pyotr
Offline
Зарегистрирован: 12.03.2014

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

Pyotr пишет:

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

Реле на модуле включается при подаче на вход  "1" или "0"??? Своими словами или ссылку на схему модуля.

При увеличении влажности почвы напряжение на выходе модуля датчика влажности увеличивается или уменьшается??  Своими словами или ссылку на схему модуля.

 

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Ну если своими словами то при подаже - (gnd) релле включаеться. Если выводить значения влажности почвы то когда датчики не воткнуты в землю значения показывают около 1000(+- ) при замыкание или (втыканию их впочву ) значения уменьшаються. вы это имелли в виду?

Pyotr
Offline
Зарегистрирован: 12.03.2014

Нужно изменить самую малость скетч из поста #443. строка 25
Подсказка http://arduino.ru/Reference/Boolean
Вам нужно самому над этим подумать, полезно для будущего. Показывайте что получилось.