/*подключаем библиотеки*/
 #include <Wire.h>//подключаем экран
 #include <LiquidCrystal_I2C.h>//подключаем экран
 #include <OneWire.h>//подключаем датчик температуры
 #include <DallasTemperature.h>//подключаем датчик температуры
 #include <EEPROM.h>//подключаем память для записи настроек

 LiquidCrystal_I2C lcd(0x27, 16, 2);//подключаем экран
 OneWire ds_1(2), ds_2(3);//подключаем шину для температурника
 DallasTemperature ds1(&ds_1), ds2(&ds_2);//задаем имя датчика комнаты
 DeviceAddress addr1, addr2;//хранение адреса датчика температуры для проверки


/*ввод переменных*/
 uint8_t TUS;//ввод переменной для хранения установленной температуры(0)
 uint8_t TUNVKL;//переменная для хранения температуры вкл насоса(50)
 uint8_t TUNVIKL;//переменная для хранения температуры выкл насоса(52)
 #define up 7 //ввод переменных для кнопок
 #define down 9 //ввод переменных для кнопок
 #define left 6 //ввод переменных для кнопок
 #define right 8 //ввод переменных для кнопок
 #define reln 13 //переменная для реле насоса
 #define zad 10000 //переменная для настройки времени задержки
 uint16_t curs;//переменная для меню (курсор)
 uint8_t rel1, rel2, rel3;//переменные для реле
 uint32_t nar1, nar2, nar3, narn;//переменные для хранения времени работы (10, 20, 30, 40)
 uint32_t timer;//переменная времени сработки кнопок
 uint32_t timerDS;//переменная для задержки опросов датчиков температуры
 uint32_t timerDR;//переменная для задержки опросов состояния реле
 uint32_t zads;//переменная для задержки обновления экрана
 uint32_t zadp1, zadp2, zadp3, zadpn;//переменная для настройки времени задержки записи наработки
 bool light = 0;//переменная для управления подсветкой
 bool flag1 = 0, flag2 = 0, flag3 = 0, flagn = 0;//флаг для счетчика времени наработки
 char ten1, ten2, ten3, nas;//переменные для хранения состояния тэн и насоса
 uint32_t randN;//рандом реле
 //проверка на первый запуск
 #define INIT_ADDR 1023  // номер резервной ячейки
 #define INIT_KEY 50     // ключ первого запуска. 0-254, на выбор

 



void setup(){
  //проверка на первый запуск
    if (EEPROM.read(INIT_ADDR) != INIT_KEY) { // первый запуск
     EEPROM.write(INIT_ADDR, INIT_KEY);    // записали ключ
     lcd.init();
     lcd.print("pervi zapusk");
     delay(2000);
     EEPROM.put(0, 20);//если это первый запуск то задаем настройки
     EEPROM.put(2, 'a');
     EEPROM.put(4, 'a');
     EEPROM.put(6, 'a');
     EEPROM.put(8, 'a');
     EEPROM.put(50, 80);
     EEPROM.put(52, 60);
    }
  


  ds1.begin();//запуск датчика температуры
  ds2.begin();//запуск датчика температуры
  //ds1.setWaitForConversion(false); 
  //ds2.setWaitForConversion(false); 
  lcd.init();//подключаем экран
  lcd.backlight();//включаем подсветку
    
  
  /*рандомируем реле*/
  randomSeed(analogRead(A3));
  randN = random(10, 12);
  rel1 = randN;
  do {randN = random(10, 12); rel2 = randN;} while (rel2 == rel1);
  do {randN = random(10, 12); rel3 = randN;} while (rel3 == rel2 || rel3 == rel1);
  /*рандом*/

/*назначаем пины*/  
  pinMode(6, INPUT_PULLUP);//подключаем кнопки
  pinMode(7, INPUT_PULLUP);//подключаем кнопки
  pinMode(8, INPUT_PULLUP);//подключаем кнопки
  pinMode(9, INPUT_PULLUP);//подключаем кнопки
  pinMode(10, OUTPUT);//подключаем реле
  pinMode(11, OUTPUT);//подключаем реле
  pinMode(12, OUTPUT);//подключаем реле
  pinMode(13, OUTPUT);//подключаем реле
  digitalWrite (rel1, LOW);//отключаем реле при запуске
  digitalWrite (rel2, LOW);//отключаем реле при запуске
  digitalWrite (rel3, LOW);//отключаем реле при запуске
  digitalWrite (reln, HIGH);//отключаем реле при запуске
  

/*начало работы*/
  lcd.print("zapusk vers1.2.1");
  delay(1000);
  lcd.setCursor(8, 1);//курсор на вторую строку
  lcd.print("proverka");
  delay(2000);
  //lcd.cursor();

 /*проверка датчиков на работоспосоность*/
  if ( !ds1.getAddress(addr1, 0)){//опрос адреса 1 датчика, если нет ответа то
    lcd.clear();
    lcd.print("temp kom ne rab");
    delay(10000);
  }
  else if (!ds2.getAddress(addr2, 0)){//опрос адреса 2 датчика, если нет ответа то
    lcd.clear();
    lcd.print("temp vod ne rab");
    delay(10000);
  }
  else{
  lcd.clear();
  lcd.print("vse OK");
  delay(3000);
  lcd.clear();//очистка дисплея*/
  }

  timer = millis();//записываем текущее значение счетчика
  zadp1 = millis();
  zadp2 = millis();
  zadp3 = millis();
  zadpn = millis();
  
  //опрос памяти установленной температуры и состояния реле
  EEPROM.get(0, TUS);
  EEPROM.get(2, ten1);
  EEPROM.get(4, ten2);
  EEPROM.get(6, ten3);
  EEPROM.get(8, nas);
  EEPROM.get(50, TUNVKL);
  EEPROM.get(52, TUNVIKL);
  
  start();
}






void loop(){
 


//опрос температуры 
  if(timer + zad <= millis() && timerDS + zad <= millis()){//задержка опроса температуры
  ds1.requestTemperatures();//опрашиваем температуру на датчике
  ds2.requestTemperatures();//опрашиваем температуру на датчике
  //ds3.requestTemperatures();
  lcd.setCursor(8, 0);
  lcd.print(ds1.getTempCByIndex(0), 0);//вывод на экран температуры - 0-не пишется десятичные
  lcd.setCursor(13,0);
  lcd.print(ds2.getTempCByIndex(0), 0);//вывод на экран температуры
  timerDS = millis();//задержка обновления температуры
  }

/*работа с кнопками*/
   //кнопка влево (подсветка)
  if (digitalRead(left) == LOW && curs == 0) {//включение выключение подсветки
    timer = millis();
    light = !light;
    light ? lcd.backlight() : lcd.noBacklight();//включение подсветки
    delay(100);
  }
    else if (digitalRead(left) == LOW && curs != 0){//меню назад
      if (curs < 10){
       timer = millis();
       curs = 0;
       delay(100);
       start();
      }
      else if (curs > 10 && curs <20){
       curs = 1;
       lcd.clear();
       timer = millis();
      }
        else if (curs > 20 && curs <30){
         curs = 2;
         lcd.clear();
         timer = millis();
        }
          else if (curs > 30 && curs <40){
           curs = 3;
           lcd.clear();
           timer = millis();
          }
            else if (curs > 40 && curs <46){
             curs = 4;
             lcd.clear();
             timer = millis();
            }
              else if (curs > 50 && curs <60){
               curs = 5;
               lcd.clear();
               timer = millis();
              }
                else if (curs == 441){
                  curs = 44;
                  lcd.clear();
                  timer = millis();
                }
                  else if (curs == 451){
                   curs = 45;
                   lcd.clear();
                   timer = millis();
                  }
              delay(100);
    }
   //кнопка вверх
  else if (digitalRead(up) == LOW && curs == 0) {//увеличение установленной температуры
    lcd.backlight();//включение подсветки
    timer = millis();
    TUS++;
    EEPROM.put(0, TUS);
    lcd.setCursor(3, 0);
    lcd.print(TUS);
    delay(100);
  }
    else if (digitalRead(up) == LOW && curs != 0 && curs < 440){//пункты меню
     curs ++;
     lcd.clear();
     timer = millis();
     if (curs > 5 && curs <10){
     curs = 1;
     lcd.clear();
     timer = millis();
     }
      else if (curs > 13 && curs <20){
       curs = 11;
       lcd.clear();
       timer = millis();
      }
       else if (curs > 23 && curs <30){
         curs = 21;
         lcd.clear();
         timer = millis();
       }
        else if (curs > 33 && curs <40){
         curs = 31;
         lcd.clear();
         timer = millis();
        }
          else if (curs > 45 && curs <50){
           curs = 41;
           lcd.clear();
           timer = millis();
          }
            else if (curs > 55 && curs < 60){
             curs = 51;
             lcd.clear();
             timer = millis();
            }
     delay(100);
    }
   
   //кнопка вниз
  else if (digitalRead(down) == LOW && curs == 0) {//уменьшение установленной температуры
    lcd.backlight();//включение подсветки
    timer = millis();
    TUS--;
    EEPROM.put(0, TUS);
    lcd.setCursor(3, 0);
    lcd.print(TUS);
    delay(100);
  }
    else if (digitalRead(down) == LOW && curs != 0 && curs < 440){//пункты меню
     curs --;
     lcd.clear();
     timer = millis();
     if (curs < 1){
       curs = 5;
       lcd.clear();
       timer = millis();
     }
      else if (curs < 11 && curs > 9){
       curs = 13;
       lcd.clear();
       timer = millis();
      }
        else if (curs < 21 && curs > 19){
         curs = 23;
         lcd.clear();
         timer = millis();
        }
          else if (curs < 31 && curs > 29){
           curs = 33;
           lcd.clear();
           timer = millis();
          }
            else if (curs < 41 && curs > 39){
             curs = 45;
             lcd.clear();
             timer = millis();
            }
              else if (curs < 51 && curs > 49){
               curs = 55;
               lcd.clear();
               timer = millis();
              }
     delay(100);

    }
  
   //кнопка вправо
  else if (digitalRead(right) == LOW && curs == 0) {//вход в меню
    lcd.backlight();//включение подсветки
    lcd.clear();
    timer = millis();
    curs = 1;//запись в переменную положение курсора
    delay(100);
  }
    else if (digitalRead(right) == LOW && curs != 0){//вход в подменю, подтверждение
      if (curs == 1){
       curs = 11;
       lcd.clear();
       timer = millis();
      }
        if (curs == 2){
         curs = 21;
         lcd.clear();
         timer = millis();
        }
          if (curs == 3){
           curs = 31;
           lcd.clear();
           timer = millis();
          }
            if (curs == 4){
             curs = 41;
             lcd.clear();
             timer = millis();
            }
              if (curs == 5){
               curs = 51;
               lcd.clear();
               timer = millis();
              }
                if (curs == 44){
                  curs = 441;
                  lcd.clear();
                  timer = millis();
                }
                  if (curs == 45){
                   curs = 451;
                   lcd.clear();
                   timer = millis();
                  }
              delay(100);
    }
  

  //меню
  switch (curs){
    case 1:
      lcd.setCursor(0, 0);
      lcd.print("menu");
      lcd.setCursor(0, 1);
      lcd.print("ten1 ");
      lcd.print(ten1);
      lcd.print("          ");
    break;
    case 11:
      lcd.setCursor(0, 0);
      lcd.print("ten1");
      lcd.setCursor(0, 1);
      lcd.print("avtomat      ");
      if(ten1 == 'a'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      } 
      else if (digitalRead(right) == LOW && curs == 11 && ten1 != 'a') EEPROM.put(2, 'a');
    break;
    case 12:
      lcd.setCursor(0, 0);
      lcd.print("ten1");
      lcd.setCursor(0, 1);
      lcd.print("vklucheno      ");
      if(ten1 == '+'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 12 && ten1 != '+') EEPROM.put(2, '+');
    break;
    case 13:
      lcd.setCursor(0, 0);
      lcd.print("ten1");
      lcd.setCursor(0, 1);
      lcd.print("otklucheno     ");
      if(ten1 == '-'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 13 && ten1 != '-') EEPROM.put(2, '-');
    break;
    case 2:
      lcd.setCursor(0, 0);
      lcd.print("menu");
      lcd.setCursor(0, 1);
      lcd.print("ten2 ");
      lcd.print(ten2);
      lcd.print("         ");
    break;
    case 21:
      lcd.setCursor(0, 0);
      lcd.print("ten2");
      lcd.setCursor(0, 1);
      lcd.print("avtomat      ");
      if(ten2 == 'a'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 21 && ten2 != 'a') EEPROM.put(4, 'a');
    break;
    case 22:
      lcd.setCursor(0, 0);
      lcd.print("ten2");
      lcd.setCursor(0, 1);
      lcd.print("vklucheno      ");
      if(ten2 == '+'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 22 && ten2 != '+') EEPROM.put(4, '+');
    break;
    case 23:
      lcd.setCursor(0, 0);
      lcd.print("ten2");
      lcd.setCursor(0, 1);
      lcd.print("otklucheno     ");
      if(ten2 == '-'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 23 && ten2 != '-') EEPROM.put(4, '-');
    break;
    case 3:
      lcd.setCursor(0, 0);
      lcd.print("menu");
      lcd.setCursor(0, 1);
      lcd.print("ten3 ");
      lcd.print(ten3);
      lcd.print("         ");
    break;
    case 31:
      lcd.setCursor(0, 0);
      lcd.print("ten3");
      lcd.setCursor(0, 1);
      lcd.print("avtomat      ");
      if(ten3 == 'a'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 31 && ten3 != 'a') EEPROM.put(6, 'a');
    break;
    case 32:
      lcd.setCursor(0, 0);
      lcd.print("ten3");
      lcd.setCursor(0, 1);
      lcd.print("vklucheno      ");
      if(ten3 == '+'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 32 && ten3 != '+') EEPROM.put(6, '+');
    break;
    case 33:
      lcd.setCursor(0, 0);
      lcd.print("ten3");
      lcd.setCursor(0, 1);
      lcd.print("otklucheno     ");
      if(ten3 == '-'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 33 && ten3 != '-') EEPROM.put(6, '-');
    break;
    case 4:
      lcd.setCursor(0, 0);
      lcd.print("menu");
      lcd.setCursor(0, 1);
      lcd.print("nas  ");
      lcd.print(nas);
      lcd.print("         ");
    break;
    case 41:
      lcd.setCursor(0, 0);
      lcd.print("nasos");
      lcd.setCursor(0, 1);
      lcd.print("avtomat      ");
      if(nas == 'a'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 41 && nas != 'a') EEPROM.put(8, 'a');
    break;
    case 42:
      lcd.setCursor(0, 0);
      lcd.print("nasos");
      lcd.setCursor(0, 1);
      lcd.print("vklucheno      ");
      if(nas == '+'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 42 && nas != '+') EEPROM.put(8, '+');
    break;
    case 43:
      lcd.setCursor(0, 0);
      lcd.print("nasos");
      lcd.setCursor(0, 1);
      lcd.print("otklucheno     ");
      if(nas == '-'){
      lcd.setCursor(14, 1);
      lcd.print('*');
      }
      else if (digitalRead(right) == LOW && curs == 43 && nas != '-') EEPROM.put(8, '-');
    break;
    case 44:
      lcd.setCursor(0, 0);
      lcd.print("nasos");
      lcd.setCursor(0, 1);
      lcd.print("T_VKL_NAS     ");
      EEPROM.get(50, TUNVKL);
      lcd.print(TUNVKL);        
    break;
    case 45:
      lcd.setCursor(0, 0);
      lcd.print("nasos");
      lcd.setCursor(0, 1);
      lcd.print("T_VIKL_NAS    ");
      EEPROM.get(52, TUNVIKL);
      lcd.print(TUNVIKL);
    break;
    case 441:
      lcd.setCursor(0, 0);
      lcd.print("nastroyka");
      lcd.setCursor(0, 1);
      lcd.print("T_VKL_NAS     ");
      EEPROM.get(50, TUNVKL);
      lcd.print(TUNVKL);
      if (digitalRead(up) == LOW && TUNVKL + 5 < 100){
        TUNVKL += 5;
        EEPROM.put(50, TUNVKL);
        delay(100);
      }
        else if (digitalRead(down) == LOW && TUNVKL - 5 > 10){
          TUNVKL -= 5;
          EEPROM.put(50, TUNVKL);
          delay(100);
          if (TUNVIKL >= TUNVKL){
            TUNVIKL = TUNVKL - 5;
            EEPROM.put(52, TUNVIKL);
          }
        }
    break;
    case 451:
      lcd.setCursor(0, 0);
      lcd.print("nastroyka");
      lcd.setCursor(0, 1);
      lcd.print("T_VIKL_NAS    ");
      EEPROM.get(52, TUNVIKL);
      lcd.print(TUNVIKL);
      if (digitalRead(up) == LOW && TUNVIKL + 5 < TUNVKL){
        TUNVIKL += 5;
        EEPROM.put(52, TUNVIKL);
        delay(100);
      }
        else if (digitalRead(down) == LOW && TUNVIKL - 5 > 5){
          TUNVIKL -= 5;
          EEPROM.put(52, TUNVIKL);
          delay(100);
        }
    break;
    case 5:
      lcd.setCursor(0, 0);
      lcd.print("menu            ");
      lcd.setCursor(0, 1);
      lcd.print("narabotka");
    break;
    case 51:
      lcd.setCursor(0, 0);
      lcd.print("vremya raboti");
      lcd.setCursor(0, 1);
      EEPROM.get(10, nar1);
      lcd.print("ten1");
      lcd.setCursor(10, 1);
      if (nar1 / 60 < 1 || nar1 / 60 > 4800) lcd.print("0");
      else lcd.print(nar1 / 60);
    break;
    case 52:
      lcd.setCursor(0, 0);
      lcd.print("vremya raboti");
      lcd.setCursor(0, 1);
      EEPROM.get(20, nar2);
      lcd.print("ten2");
      lcd.setCursor(10, 1);
      if (nar2 / 60 < 1 || nar2 / 60 > 4800) lcd.print("0");
      else lcd.print(nar2 / 60);
    break;
    case 53:
      lcd.setCursor(0, 0);
      lcd.print("vremya raboti");
      lcd.setCursor(0, 1);
      EEPROM.get(30, nar3);
      lcd.print("ten3");
      lcd.setCursor(10, 1);
      if (nar3 / 60 < 1 || nar3 / 60 > 4800) lcd.print("0");
      else lcd.print(nar3 / 60);
    break;
    case 54:
      lcd.setCursor(0, 0);
      lcd.print("vremya raboti");
      lcd.setCursor(0, 1);
      EEPROM.get(40, narn);
      lcd.print("nas");
      lcd.setCursor(10, 1);
      if (narn / 60 < 1 || nar1 / 60 > 4800) lcd.print("0");
      else lcd.print(narn / 60);
    break;
    case 55:
      lcd.setCursor(0, 0);
      lcd.print("vremya raboti");
      lcd.setCursor(0, 1);
      lcd.print("sbrosit' vremya");
      if (digitalRead(right) == LOW && curs == 55){
      EEPROM.put(10, 0);
      delay(100);
      EEPROM.put(20, 0);
      delay(100);
      EEPROM.put(30, 0);
      delay(100);
      EEPROM.put(40, 0);
      delay(100);
      lcd.clear();
      lcd.print("sbrosheno");
      delay(2000);
      curs = 51;
      }
    break;
  }
  
  //сброс действий
  if(timer + 10000 <= millis() && !light) lcd.noBacklight(); //считаем время после включения или после нажатия кнопки//отключение подсветки
  //обновление экрана
  if(zads + 60000 <= millis() && timer + 60000 <= millis()){//задержка обновления экрана
   curs = 0;
   start();
  }
  if(timer + 10000 <= millis() && curs != 0){//выход из меню по времени
    curs = 0;
    start();
  }
  

rele();

}



/*работа реле*/
void rele(){
  EEPROM.get(2, ten1);//опрос памяти состояня реле
  EEPROM.get(4, ten2);
  EEPROM.get(6, ten3);
  EEPROM.get(8, nas);
  
 /*rele1*/
  if (ten1 == '+' && curs == 0){ //если реле принудительно включено
    digitalWrite(rel1, 1);
    lcd.setCursor(2, 1);
    lcd.print('+');
    lcd.setCursor(2, 1);
    if (flag1 != 1){//установка флага состояния реле для счета времени
      flag1 = 1;
      zadp1 = millis();
    }
    else if(zadp1 + 600000 <= millis()){//считаем время работы реле 10 минутными отрезками
      nar1 += 10;
      EEPROM.put(10, nar1);
      zadp1 = millis();
    }
  }
    else if (ten1 == '-' && curs == 0){ //принудительное выключение реле
      digitalWrite(rel1, 0);
      lcd.setCursor(2, 1);
      lcd.print('-');
      lcd.setCursor(2, 1);
      flag1 = 0;
    }//автоматический режим работы по установленной температуре
      else if (ten1 == 'a' && curs == 0 && TUS > ds1.getTempCByIndex(0) && millis() > 15000){ 
        digitalWrite(rel1, 1);
        lcd.setCursor(2, 1);
        lcd.print('+');
        lcd.setCursor(2, 1);
        if (flag1 != 1){
          flag1 = 1;
          zadp1 = millis();
        }
          else if(zadp1 + 600000 <= millis()){
            nar1 += 10;
            EEPROM.put(10, nar1);
            zadp1 = millis();
          }
      }
        else if(ten1 == 'a' && curs == 0 && TUS <= ds1.getTempCByIndex(0) && millis() > 15000){
          digitalWrite(rel1, 0);
          lcd.setCursor(2, 1);
          lcd.print('-');
          lcd.setCursor(2, 1);
          flag1 = 0;
        }

 /*rele2*/
  if (ten2 == '+' && curs == 0){ 
    digitalWrite(rel2, 1);
    lcd.setCursor(6, 1);
    lcd.print('+');
    lcd.setCursor(6, 1);
    if (flag2 != 1){
      flag2 = 1;
      zadp2 = millis();
    }
      else if(zadp2 + 600000 <= millis()){
        nar2 += 10;
        EEPROM.put(20, nar2);
        zadp2 = millis();
      }
  }
    else if (ten2 == '-' && curs == 0){ 
      digitalWrite(rel2, 0);
      lcd.setCursor(6, 1);
      lcd.print('-');
      lcd.setCursor(6, 1);
      flag2 = 0;
    }
      else if (ten2 == 'a' && curs == 0 && TUS-1 > ds1.getTempCByIndex(0) && millis() > 15000){ 
        digitalWrite(rel2, 1);
        lcd.setCursor(6, 1);
        lcd.print('+');
        lcd.setCursor(6, 1);
        if (flag2 != 1){
          flag2 = 1;
          zadp2 = millis();
        }
          else if(zadp2 + 600000 <= millis()){
            nar2 += 10;
            EEPROM.put(20, nar2);
            zadp2 = millis();
          }
      }
        else if(ten2 == 'a' && curs == 0 && TUS <= ds1.getTempCByIndex(0) && millis() > 15000){
          digitalWrite(rel2, 0);
          lcd.setCursor(6, 1);
          lcd.print('-');
          lcd.setCursor(6, 1);
          flag2 = 0;
        }

  /*rele3*/
  if (ten3 == '+' && curs == 0){ 
    digitalWrite(rel3, 1);
    lcd.setCursor(10, 1);
    lcd.print('+');
    lcd.setCursor(10, 1);
      if (flag3 != 1){
        flag3 = 1;
        zadp3 = millis();
      }
        else if(zadp3 + 600000 <= millis()){
          nar3 += 10;
          EEPROM.put(30, nar3);
          zadp3 = millis();
        }
  }
    if (ten3 == '-' && curs == 0){ 
      digitalWrite(rel3, 0);
      lcd.setCursor(10, 1);
      lcd.print('-');
      lcd.setCursor(10, 1);
      flag3 = 0;
    }
      else if (ten3 == 'a' && curs == 0 && TUS-2 > ds1.getTempCByIndex(0) && millis() > 15000){ 
        digitalWrite(rel3, 1);
        lcd.setCursor(10, 1);
        lcd.print('+');
        lcd.setCursor(10, 1);
        if (flag3 != 1){
          flag3 = 1;
          zadp3 = millis();
        }
          else if(zadp3 + 600000 <= millis()){
            nar3 += 10;
            EEPROM.put(30, nar3);
            zadp3 = millis();
          }
      }
        else if(ten3 == 'a' && curs == 0 && TUS <= ds1.getTempCByIndex(0) && millis() > 15000){
          digitalWrite(rel3, 0);
          lcd.setCursor(10, 1);
          lcd.print('-');
          lcd.setCursor(10, 1);
          flag3 = 0;
        }


  /*rele4*/
  if (nas == '+' && curs == 0){ 
    digitalWrite(reln, 0);
    lcd.setCursor(15, 1);
    lcd.print('+');
    lcd.setCursor(15, 1);
    if (flagn != 1){
      flagn = 1;
      zadpn = millis();
    }
      else if(zadpn + 600000 <= millis()){
        narn += 10;
        EEPROM.put(40, narn);
        zadpn = millis();
      }
  }
    else if (nas == '-' && curs == 0){ 
      digitalWrite(reln, 1);
      lcd.setCursor(15, 1);
      lcd.print('-');
      lcd.setCursor(15, 1);
      flagn = 0;
    }
      else if (nas == 'a' && curs == 0 && ds2.getTempCByIndex(0) >= TUNVKL && millis() > 15000){ 
        digitalWrite(reln, 0);
        lcd.setCursor(15, 1);
        lcd.print('+');
        lcd.setCursor(15, 1);
        if (flagn != 1){
          flagn = 1;
          zadpn = millis();
        }
          else if(zadpn + 600000 <= millis()){
            narn += 10;
            EEPROM.put(40, narn);
            zadpn = millis();
          }
      }
        else if(nas == 'a' && curs == 0 && ds2.getTempCByIndex(0) <= TUNVIKL && millis() > 15000){
          digitalWrite(reln, 1);
          lcd.setCursor(15, 1);
          lcd.print('-');
          lcd.setCursor(15, 1);
          flagn = 0;
        }
}

 



void start(){
  /*показания (прорисовка внешнего вида) данных на экране*/
  lcd.clear();
  lcd.print("tus");//температура установленная
  lcd.setCursor(3, 0);
  lcd.print(TUS);//пишем температуру
  lcd.setCursor(6, 0);
  lcd.print("tk");//температура комнаты
  lcd.setCursor(11, 0);
  lcd.print("tv");//температура воды
  lcd.setCursor(0, 1);
  lcd.print("1 ");//1 тэн
  lcd.setCursor(1, 1);
  lcd.print(ten1);//пишем состояние
  lcd.setCursor(4, 1);
  lcd.print("2 ");//2 тэн
  lcd.setCursor(5, 1);
  lcd.print(ten2);//пишем состояние
  lcd.setCursor(8, 1);
  lcd.print("3 ");//3 тэн
  lcd.setCursor(9, 1);
  lcd.print(ten3);//пишем состояние
  lcd.setCursor(13, 1);
  lcd.print("N ");//насос
  lcd.setCursor(14, 1);
  lcd.print(nas);
  ds1.requestTemperatures();//опрашиваем температуру на датчике комнаты
  ds2.requestTemperatures();//опрашиваем температуру на датчике воды
  lcd.setCursor(8, 0);
  lcd.print(ds1.getTempCByIndex(0), 0);//вывод на экран температуры - 0-не пишется десятичные
  lcd.setCursor(13,0);
  lcd.print(ds2.getTempCByIndex(0), 0);//вывод на экран температуры
  zads = millis();
}
$abcdeabcde151015202530354045505560fghijfghij
$abcdeabcde151015202530fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module