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

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

Pyotr пишет:

Показывайте что получилось.

Вы предлогаете вот так вот?

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {1, 2, 3};//А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) > 60){ //вызываем функцию каждую минуту, например.
    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

Массив arrayPinOut[] хранит номера пинов подключенных к модулю реле.
arrayPinOut[0] = D3; arrayPinOut[1] = D4 и т д. Как можно инвертировать номер пина? А вот инвертировать состояние пина это другое дело.

Ещё подсказка: логический "0" = false = LOW = !1     
"1" = true = HIGH = !0

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

Pyotr пишет:

Массив arrayPinOut[] хранит номера пинов подключенных к модулю реле.
arrayPinOut[0] = D3; arrayPinOut[1] = D4 и т д. Как можно инвертировать номер пина? А вот инвертировать состояние пина это другое дело.

Ещё подсказка: логический "0" = false = LOW = !1     
"1" = true = HIGH = !0

должно быть вот так вот?

    digitalWrite(arrayPinOut[!i], stateValue[i]);  

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

"!" означает инверсию. Переведи полученное на "человеческий". Допустим, i=3, тогда получим команду записать(изМассиваПинов[не номер 3])], состояниеЭлемента[номер 3]);

Согласен, что бред получился?

digitalWrite(!arrayPinOut[i], stateValue[i]);
Sim0012
Offline
Зарегистрирован: 26.02.2015

Tomasina пишет:

 

Согласен, что бред получился?


 

 

я так понял что воттак вы мне предлогаете? 

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {1, 2, 3};//А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) > 60){ //вызываем функцию каждую минуту, например.
    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];  
}

 

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

сравните еще раз что я предлагаю, и что Вы пишете (строка 25).

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

Tomasina пишет:

сравните еще раз что я предлагаю, и что Вы пишете (строка 25).

 

 

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

 
const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {1, 2, 3};//А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) > 60){ //вызываем функцию каждую минуту, например.
    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];  
}

 

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

Ещё 2 свободных реле или три диода есть? Будет не по феншую, но схема и код очень простые.

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

Tomasina пишет:
Ещё 2 свободных реле или три диода есть? Будет не по феншую, но схема и код очень простые.

я уже думал об этом. У меня клапана получеться от 12в работают а насос от 220. Еше релле нет( Диоды еще найдуться

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

Ладно, оставим 25 строку, а вместе с ней и 24. Подумаете после, что там изменить чтобы код заработал.

const byte arrayPinOut[4] = {3, 4, 5, 2};//на D2 насос
const byte arrayPinSensor[3] = {1, 2, 3};//А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);
  digitalWrite(arrayPinOut[i], HIGH); //выкл насос  и клапаны
  }
} 
void loop(){
  static unsigned long prevMillis = 0;
  if((millis() - prevMillis) > 1000){ //вызываем функцию каждую сек, например.
    digitalWrite(arrayPinOut[3], irrigatSoil()); 
    prevMillis = millis();
    }
   //делаем что то ещё..
}
//-----------------------------------
boolean irrigatSoil(){
  static boolean stateValue[3] = {1, 1, 1};
  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];  
}

Если влажно,  stateValue = 1    => реле выкл., >>> клапан полива закр.
Если хотя бы один stateValue=1   => irrigatSoil()  возвращает  1 =>>>насос откл.

Если сухо, stateValue = 0    => реле вкл., >>> клапан полива откр.
Если все  stateValue=0   => irrigatSoil()  возвращает  0 =>>>насос вкл.
 

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

Pyotr пишет:

Ладно, оставим 25 строку, а вместе с ней и 24. 

Спасибо огромное все работает)))

Shir
Offline
Зарегистрирован: 21.02.2014
 

Привет, соорудил открывалку двери теплицы. Пока в тестовом состоянии. Раборает всего неделю.

Вот механизм. Пришлось поколдавать с рычагами.

Так пока выгледит управляющий блок. Состоит из БП, 3-х реле и термометра с реле.

Можно было сделать на ардуино, но нет у меня модуля управления двигателями. Если механизм оправдает себя, то буду переделывать.

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

Shir, на фото непонятно, чем двигается дверь?

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

Зачем столько реле?

Shir
Offline
Зарегистрирован: 21.02.2014

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

Есть термостат с реле типа STH0024UG-v3, который при t-27 cрабатывает и замыкает реле термостата. Дверь открывается до нажатия кнопки, кнопка размыкает цепь. Мотор останавливается. Дверь открыта. Вечером t-20 реле термостата размыкается. Мотор крутится в обратную сторону. Дверь закрывается до нажатия кнопки. Кнопка нажата, цепь разомкнута. Дверь закрыта. В зависимости от темпиратуры открывается и закрывается дверь.

Такое кол-во реле необходимо для того чтоб перевернуть полярность мотора.И вращать его в обратную сторону. Реле 5-контактные.

 

 

 

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

Для тех, кому туго даётся программирование есть вариант открывалки на готовых модулях, в котором дверь/форточка может принимать промежуточные положения. 
http://www.greentalk.ru/topic/2602-ventilyatciya-teplitc-oborudovanie-me...

Такой алгоритм и на дуине легко описать.

toc
Offline
Зарегистрирован: 09.02.2013

Есть ещё вариант. Видел у соседа. Без электричества совсем. Форточкой управляет какой-то цилиндр с жидкостью. Вроде в 22 градуса начинает открывать, в 24 открыто на 100%.

strim
Offline
Зарегистрирован: 18.08.2014

Мой вариант актуатора.

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

какое усилие развивает? Длина хода штока? Сколько кушает?

Shir
Offline
Зарегистрирован: 21.02.2014

У меня был с масленым актуатором. Открывал форточку. Обратно его тянула пружина. Форточки оказалось мало для проветривания. И ход у актуатора был мал. В общем для моего типа теплицы не подошел!

zalias7
Offline
Зарегистрирован: 18.03.2015

Конструировать конечно хорошо, но что бы проветрить теплицу есть вещи попроще http://www.ebay.com/sch/i.html?_odkw=greenhouse&_sop=15&LH_BIN=1&_osacat...  , не надо ни электричества ни автоматики :)

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

Пять лет назад сделал открывалку из б/у газового упора крышки багажника ВАЗ2111 и куска трубы Д=76 мм. В цилиндре масло, а в трубе ацетон, разделены пластиковой перегородкой. Ход штока (он же поршень) 20 мм, усилие 80 кг и более. Я своими 76 кг подпрыгивая не смог задвинуть шток. Одновременно открывал 2 фрамуги (210*100 см, по 7 кг, откр. на 1 м) с одной и другой стороны. Если был ветер, на фрамугу с наветренной стороны вешал кирпич, чтобы не открывалась.
Три года отработала и сейчас в рабочем состоянии. Заменил на электропривод.

strim
Offline
Зарегистрирован: 18.08.2014

Ток не замерял. 3 двигателя + электроника питается от блока питания 12В 8А. Руками остановить очень трудно. Ход - 350мм.

Diemon
Offline
Зарегистрирован: 18.11.2011

Товарищи, покритикуйте такую идею по поводу "мозгов" теплицы:

Центральная - Mega, висит себе в шкафчике, с дисплейчиком и тд и тп. С помощью esp8266 смотрит в домашнюю сетку, веб интерфейс для управления... и прочие плюшки.

На местах (датчики влажности, освещенности, температуры) поставить pro mini. Они копеечные, общаться с центральной мегой будут допустим через nrf24l01. 

Из плюсов вижу:

+ тянуть только питание 12/24 В. На месте понижать опять же копеечным lm2596.
+ в любой момент можно к датчику влажности положить рядом датчик температуры и подключить в ту-же pro mini. Нет необходимости вести дополнительные провода. То бишь мобильность всей системы.

Из минусов:

- Нужно написать универсальную прошивку для pro mini. Хочется с меги делать запросы типа get_humidity(promini1 , pin_1 , dht22) а pro mini должна отвечать значением влажности.
- Вытекает из предыдущего пункта. Фактически нужно делать свой протокол общения (тут можно погуглить, возможно уже есть готоые решения).
- Система хоть и не намного, но становится дороже.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Diemon пишет:

Из минусов:

- Нужно написать универсальную прошивку для pro mini. Хочется с меги делать запросы типа get_humidity(promini1 , pin_1 , dht22) а pro mini должна отвечать значением влажности.
- Вытекает из предыдущего пункта. Фактически нужно делать свой протокол общения (тут можно погуглить, возможно уже есть готоые решения).

Из критики - написание своего протокола. Есть ли смысл? воспользуйся одним из готовых, например Modbus или CAN, получишь дополнительный плюс - возможность использовать любую готовую SCADA для визуализации... 

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

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

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

Так и должно быть. Есть свет - растения транспирируют (испаряют воду через устица на листьях) - ОВВ растет, и если нет проветривания и, соответственно выпуска влаги наружу, то ОВВ растёт и может достичь 100% --развитие болезней. Одновременно падает уровень СО2 (растения выедают) -- фотосинтез прекращается. Выход - обязательно оставлять щель для проветривания. Пониженная Т меньшее зло, чем повышенная влажность. Если есть возможность, подтапливать при приоткрытых фрамугах/двери, получится идеальный вариант.

demon969
Offline
Зарегистрирован: 24.04.2012

 

http://arduino.ru/forum/proekty/umnaya-teplitsa?page=2#comment-52530

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

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

Включение полива осуществляется по условию если строка (string) текущего времени(которая формируется из часов реального времени 1307) = строке (String irr_time) заданного времени(которая собирается из памяти eeprom) то происходит действие =) Только в том коде, который я выкладывал, чёт не нашел этого условия =) ну в loop это дописать не сложно.

Может так будет понятней

/* adress eeprom
EEPROM 0 Минимальное значение температуры актуатора
EEPROM 1 Максимальное значение темп актуатора
 1 линия полива
EEPROM 2 1/0 включение отключение полива (0=off / 1=on)
EEPROM 3 Продолжительность минут полива
EEPROM 4 минута полива
EEPROM 5 час полива
 2 линия полива
EEPROM 6 1/0 включение отключение полива (0=off / 1=on)
EEPROM 7 Продолжительность минут полива
EEPROM 8 минута полива
EEPROM 9 час полива
 3 линия полива
EEPROM 10 1/0 включение отключение полива (0=off / 1=on)
EEPROM 11 Продолжительность минут полива
EEPROM 12 минута полива
EEPROM 13 час полива
 4 линия полива
EEPROM 14 1/0 включение отключение полива (0=off / 1=on)
EEPROM 15 Продолжительность минут полива
EEPROM 16 минута полива
EEPROM 17 час полива
*/

//LCD I2C 20x4
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//LCD

//DHT SENSOR
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); 
//DHT

//кнопка
// задаем константы кнопок и присваиваем им пины
const int buttonPin = 15;     // центральная кнопка
const int buttonPin_1 = 14;  //левая кнопка 
const int buttonPin_0 = 16;  //правая кнопка
const int ledPin =  13;      // номер выхода светодиода индикатора
const int irr_valve_1 = 32; //№ pin'a первая линия полива
const int irr_valve_2 = 33; //№ pin'a вторая линия полива
const int irr_valve_3 = 34; //№ pin'a третья линия полива
const int irr_valve_4 = 35; //№ pin'a четвёртая линия полива
const int rele_7 = 36; //№ pin'a четвёртая линия полива
const int rele_8 = 37; //№ pin'a четвёртая линия полива



// пины управления актуатором
const int open_actuator = 30; //открыть актуатор пином 34
const int close_actuator = 31; //закрыть актуатор пином 35

//пин управления насосом, который заполняет бочку для полива
const int nasos = 36;
const int sensor_min_level_tank = 26; //дискретный датчик нижнего уровня воды на 26 пине.
const int sensor_max_level_tank = 27;
int sensor_min_level_state= 1; //
int sensor_max_level_state= 1;



/*
int on_off_1 = EEPROM.read(2);
int dur_1 = EEPROM.read(3);
int min_dur_1 = EEPROM.read(4);
int hour_dur_1 = EEPROM.read(5);

int on_off_2 = EEPROM.read(6);
int dur_2 = EEPROM.read(7);
int min_dur_2 = EEPROM.read(8);
int hour_dur_2 = EEPROM.read(9);

int on_off_3 = EEPROM.read(10);
int dur_3 = EEPROM.read(11);
int min_dur_3 = EEPROM.read(12);
int hour_dur_3 = EEPROM.read(13);

int on_off_4 = EEPROM.read(14);
int dur_4 = EEPROM.read(15);
int min_dur_4 = EEPROM.read(16);
int hour_dur_4 = EEPROM.read(17);
*/
// глобальные переменные
int centreBtn = 0;         // переменная для хранения состояния центральной кнопки
int leftbtn = 0;     // переменная для хранения состояния левой кнопки
int rightbtn = 0;     // переменная для хранения состояния правой кнопки
/*
String irr_time =""; //переменная строки времени полива
String irr_time_2 =""; //переменная строки времени полива
String irr_time_3 =""; //переменная строки времени полива
String irr_time_4 =""; //переменная строки времени полива

String end_irr_time ="";
String end_irr_time_2 ="";
String end_irr_time_3 ="";
String end_irr_time_4 ="";
*/
int del = 500; // переменная ожидания между выборами меню(время горения ledpin в милисек)
//подсветка LCD
//int r=0;
long previousMillis = 0;        // храним время
long interval_2 = 10000; //задержка подсветки
long interval_3 = 1000; //задержка записи на SD
// интервал 
//переменные автовозврата в loop 
int interval = 50;    // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
//

int valve_1[5] = {1,2,3,4,5};
int valve_2[5] = {2,6,7,8,9};
int valve_3[5] = {3,10,11,12,13};
int valve_4[5] = {4,14,15,16,17};


//ds1307 модуль часов реального времени
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
//строка времени
String Date; //строка даты

String Time; //времени
//--ds1307

//ds1820 temp
#include <OneWire.h>
#include <DallasTemperature.h>
 // Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 3
 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 // Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
//float in_tempC;
//float out_tempC;
//--ds1820

//SD card
#include <SPI.h>
#include <SD.h>
File myFile;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
//LCD
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
lcd.init();   // initialize the lcd 
lcd.backlight();
//--LCD

// initialize the button pin as a input:

// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
pinMode(irr_valve_1, OUTPUT);
pinMode(irr_valve_2, OUTPUT);
pinMode(irr_valve_3, OUTPUT);
pinMode(irr_valve_4, OUTPUT);

pinMode(open_actuator, OUTPUT);
pinMode(close_actuator, OUTPUT);

pinMode(rele_7, OUTPUT);
pinMode(rele_8, OUTPUT);


digitalWrite(irr_valve_1, HIGH);
digitalWrite(irr_valve_2, HIGH);
digitalWrite(irr_valve_3, HIGH);
digitalWrite(irr_valve_4, HIGH);

digitalWrite(open_actuator, HIGH);
digitalWrite(close_actuator, HIGH);

digitalWrite(rele_7, HIGH);
digitalWrite(rele_8, HIGH);

digitalWrite(ledPin, HIGH); 
// initialize serial communication:
Serial.begin(9600);

    
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);   
pinMode(buttonPin_0, INPUT);   
pinMode(buttonPin_1, INPUT);   

pinMode(nasos, OUTPUT);
pinMode(sensor_min_level_tank, INPUT);
pinMode(sensor_max_level_tank, INPUT);



//ds1307
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled 
    rtc.adjust(DateTime(__DATE__, __TIME__)); //строка установки системного времени во время компиляции скеча
  }
//--ds1307  

//sd
pinMode(53, OUTPUT);
if (!SD.begin(53)) {
    Serial.println("initialization SD flash card failed!");
    return;
  }
  Serial.println("initialization SD flash card done.");
//sd

//DHT
dht.begin();
//DHT

close_windows();
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//#########################################################################################################
void loop() {
//if (LCD_LED){lcd.backlight();}
time();
termostat();
_nasos();
//temp();  

irrigation(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4], irr_valve_1);
irrigation(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4], irr_valve_2);
irrigation(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4], irr_valve_3);
irrigation(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4], irr_valve_4);



lcd.setCursor(0,0);
  lcd.print("in= ");
  lcd.print(temp_in());
  lcd.print(" out= ");
  lcd.print(temp_out()); 
//  lcd.setCursor(0,1);
//  lcd.print(irr_time);
  lcd.print("");  
//  lcd.print(end_irr_time);
  lcd.print("");  
//  lcd.print(EEPROM.read(2));
  
  lcd.setCursor(0,2);
  lcd.print(Date);
  lcd.print("  ");
  lcd.print(Time);
  lcd.setCursor(0,3);
  lcd.print("h=");
  lcd.print(Humidity());
  lcd.print("%");
  lcd.setCursor(7,3);
  lcd.print("MENU");

  button_read(); //читаем кнопки // проверяем нажата ли кнопка
 
  if (centreBtn) {   // проверяем нажата ли кнопка если нажата, то 
//    LCD_LED = 1;
//    lcd.backlight();
    lcd.backlight();
    digitalWrite(ledPin, LOW);
    delay(del);// включаем светодиод   
    lcd.clear(); //очищаем экран
    digitalWrite(ledPin, HIGH);
    menu();
}

if (leftbtn) {   //включить подсветочку
   lcd.backlight(); 
  open_windows(); 
   //digitalWrite(ledPin, LOW);             
   //LCD_LED();      
   //delay(del);
   //digitalWrite(ledPin, HIGH);            
       }     
if (rightbtn) {
    lcd.backlight(); 
  close_windows(); 
} 

LCD_LED_OFF(); //таймер отключения подсветки



}
//##########################################################################################################33

void menu()
{
actuator_setup();
irrigtion_setup();
irrigation_set_time();

}

void actuator_setup()
{
int x =0;

  lcd.clear(); //очищаем экран

while(1){ // цикл 
x++;
if (x>interval){break;}

  button_read();

  lcd.setCursor(0,0);
  lcd.print(" -=ACTUATOR SETUP=- ");

  int t_mini = EEPROM.read(0);
  lcd.setCursor(0,1);
  lcd.print("min = ");
  lcd.print(t_mini);
  lcd.print((char)223);

  int t_maxi = EEPROM.read(1);
  lcd.setCursor(11,1);
  lcd.print("max = ");
  lcd.print(t_maxi);
  lcd.print((char)223);                   

  lcd.setCursor(0,2);
  lcd.print("____________________");

  lcd.setCursor(0,3);
  lcd.print("T_MIN   NEXT   T_MAX");
  digitalWrite(ledPin, HIGH);
  
   
if (centreBtn) {   
 digitalWrite(ledPin, LOW);             
 delay(del);// включаем светодиод   
 lcd.clear(); //очищаем экран
 digitalWrite(ledPin, HIGH);
 break; }
                      
 if (leftbtn) {   
 digitalWrite(ledPin, LOW);             
   lcd.clear();
        t_min();
       delay(del);
       lcd.clear(); //очищаем экран
       x =0;   
       digitalWrite(ledPin, HIGH);            
       }       
    
if (rightbtn) {   
       digitalWrite(ledPin, LOW);             
       lcd.clear();
        t_max();
       delay(del);// включаем светодиод   
       lcd.clear(); //очищаем экран
       x =0;           
       digitalWrite(ledPin, HIGH);
      }  
  
 }}


void irrigtion_setup()
{
int y =0;  
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
y++;
if (y>interval){break;} //выйти из цикла при y>interval
button_read();

 lcd.setCursor(0,0);
 lcd.print("-=IRRIGATION SETUP=-");
// int on_off = EEPROM.read(2);
//String x;
// if (on_off == 1) {x="ON";}
// if (on_off == 0) {x="OFF";}



 lcd.setCursor(0,1);
 lcd.print("1 ch=");
 lcd.print(on_or_off(valve_1[1])); //вызываем функцию on_or_off передаём ей параметр 2 символ массива, возвращаем string ON или OFF

 lcd.setCursor(10,1);
 lcd.print("3 ch=");
 lcd.print(on_or_off(valve_3[1]));
 
  lcd.setCursor(0,2);
 lcd.print("2 ch=");
 lcd.print(on_or_off(valve_2[1]));
 
  lcd.setCursor(10,2);
lcd.print("4 ch=");
 lcd.print(on_or_off(valve_4[1]));

/*
 int duration = EEPROM.read(3);
 lcd.setCursor(10,1);
 lcd.print("dur=");
 lcd.print(duration);
 lcd.print("min");                   
 lcd.setCursor(0,2);
 lcd.print("____________________"); 
 */
 lcd.setCursor(0,3);

 lcd.print("ON/OFF NEXT DURATION");
//                   digitalWrite(ledPin, HIGH);
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
            break;
           }
    
    if (rightbtn) {   
           digitalWrite(ledPin, LOW);             
           lcd.clear();
            durration_irrigation(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]);
            durration_irrigation(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]);
            durration_irrigation(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]);
            durration_irrigation(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]);
            
           delay(del);// включаем светодиод   
               lcd.clear(); //очищаем экран
           y =0;   
           digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
           digitalWrite(ledPin, LOW);             
           lcd.clear();
            on_off_irrigation(valve_1[0],valve_1[1]);
            on_off_irrigation(valve_2[0],valve_2[1]);
            on_off_irrigation(valve_3[0],valve_3[1]);
            on_off_irrigation(valve_4[0],valve_4[1]);
            
            
            //on_off_irrigation();  
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
           y =0;            
           digitalWrite(ledPin, HIGH);
          }  
 

 }}

void irrigation_set_time()
{
int x =0;
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
x++;
if (x>interval){break;}
button_read();
//string_irrigation_time(); //выполняем функцию строки времени полива для отображения переменной irr_time
 lcd.setCursor(0,0);
 lcd.print("IRRIGATION SET TIME");
 lcd.setCursor(0,1);
 lcd.print("1: ");
 lcd.print(string_irrigation_time(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]));
 lcd.print(" ");
 lcd.print(string_irrigation_time(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]));
 lcd.setCursor(0,2);
 lcd.print("2: ");
 lcd.print(string_irrigation_time(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]));
 lcd.print(" ");
 lcd.print(string_irrigation_time(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]));
// lcd.print(irr_time); //выводим переменную строки времени полива 



 lcd.setCursor(0,3);
 lcd.print("hours   NEXT  minuts");
 digitalWrite(ledPin, HIGH);
if (centreBtn) {   
       digitalWrite(ledPin, LOW);             
       delay(del);// включаем светодиод   
       lcd.clear(); //очищаем экран
       digitalWrite(ledPin, HIGH);
       break;
       }

if (leftbtn) {   
       digitalWrite(ledPin, LOW);             
       lcd.clear();
       irrigation_set_hours(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]);
       irrigation_set_hours(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]);
       irrigation_set_hours(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]);
       irrigation_set_hours(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]);
       delay(del);
       lcd.clear(); //очищаем экран
       x =0;   
       digitalWrite(ledPin, HIGH);            
       }       
    
if (rightbtn) {   
       digitalWrite(ledPin, LOW);             
       lcd.clear();
        irrigation_set_minuts(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]);
        irrigation_set_minuts(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]);
        irrigation_set_minuts(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]);
        irrigation_set_minuts(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]);

       delay(del);// включаем светодиод   
       lcd.clear(); //очищаем экран
       x =0;            
       digitalWrite(ledPin, HIGH);
      }  

 }}



//////--------------------------------------------------------------------------
//SUB MENU

void t_min()
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл 
button_read();

 lcd.setCursor(0,0);
 lcd.print(" TEMP MINIMUM SETUP");
 int t_min = EEPROM.read(0);
 lcd.setCursor(0,1);
 lcd.print("t = ");
 lcd.print(t_min);
 lcd.print((char)223);
 lcd.print("C");                   
 lcd.setCursor(0,3);
 lcd.print("t_min-1 NEXT t_min+1");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
           digitalWrite(ledPin, HIGH);
           break;

           }
    
    if (rightbtn) {   
            delay(del);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(0, t_min + 1);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(0, t_min - 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}

void t_max()
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл 
button_read();

 lcd.setCursor(0,0);
 lcd.print(" TEMP MAXIMUM SETUP");
 int t_max = EEPROM.read(1);
 lcd.setCursor(0,1);
 lcd.print("t = ");
 lcd.print(t_max);
 lcd.print((char)223);
 lcd.print("C");                   
 lcd.setCursor(0,3);
 lcd.print("t_max-1 NEXT t_max+1");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
           digitalWrite(ledPin, HIGH);
           break;

           }
    
    if (rightbtn) {   
            delay(del);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(1, t_max + 1);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(1, t_max - 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}

void on_off_irrigation(int ch,int on_off_x)
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл 
button_read();

 lcd.setCursor(0,0);
 lcd.print("ON/OFF IRRIGATION");
 //int on_off = EEPROM.read(on_off_x);
 //String x;
 //if (on_off == 1) {x="ON";}
 //if (on_off == 0) {x="OFF";}


 lcd.setCursor(0,2);
 lcd.print("irrigation = ");
 lcd.print(on_or_off(on_off_x));
 //lcd.print(on_off);
 lcd.setCursor(0,1);
 lcd.print("chanel N=");
 lcd.print(ch);
 lcd.setCursor(0,3);
 lcd.print("ON      NEXT     OFF");


 digitalWrite(ledPin, HIGH);
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
           digitalWrite(ledPin, HIGH);
           break;

           }
    
    if (rightbtn) {   
            delay(del);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(on_off_x, 0);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(on_off_x, 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}
void durration_irrigation(int ch,int on_off_x, int dur, int min_dur, int hour_dur)
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл 
button_read();
string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur);
 lcd.setCursor(0,0);
 lcd.print("DURRATION IRRIGATIN");
 int duration = EEPROM.read(dur);
 lcd.setCursor(0,1);
 lcd.print("ch N=");
 lcd.print(ch);
 lcd.print(" dur=");
 lcd.print(duration);
 lcd.print(" min");                   
 lcd.setCursor(0,3);
 lcd.print("-1min   NEXT   +1min");
 lcd.setCursor(0,2);
 lcd.print(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur)); 
 lcd.print("    ");
 lcd.print(string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));

 digitalWrite(ledPin, HIGH);
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
           digitalWrite(ledPin, HIGH);
           break;

           }
    
    if (rightbtn) {   
            delay(del);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(dur, duration + 1);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(dur, duration - 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}

void irrigation_set_minuts(int ch,int on_off_x, int dur, int min_dur, int hour_dur)
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл 
button_read();
//string_irrigation_time();
 lcd.setCursor(0,0);
 lcd.print("SET IRR-TION MINUTES");
 int minuts = EEPROM.read(min_dur);
 lcd.setCursor(0,1);
 lcd.print("ch N_");
 lcd.print(ch);
 lcd.print("= ");
 
 lcd.print(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));
// lcd.print("min");                   
 lcd.setCursor(0,2);
 lcd.print("____________________");
 lcd.setCursor(0,3);
 lcd.print("-1min   NEXT   +1min");
 digitalWrite(ledPin, HIGH);
  
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
           lcd.clear(); //очищаем экран
           digitalWrite(ledPin, HIGH);
           break;
           }
    
    if (rightbtn) {   
            delay(del);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            minuts = minuts + 1;
            if (minuts >59){minuts=0;}
            EEPROM.write(min_dur, minuts);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          minuts = minuts - 1;
          if (minuts < 0) {minuts=59;}
          EEPROM.write(min_dur, minuts);
          digitalWrite(ledPin, HIGH);
          }  
 
 }

}
void irrigation_set_hours(int ch,int on_off_x, int dur, int min_dur, int hour_dur)
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
//string_irrigation_time();
 lcd.setCursor(0,0);
 lcd.print(" SET IRR-TION HOURS");
 int hours = EEPROM.read(hour_dur);
 lcd.setCursor(0,1);
  lcd.print("ch N_");
 lcd.print(ch);
 lcd.print("= ");
 lcd.print(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));
// lcd.print("min");                   
 lcd.setCursor(0,2);
 lcd.print("____________________");
 lcd.setCursor(0,3);
 lcd.print("-1hour  NEXT  +1hour");

 digitalWrite(ledPin, HIGH);
    if (centreBtn) {   
           digitalWrite(ledPin, LOW);             
           delay(del);// включаем светодиод   
               lcd.clear(); //очищаем экран
               digitalWrite(ledPin, HIGH);
               break;
           
           }
    
    if (rightbtn) {   
            delay(del);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            hours = hours + 1;
            if (hours >23){hours=0;}
            EEPROM.write(hour_dur, hours);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          hours = hours - 1;
          if (hours < 0) {hours=23;}
          EEPROM.write(hour_dur, hours);
          digitalWrite(ledPin, HIGH);
          }  
 }
}
String string_irrigation_time(int ch, int on_off_x, int dur, int min_dur, int hour_dur) // функция формирования строки времни полива
{
String irr_time = ""; //очистим глобальную переменную навсякий случай. 


 int minuts = EEPROM.read(min_dur); //читаем память
 int hours = EEPROM.read(hour_dur);
 if (hours >= 0 && hours <=9) {irr_time += 0; irr_time += hours;} else{irr_time += hours;} //дописываем нолик для hours
 
 irr_time += ":";
 if (minuts >= 0 && minuts <=9){irr_time += 0; irr_time += minuts;} else{irr_time += minuts;} //дописываем нолик для minuts
 
 
 irr_time += ":";
 irr_time += "00"; //собрали строку времени полива
// lcd.setCursor(0,1);
// lcd.print("irr_time=");
// lcd.print(irr_time);
return irr_time;
}

String string_end_irrigation_time(int ch, int on_off_x, int dur, int min_dur, int hour_dur) // функция формирования строки времни полива
{
String end_irr_time = ""; //очистим глобальную переменную навсякий случай. 

 int minuts = EEPROM.read(min_dur) + EEPROM.read(dur); //читаем память
 int hours = EEPROM.read(hour_dur);
 if (minuts > 59) {int x = minuts / 60; hours += x; int y = x * 60; minuts -= y;}
 if (hours >= 0 && hours <=9) {end_irr_time += 0; end_irr_time += hours;} else{end_irr_time += hours;} //дописываем нолик для hours
 
 end_irr_time += ":";
 if (minuts >= 0 && minuts <=9){end_irr_time += 0; end_irr_time += minuts;} else{end_irr_time += minuts;} //дописываем нолик для minuts
  
 end_irr_time += ":";
 end_irr_time += "00"; //собрали строку времени полива
// lcd.setCursor(0,1);
// lcd.print("irr_time=");
// lcd.print(irr_time);
return end_irr_time;
}

void button_read() //функция проверки нажатия кнопки
{
centreBtn = digitalRead(buttonPin); //запоминаем значение кнопки
rightbtn = digitalRead(buttonPin_0); //запоминаем значение кнопки
leftbtn = digitalRead(buttonPin_1); //запоминаем значение кнопки
}
void LCD_LED_OFF()//таймер отключения подсветки
{
  unsigned long currentMillis = millis();
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval_2) {
   // сохраняем время последнего переключения
   previousMillis = currentMillis; 
 lcd.noBacklight();        
//  lcd.setCursor(0,3);
 // lcd.print("led");
 // if(r==0)
//      {lcd.print("led off"); r=1;  lcd.noBacklight();    } 
 // else if(r==1)//если кнопка НЕ нажата 
  //    {lcd.print("led on"); r=0;   lcd.backlight();     } 
}
}

void time() //функция строки времени
{    
//  int x;
  DateTime now = rtc.now();
    Date = "";
    Date += now.year();
    Date += "/";
     if (now.month() >=0 && now.month() <=9)
     {
      Date += "0";
      Date += now.month();
     } else {Date += now.month();}
  Date += "/";
     if (now.day() >= 0 && now.day() <=9)
     {
       Date += "0";
       Date += now.day();
     } else {Date += now.day();}
   //dataString += " ";
     Time ="";
     if (now.hour() >= 0 && now.hour() <=9 )
     { 
       
       Time += "0";
       Time += now.hour();
     } else {Time += now.hour();}
   Time += ":";
     if (now.minute() >= 0 && now.minute() <=9 )
     {
       Time += "0";
       Time += now.minute();
     } else {Time += now.minute();}
    Time += ":";
      if (now.second() >= 0 && now.second() <= 9)
      {
      Time += "0";
      Time += now.second();
      }
     else {Time += now.second();}
 //   Time += " ";
}
float temp_in()
 {
   sensors.requestTemperatures(); // Send the command to get temperatures
  float in_tempC = sensors.getTempCByIndex(0);
return in_tempC;
}

float temp_out()
 {
   sensors.requestTemperatures(); // Send the command to get temperatures
float out_tempC = sensors.getTempCByIndex(1);
return out_tempC;
 }

void irrigation(int ch, int on_off_x, int dur, int min_dur, int hour_dur, int irr_valve)
{
 int x=EEPROM.read(on_off_x);
 if (x == 1){
//  string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur);
//  string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur);
    if(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur) == Time)
    {
      digitalWrite(irr_valve, LOW); 
      Serial.print("ch: ");
      Serial.print(ch);
      Serial.print(" ");
      Serial.print("pin: ");
      Serial.print(irr_valve);
      Serial.print(" ");
      Serial.print("Status: ");
      Serial.println(" ON");
      
      String file_name = "irrigat.txt";
      String  value = "";
              value += ch;
             value += ";1;";
             sd_write (file_name, value);
      
    }
    if(string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur) == Time)
    {
      digitalWrite(irr_valve, HIGH);
      Serial.print("ch: ");
      Serial.print(ch);
      Serial.print(" ");
      Serial.print("pin: ");
      Serial.print(irr_valve);
      Serial.print(" ");
      Serial.print("Status: ");
      Serial.println(" OFF");
      
      String file_name = "irrigat.txt";
      String  value = "" ;
              value += ch;
             value += ";0;";
             sd_write (file_name, value);
}
}

}

String on_or_off (int on_off)
{
int z = EEPROM.read(on_off);
  String x;
 if (z == 1) {x="ON";}
 if (z == 0) {x="OFF";}
 return x;
}

int termostat ()
{
int temp_min = EEPROM.read(0);
int temp_max = EEPROM.read(1);
  if (temp_out() > temp_max && digitalRead(close_actuator)==LOW)
  {
    open_windows();
  }

  if (temp_out() < temp_min && digitalRead(open_actuator)==LOW)
  {
  close_windows();
  }
}
void open_windows()
{
    digitalWrite(close_actuator, HIGH);
    delay(1000);
    digitalWrite(open_actuator, LOW);

//    lcd.setCursor(0,0);
 //   lcd.print("Open window");   
    lcd.setCursor(0,1);
    lcd.print("OPEN ACTUATOR");
String file_name = "actuator.txt";
String value = "1";
sd_write (file_name, value);
}
void close_windows()
{
    digitalWrite(open_actuator, HIGH);
    delay(1000);
    digitalWrite(close_actuator, LOW);

//    lcd.setCursor(0,0);
 //   lcd.print("Open window");   
    lcd.setCursor(0,1);
    lcd.print("CLOSE ACTUATOR");
    String file_name = "actuator.txt";
    String value = "0";
    sd_write (file_name, value);
}
int _nasos()
{
sensor_min_level_state = digitalRead(sensor_min_level_tank);
sensor_max_level_state = digitalRead(sensor_max_level_tank);
if (sensor_min_level_state == LOW) 
 {
 digitalWrite(nasos, HIGH);
      String file_name = "nasos.txt";
      String value = "0";
      sd_write (file_name, value);
 }
if (sensor_max_level_state == HIGH)
 {
 digitalWrite(nasos,LOW);
      String file_name = "nasos.txt";
      String value = "1";
      sd_write (file_name, value);
 }

}

int sd_write (String file_name, String value)
{
unsigned long currentMillis = millis();
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval_3) {
   // сохраняем время последнего переключения
   previousMillis = currentMillis; 
 
char f_n[file_name.length()+1];
file_name.toCharArray(f_n, file_name.length()+1);
myFile = SD.open(f_n , FILE_WRITE);
//myFile = SD.open(file_name.c_str() , FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to ");
    Serial.print(f_n);
//    Serial.print(file_name.c_str());
    Serial.print(" ");
    myFile.print(Date);
    myFile.print(";");
    myFile.print(Time);
    myFile.print(";");
    myFile.println(value);
    	// close the file:
    myFile.close();
    Serial.print("done. Writed: ");
    Serial.print(Date);
    Serial.print(";");
    Serial.print(Time);
    Serial.print(";");
    Serial.println(value);
    return(1);
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening sd card. File: ");
    Serial.print(file_name.c_str());
    return(0);
    
  }
  }
}
int Humidity()
{
int h = dht.readHumidity();
return h;
}

 

Solaris
Offline
Зарегистрирован: 20.10.2015

Большое спасибо за Вашу работу, за то, что делитесь наработками и советами. Нам, новичкам в вопросах автоматизации теплиц, это очень необходимо.

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

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

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

Жду на e_vishnev@mail.ru

Спасибо за помощь!

vfkfif
Offline
Зарегистрирован: 30.09.2015

Добрый день. Подскажите. Купил для датчика влажности почвы электроды ЦЛ-11. Окислились. Какие надо использовать?

mrGoReC
Offline
Зарегистрирован: 16.06.2015

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

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

 Типа вот такой фигни собрать из шампуров =)

  Типа вот такой фигни сделать

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

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

Kintar0
Offline
Зарегистрирован: 07.12.2015

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

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

Схемы нет, все пины в прошивке указаны

Kintar0
Offline
Зарегистрирован: 07.12.2015

простите за "тормознутость" но всё равно не разобрался. если вам несложно, можете схему собрать (даже от руки рисованая). 

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

В чём именно у вас трабл? на первой странице есть схема для уны. на меге почти также только другие пины. Рисовать схемы времени нет... помогу советом =)

Kintar0
Offline
Зарегистрирован: 07.12.2015

У вас есть какя нибудь связь? ICQ, вайбер, скайп? или только маил?

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

пишите в вайбер 9 2 шесть 4тыре 6 88 два 03

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

Probelzaelo пишет:
Китайский вариант электропривода. судя по заявленным параметрам не плохо подходит для местного применения.

э, зачем так дорого? Такая штука справляется не хуже, а стоит в 4 раза меньше.

Solaris
Offline
Зарегистрирован: 20.10.2015

Probelzaelo пишет:

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

Вариант почти в два раза дешевле: http://ru.aliexpress.com/item/low-noise-dc-electric-linear-actuator-elec...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Tomasina пишет:

Probelzaelo пишет:
Китайский вариант электропривода. судя по заявленным параметрам не плохо подходит для местного применения.

э, зачем так дорого? Такая штука справляется не хуже, а стоит в 4 раза меньше.

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

Solaris пишет:

Probelzaelo пишет:

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

Вариант почти в два раза дешевле: http://ru.aliexpress.com/item/low-noise-dc-electric-linear-actuator-electric-putter-12v-DC-motor-250mm-stroke-7mm-s-speed/32452898091.html?spm=2114.10010208.100005.1.QigIA4&isOrigTitle=true

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

В принципе, если применительно к месту то можно и еще дешевле выбрать и ход наверняка не нужен 250-300, кто же против.

 

Solaris
Offline
Зарегистрирован: 20.10.2015

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

Пока нашел это: http://ru.aliexpress.com/item/1Pcs-Soil-Hygrometer-Humidity-Detection-So...

Кто что может посоветовать?

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

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

Solaris
Offline
Зарегистрирован: 20.10.2015

Tomasina пишет:

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

Гвозди хоть раз в месяц могу менять.)

 

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

Tomasina пишет:
<<
э, зачем так дорого? Такая штука справляется не хуже, а стоит в 4 раза меньше.>>

Или в сорок раз дешевле)) - б/у моторредуктор от стеклоочистителя авто. На разборках за 100 руб. Правда с механикой придётся повозиться...  http://www.greentalk.ru/blog/83/entry-573-sistema-ventilyatcii-dlya-fermerskih-i-lyubitels/

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Pyotr пишет:

Tomasina пишет:
<<
э, зачем так дорого? Такая штука справляется не хуже, а стоит в 4 раза меньше.>>

Или в сорок раз дешевле)) - б/у моторредуктор от стеклоочистителя авто. На разборках за 100 руб. Правда с механикой придётся повозиться...  http://www.greentalk.ru/blog/83/entry-573-sistema-ventilyatcii-dlya-fermerskih-i-lyubitels/

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

serg69
Offline
Зарегистрирован: 27.12.2015

dachnik, можно Вас попросить свой код из 207 поста адаптировать под мои условия? Оплату гарантирую.

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

Давайте попробую

serg69
Offline
Зарегистрирован: 27.12.2015

Будем общаться здесь или дать mail?