Автополив c дистанционным управлением Mega+ESP8266+RemoteXY

Spee
Offline
Зарегистрирован: 20.10.2021

Приветствую всех. Коротко о ситуации. Нужно было дистанционное управление поливом. Нужно - сделал.

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

От местных хотелось бы получить критику и советы. Так как я глубокий чайник, хотелось бы услышать, что то типо "так нормальные люди не делают, нормально делать так..."

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

//модуль RTC
#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS1307);
//датчики температуры и влажности
#include <TroykaDHT.h>
DHT dhtbig(48, DHT21);
DHT dhtlitle(49, DHT21);
//пины
#define PIN_SWITCH_NPK_IN 25
#define PIN_SWITCH_NPK_OUT 27
#define PIN_SWITCH_NPK_LITLE 29
#define PIN_BUTTON_BLEND_BIG 31
#define PIN_BUTTON_BLEND_LITLE 33
#define PIN_DETECT_IN_BIG 35
#define PIN_DETECT_OUT_BIG 37
#define PIN_DETECT_LITLE 39
//макрос таймера
#define PERIOD_UNO 2000
#define PERIOD_PrintDayOfRun 360000
#define PERIOD_UNIX 20000
uint32_t timer_uno = 0;
uint32_t timer_PrintDayOfRun = 0;
uint32_t timer_unix = 0;
//переменные ввода времени
int Y, M, D, h, m;
//флаги кнопок
bool flag_button_set_time_watch, flag_button_set_date_of_start, flag_button_set_watering_time_big, flag_button_set_watering_time_litle;
//адреса хранения данных в EEPROM
#include <EEPROM.h>
int adres_Date_of_start_Y = 0;
int adres_Date_of_start_M = 2;
int adres_Date_of_start_D = 4;
int adres_last_watering_big_Y = 6;
int adres_last_watering_big_M = 8;
int adres_last_watering_big_D = 10;
int adres_last_watering_big_h = 12;
int adres_last_watering_big_m = 14;
int adres_next_watering_big_Y = 16;
int adres_next_watering_big_M = 18;
int adres_next_watering_big_D = 20;
int adres_next_watering_big_h = 22;
int adres_next_watering_big_m = 24;
int adres_last_watering_litle_Y = 26;
int adres_last_watering_litle_M = 28;
int adres_last_watering_litle_D = 30;
int adres_last_watering_litle_h = 32;
int adres_last_watering_litle_m = 34;
int adres_next_watering_litle_Y = 36;
int adres_next_watering_litle_M = 38;
int adres_next_watering_litle_D = 40;
int adres_next_watering_litle_h = 42;
int adres_next_watering_litle_m = 44;
//SD карта
#include <SD.h>
#include <SPI.h>
File myFile;
char ssidStr[20];
char passwStr[20];
char tokenStr[35];
// определение режима соединения и подключение библиотеки RemoteXY 
#define REMOTEXY_MODE__ESP8266_HARDSERIAL_CLOUD
#include <RemoteXY.h>
// настройки соединения 
#define REMOTEXY_SERIAL Serial1
#define REMOTEXY_SERIAL_SPEED 115200
const char*REMOTEXY_WIFI_SSID;
const char*REMOTEXY_WIFI_PASSWORD;
#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com"
#define REMOTEXY_CLOUD_PORT 6376
const char*REMOTEXY_CLOUD_TOKEN;
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,19,0,15,1,68,4,13,26,5,
  130,2,0,0,63,10,0,25,130,1,
  0,91,63,9,0,25,131,1,1,92,
  14,7,1,130,16,105,110,102,111,0,
  131,0,50,92,11,7,2,14,16,226,
  154,153,239,184,143,0,67,1,0,1,
  63,8,0,16,25,21,130,1,1,11,
  61,30,1,28,129,0,51,12,10,6,
  1,0,66,105,103,0,129,0,54,19,
  5,2,1,0,66,79,88,0,67,0,
  3,12,43,5,1,31,26,21,67,0,
  3,17,43,5,1,31,26,21,67,0,
  24,27,8,4,1,31,27,4,129,0,
  3,27,21,4,1,29,68,97,121,32,
  111,102,32,114,117,110,58,0,131,0,
  17,92,31,7,3,131,16,84,69,78,
  84,83,0,129,0,48,77,2,6,2,
  16,58,0,129,0,24,77,2,6,2,
  16,45,0,129,0,13,77,2,6,2,
  16,45,0,129,0,40,73,8,3,2,
  16,104,111,117,114,115,0,129,0,52,
  73,6,3,2,16,109,105,110,0,129,
  0,6,73,5,3,2,16,100,97,121,
  0,129,0,15,73,9,3,2,16,109,
  111,110,116,104,0,129,0,27,73,7,
  3,2,16,121,101,97,114,0,1,3,
  3,13,57,6,2,44,16,115,101,116,
  32,116,105,109,101,32,119,97,116,99,
  104,0,130,1,1,12,61,32,3,28,
  2,0,3,14,34,7,3,5,26,31,
  31,73,78,0,78,80,75,0,2,0,
  3,23,34,7,3,41,26,31,31,79,
  85,84,0,78,80,75,0,70,35,39,
  14,15,16,3,26,133,39,34,1,3,
  26,28,34,6,2,128,16,115,101,116,
  32,100,97,116,101,32,111,102,32,114,
  117,110,0,67,5,26,22,34,5,2,
  16,27,13,130,0,24,21,1,14,2,
  28,130,0,61,11,1,79,2,28,130,
  0,2,35,59,1,2,28,130,0,2,
  20,59,1,2,28,129,0,3,31,27,
  4,1,29,76,97,115,116,32,119,97,
  116,101,114,105,110,103,58,0,67,0,
  25,23,27,4,1,31,30,11,130,0,
  2,53,59,1,2,28,130,0,1,11,
  1,79,2,28,1,3,3,45,57,7,
  2,5,16,115,101,116,32,119,97,116,
  101,114,105,110,103,32,116,105,109,101,
  32,98,105,103,32,98,111,120,0,67,
  5,5,26,16,8,2,16,27,4,129,
  0,6,22,14,3,2,30,68,97,121,
  32,111,102,32,114,117,110,0,67,5,
  3,37,57,7,2,16,27,21,130,0,
  2,11,59,1,2,28,7,21,39,77,
  9,7,2,16,27,2,7,21,50,77,
  9,7,2,16,27,2,7,21,4,77,
  9,7,2,16,27,2,7,21,15,77,
  9,7,2,16,27,2,7,21,26,77,
  9,7,2,16,27,2,129,0,28,85,
  6,3,2,16,48,45,57,57,0,129,
  0,17,85,6,3,2,16,49,45,49,
  50,0,129,0,6,85,6,3,2,16,
  49,45,51,49,0,129,0,52,85,6,
  3,2,16,48,45,53,57,0,129,0,
  41,85,6,3,2,16,48,45,50,51,
  0,129,0,3,35,27,4,1,29,78,
  101,120,116,32,119,97,116,101,114,105,
  110,103,58,0,130,1,1,45,61,26,
  3,28,70,19,43,47,10,10,3,26,
  133,2,2,0,3,47,38,10,3,5,
  26,31,31,73,78,0,78,80,75,0,
  67,5,3,55,57,7,2,16,27,21,
  1,3,3,63,57,7,2,5,16,115,
  101,116,32,119,97,116,101,114,105,110,
  103,32,116,105,109,101,32,108,105,116,
  108,101,32,98,111,120,0,130,0,2,
  71,59,1,2,28,67,0,30,31,22,
  4,1,31,26,21,67,0,30,35,22,
  4,1,31,26,21,130,1,1,43,61,
  23,1,28,129,0,54,49,5,2,1,
  0,66,79,88,0,129,0,51,44,10,
  5,1,0,76,105,116,108,101,0,129,
  0,3,55,27,4,1,29,76,97,115,
  116,32,119,97,116,101,114,105,110,103,
  58,0,129,0,3,60,27,4,1,29,
  78,101,120,116,32,119,97,116,101,114,
  105,110,103,58,0,67,0,30,55,21,
  4,1,31,26,21,67,0,30,60,21,
  4,1,31,26,21,67,0,3,44,43,
  5,1,31,26,21,67,0,3,49,43,
  5,1,31,26,21,129,0,3,23,18,
  4,1,29,68,97,116,101,32,111,102,
  32,114,117,110,58,0,129,0,56,13,
  5,3,3,0,66,105,103,0,129,0,
  55,46,6,3,3,0,76,105,116,108,
  101,0,130,2,2,32,59,11,3,0,
  2,1,5,34,43,7,3,0,26,31,
  31,77,73,88,0,78,80,75,0,70,
  18,51,34,7,7,3,26,31,2,130,
  2,2,59,59,11,3,0,2,1,5,
  61,43,7,3,0,26,31,31,77,73,
  88,0,78,80,75,0,70,18,51,61,
  7,7,3,26,31,2,70,35,51,19,
  2,2,1,26,133,39,34,70,19,51,
  49,2,2,1,26,133,2,70,18,59,
  19,2,2,1,26,31,2,70,18,59,
  49,2,2,1,26,31,2,129,0,57,
  16,4,2,3,0,66,79,88,0,129,
  0,57,49,5,2,3,0,66,79,88,
  0,130,0,2,89,59,1,2,28 };
  
// структура определяет все переменные и события вашего интерфейса управления 
struct {

    // input variables
  uint8_t button_set_time_watch; // =1 если кнопка нажата, иначе =0 
  uint8_t switch_npk_in; // =1 если переключатель включен и =0 если отключен 
  uint8_t switch_npk_out; // =1 если переключатель включен и =0 если отключен 
  uint8_t button_set_date_of_start; // =1 если кнопка нажата, иначе =0 
  uint8_t button_set_watering_time_big; // =1 если кнопка нажата, иначе =0 
  int16_t edit_time_h;  // 32767.. +32767 
  int16_t edit_time_m;  // 32767.. +32767 
  int16_t edit_time_D;  // 32767.. +32767 
  int16_t edit_time_M;  // 32767.. +32767 
  int16_t edit_time_Y;  // 32767.. +32767 
  uint8_t switch_npk_litle; // =1 если переключатель включен и =0 если отключен 
  uint8_t button_set_watering_time_litle; // =1 если кнопка нажата, иначе =0 
  uint8_t switch_mix_big; // =1 если переключатель включен и =0 если отключен 
  uint8_t switch_mix_litle; // =1 если переключатель включен и =0 если отключен 

    // output variables
  char text_watch_all[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_H_Big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_T_Big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_day_of_run[4];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_npk_big; // led state 0 .. 2 
  char text_date_of_startDUBLE[13];  // =строка UTF8 оканчивающаяся нулем 
  char text_date_of_start[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_day_of_runDUBLE[4];  // =строка UTF8 оканчивающаяся нулем 
  char text_watering_time_bigDUBLE[21];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_npk_litle; // led state 0 .. 1 
  char text_watering_time_litleDUBLE[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_last_watering_big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_watering_time_big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_last_watering_litle[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_watering_time_litle[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_H_Litle[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_T_Litle[21];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_mix_big; // led state 0 .. 1 
  uint8_t led_mix_litle; // led state 0 .. 1 
  uint8_t led_npk_bigD; // led state 0 .. 2 
  uint8_t led_npk_litleD; // led state 0 .. 1 
  uint8_t led_mix_bigD; // led state 0 .. 1 
  uint8_t led_mix_litleD; // led state 0 .. 1 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)  
void setup(){
  //читаем с SD card имя сети, пароль сети и токен RemoteXY для подключения
  Serial.begin(115200);
  while (!Serial) {
    ;
  }
  if (!SD.begin(53)) {
    while (1);
  }
  //имя сети
  myFile = SD.open("ssid.txt");
  if (myFile) {
    int i = 0;
    while (myFile.available()) {
      char buff = myFile.read();
      ssidStr[i] = buff;
      i++;
    }
    ssidStr[i] = 0;         
    REMOTEXY_WIFI_SSID = ssidStr;
  }
  myFile.close();
  //пароль сети
  myFile = SD.open("pass.txt");
  if (myFile) {
    int i = 0;
    while (myFile.available()) {
      char buff = myFile.read();
      passwStr[i] = buff;
      i++;
    }
    passwStr[i] = 0;
    REMOTEXY_WIFI_PASSWORD = passwStr;
  }
  myFile.close();
  //токен RemoteXY
  myFile = SD.open("token.txt");
  if (myFile) {
    int i = 0;
    while (myFile.available()) {
    char buff = myFile.read();
    tokenStr[i] = buff;
    i++;
  }
  tokenStr[i] = 0;
  REMOTEXY_CLOUD_TOKEN = tokenStr;
  }
  myFile.close();
  //подключаемся
  remotexy = new CRemoteXY (
    RemoteXY_CONF_PROGMEM, 
    &RemoteXY, 
    "", 
    new CRemoteXYConnectionCloud (
      new CRemoteXYComm_ESP8266 (
        new CRemoteXYStream_HardSerial ( 
          &Serial1, 115200),REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD),REMOTEXY_CLOUD_SERVER,6376,REMOTEXY_CLOUD_TOKEN));

  //инициируем модуль RTC
  watch.begin();
//определяемся с пинами
  //полив большая палатка
  pinMode (PIN_SWITCH_NPK_IN, OUTPUT);
  digitalWrite(PIN_SWITCH_NPK_IN, HIGH);
  pinMode (PIN_DETECT_IN_BIG, INPUT_PULLUP);
  //слив большая палатка
  pinMode (PIN_SWITCH_NPK_OUT, OUTPUT);
  digitalWrite(PIN_SWITCH_NPK_OUT, HIGH);
  pinMode (PIN_DETECT_OUT_BIG, INPUT_PULLUP);
  //перемешивание большая бочка
  pinMode (PIN_BUTTON_BLEND_BIG, OUTPUT);
  digitalWrite(PIN_BUTTON_BLEND_BIG, HIGH);
  //полив малая палатка
  pinMode (PIN_SWITCH_NPK_LITLE, OUTPUT);
  digitalWrite(PIN_SWITCH_NPK_LITLE, HIGH);
  pinMode (PIN_DETECT_LITLE, INPUT_PULLUP);
  //перемешивание малая бочка
  pinMode (PIN_BUTTON_BLEND_LITLE, OUTPUT);
  digitalWrite(PIN_BUTTON_BLEND_LITLE, HIGH);
  //выводим сохраненные установки
  PrintNextWateringBig();
  PrintNextWateringLitle();
  PrintLastWateringBig();
  PrintLastWateringLitle();
  PrintStartDateBig();
  PrintDayOfRun();
}
void loop() {
  RemoteXY_Handler ();
  UpdatePeriodUno();
  UpdatePeriodDuo();
  UpdatePeriodNextWatering();
  Blend();
  SetTimeWatch();
  SetDateOfStart();
  SetSaveNextWateringBig();
  SetSaveNextWateringLitle();
  SwitchINnpk();
  SwitchOUTnpk();
  SwitchINlitle();
}
//установка времени
void UpdateTimeWatch() {
  ReadEditTime();
  watch.settime(-1, m, h, D, M, Y);
}
//автополив большой палатки по дате и времени
void UnixTimeWateringBig(){
  watch.gettime();
  int god = watch.year;
  int mes = watch.month;
  int den = watch.day;
  int chas = watch.Hours;
  int minut = watch.minutes;
  int godnew = EEPROM.read(adres_next_watering_big_Y);
  int mesnew = EEPROM.read(adres_next_watering_big_M);
  int dennew = EEPROM.read(adres_next_watering_big_D);
  int chasnew = EEPROM.read(adres_next_watering_big_h);
  int minutnew = EEPROM.read(adres_next_watering_big_m);
  if (god == godnew && mes == mesnew && den == dennew && chas == chasnew && minut == minutnew){
    RemoteXY.switch_npk_in = 1;
    UpdateNextWateringBig();
  }
} 
////автополив малой палатки по дате и времени
void UnixTimeWateringLitle(){
  watch.gettime();
  int god = watch.year;
  int mes = watch.month;
  int den = watch.day;
  int chas = watch.Hours;
  int minut = watch.minutes;
  int godn = EEPROM.read(adres_next_watering_litle_Y);
  int mesn = EEPROM.read(adres_next_watering_litle_M);
  int denn = EEPROM.read(adres_next_watering_litle_D);
  int chasn = EEPROM.read(adres_next_watering_litle_h);
  int minutn = EEPROM.read(adres_next_watering_litle_m);
  if (god == godn && mes == mesn && den == denn && chas == chasn && minut == minutn){
    UpdateNextWateringLitle();
    RemoteXY.switch_npk_litle = 1;
  }
}
//устанавливаем следующий полив большой палатки через 3 дня
void UpdateNextWateringBig(){
  watch.gettime();
  int newMont, dayPlus;
  if (watch.month == 2) {
    newMont = 28;
  } else if (watch.month == 1 || watch.month == 3 || watch.month == 5 || watch.month == 7 || watch.month == 8 || watch.month == 10 || watch.month == 12) {
    newMont = 31;
  } else newMont = 30;  
  int newD = watch.day;
  int newM = watch.month;
  int newY = watch.year;  
  newD = newD+3;
  if (newD>newMont){
    newD = newD - newMont;
    newM = newM+1;
    if (newM>12){
      newM = 1;
      newY = newY+1;
    }  
  }
  EEPROM.update(adres_next_watering_big_Y,newY);
  EEPROM.update(adres_next_watering_big_M,newM);
  EEPROM.update(adres_next_watering_big_D,newD);
  PrintNextWateringBig();
}
//устанавливаем следующий полив малой палатки через 3 дня
void UpdateNextWateringLitle(){
  watch.gettime();
  int newMont, dayPlus;
  if (watch.month == 2) {
    newMont = 28;
  } else if (watch.month == 1 || watch.month == 3 || watch.month == 5 || watch.month == 7 || watch.month == 8 || watch.month == 10 || watch.month == 12) {
    newMont = 31;
  } else newMont = 30;  
  int newD = watch.day;
  int newM = watch.month;
  int newY = watch.year;   
  newD = newD+3;
  if (newD>newMont){
    newD = newD - newMont;
    newM = newM+1;
    if (newM>12){
      newM = 1;
      newY = newY+1;
    }  
  }
  EEPROM.update(adres_next_watering_litle_Y,newY);
  EEPROM.update(adres_next_watering_litle_M,newM);
  EEPROM.update(adres_next_watering_litle_D,newD);
  PrintNextWateringLitle();
}
//обновляем отображаемое время и данные датчиков температуры и влажности
void UpdatePeriodUno(){
  if (millis() - timer_uno >= PERIOD_UNO) {
    WatchTime();
    UpdateDHT();
    do {
      timer_uno += PERIOD_UNO;
      if (timer_uno < PERIOD_UNO) break;
    } while (timer_uno < millis() - PERIOD_UNO);
  }
}
//обновляем количество дней прошедшее от установленной даты старта
void UpdatePeriodDuo(){
  if (millis() - timer_PrintDayOfRun >= PERIOD_PrintDayOfRun) {
    PrintDayOfRun();
    do {
      timer_PrintDayOfRun += PERIOD_PrintDayOfRun;
      if (timer_PrintDayOfRun < PERIOD_PrintDayOfRun) break;
    } while (timer_PrintDayOfRun < millis() - PERIOD_PrintDayOfRun);
  }
}
//проверяем не пора ли включить автополив
void UpdatePeriodNextWatering(){
  if (millis() - timer_unix >= PERIOD_UNIX) {
    UnixTimeWateringBig();
    UnixTimeWateringLitle();
    do {
      timer_unix += PERIOD_UNIX;
      if (timer_unix < PERIOD_UNIX) break;
    } while (timer_unix < millis() - PERIOD_UNIX);
  }
}
//считываем инфу с датчиков темп. и влаж.
void UpdateDHT(){
  dhtbig.read();
  if (dhtbig.getState() == DHT_OK) {
    String valueHumBIGstring(dhtbig.getHumidity(), 1);
    const char * valueHumBIG = valueHumBIGstring.c_str();
    sprintf(RemoteXY.text_H_Big, "Humidity: %s%%" , valueHumBIG);
    String valueTempBIGstring(dhtbig.getTemperatureC(), 1);
    const char * valueTempBIG = valueTempBIGstring.c_str();
    sprintf(RemoteXY.text_T_Big, "Temperature: %s°" , valueTempBIG);
  } else {
    sprintf(RemoteXY.text_H_Big, "NO");
    sprintf(RemoteXY.text_T_Big, "SENSOR");
  }
  dhtlitle.read();
  if (dhtlitle.getState() == DHT_OK) {
    String valueHumLITLEstring(dhtlitle.getHumidity(), 1);
    const char * valueHumLITLE = valueHumLITLEstring.c_str();
    sprintf(RemoteXY.text_H_Litle, "Humidity: %s%%" , valueHumLITLE);
    String valueTempLITLEstring(dhtlitle.getTemperatureC(), 1);
    const char * valueTempLITLE = valueTempLITLEstring.c_str();
    sprintf(RemoteXY.text_T_Litle, "Temperature: %s°" , valueTempLITLE);
  } else {
    sprintf(RemoteXY.text_H_Litle, "NO");
    sprintf(RemoteXY.text_T_Litle, "SENSOR");
  }
}
//перемешивание большой и малой бочки
void Blend(){
  switch(RemoteXY.switch_mix_big){
    case 0:
        digitalWrite(PIN_BUTTON_BLEND_BIG, HIGH);
        RemoteXY.led_mix_big = 0;
        RemoteXY.led_mix_bigD = 0;
        break;
    case 1:
        digitalWrite(PIN_BUTTON_BLEND_BIG, LOW);
        RemoteXY.led_mix_big = 1;
        RemoteXY.led_mix_bigD = 1;
        break;
  }
  switch(RemoteXY.switch_mix_litle){
    case 0:
        digitalWrite(PIN_BUTTON_BLEND_LITLE, HIGH);
        RemoteXY.led_mix_litle = 0;
        RemoteXY.led_mix_litleD = 0;
        break;
    case 1:
        digitalWrite(PIN_BUTTON_BLEND_LITLE, LOW);
        RemoteXY.led_mix_litle = 1;
        RemoteXY.led_mix_litleD = 1;
        break;
  }
}
//сохраняем последний полив большой палатки
void SaveLastWateringBig() {
  watch.gettime();
  EEPROM.update(adres_last_watering_big_Y, watch.year);
  EEPROM.update(adres_last_watering_big_M, watch.month);
  EEPROM.update(adres_last_watering_big_D, watch.day);
  EEPROM.update(adres_last_watering_big_h, watch.Hours);
  EEPROM.update(adres_last_watering_big_m, watch.minutes);
}
//сохраняем последний полив малой палатки
void SaveLastWateringLitle() {
  watch.gettime();
  EEPROM.update(adres_last_watering_litle_Y, watch.year);
  EEPROM.update(adres_last_watering_litle_M, watch.month);
  EEPROM.update(adres_last_watering_litle_D, watch.day);
  EEPROM.update(adres_last_watering_litle_h, watch.Hours);
  EEPROM.update(adres_last_watering_litle_m, watch.minutes);
}
//сохраняем следующий полив большой палатки
void SaveNextWateringBig() {
  ReadEditTime();
  EEPROM.update(adres_next_watering_big_Y, Y);
  EEPROM.update(adres_next_watering_big_M, M);
  EEPROM.update(adres_next_watering_big_D, D);
  EEPROM.update(adres_next_watering_big_h, h);
  EEPROM.update(adres_next_watering_big_m, m);
}
//сохраняем следующий полив малой палатки
void SaveNextWateringLitle() {
  ReadEditTime();
  EEPROM.update(adres_next_watering_litle_Y, Y);
  EEPROM.update(adres_next_watering_litle_M, M);
  EEPROM.update(adres_next_watering_litle_D, D);
  EEPROM.update(adres_next_watering_litle_h, h);
  EEPROM.update(adres_next_watering_litle_m, m);
}
//сохраняем дату старта большой палатки
void SaveStartDateBig() {
  ReadEditTime();
  EEPROM.update(adres_Date_of_start_Y, Y);
  EEPROM.update(adres_Date_of_start_M, M);
  EEPROM.update(adres_Date_of_start_D, D);
}
//кнопка установки времени
void SetTimeWatch() {
  bool button_set_time_watch = RemoteXY.button_set_time_watch;
  if (button_set_time_watch && !flag_button_set_time_watch) {
    flag_button_set_time_watch = true;
    UpdateTimeWatch();
  }
  if (!button_set_time_watch && flag_button_set_time_watch) {
    flag_button_set_time_watch = false; 
  }
}
//кнопка установки даты начала цикла
void SetDateOfStart() {
  bool button_set_date_of_start = RemoteXY.button_set_date_of_start;
  if (button_set_date_of_start && !flag_button_set_date_of_start) {
    flag_button_set_date_of_start = true;
    SaveStartDateBig();
    PrintStartDateBig();
    PrintDayOfRun();
  }
  if (!button_set_date_of_start && flag_button_set_date_of_start) {
    flag_button_set_date_of_start = false;
  }
}
//кнопка установки даты и времени следующего полива большой палатки
void SetSaveNextWateringBig() {
  bool button_set_watering_time_big = RemoteXY.button_set_watering_time_big;
  if (button_set_watering_time_big && !flag_button_set_watering_time_big) {
    flag_button_set_watering_time_big = true;
    SaveNextWateringBig();
    PrintNextWateringBig();
  }
  if (!button_set_watering_time_big && flag_button_set_watering_time_big) {
    flag_button_set_watering_time_big = false;
  }
}
//кнопка установки даты и времени следующего полива малой палатки
void SetSaveNextWateringLitle() {
  bool button_set_watering_time_litle = RemoteXY.button_set_watering_time_litle;
  if (button_set_watering_time_litle && !flag_button_set_watering_time_litle) {
    flag_button_set_watering_time_litle = true;
    SaveNextWateringLitle();
    PrintNextWateringLitle();
  }
  if (!button_set_watering_time_litle && flag_button_set_watering_time_litle) {
    flag_button_set_watering_time_litle = false;
  }
}
//Cloud переключатель полива большой палатки
void SwitchINnpk() {
  switch (RemoteXY.switch_npk_in) {
    case 0:
      {
        digitalWrite(PIN_SWITCH_NPK_IN, HIGH);
        if (RemoteXY.switch_npk_out == 0) {
          RemoteXY.led_npk_big = 0;
          RemoteXY.led_npk_bigD = 0;
        }
        break;
      }
    case 1:
       {
        if (RemoteXY.switch_npk_out == 1){
          RemoteXY.switch_npk_in = 0;
          break;
        }else if (RemoteXY.switch_npk_out == 0){
          digitalWrite(PIN_SWITCH_NPK_IN, LOW); 
          RemoteXY.led_npk_big = 1;
          RemoteXY.led_npk_bigD = 1;
          if (DETECT_IN_BIG()){
            SaveLastWateringBig();
            PrintLastWateringBig();
            UpdateNextWateringBig();
            RemoteXY.switch_npk_in = 0;
            RemoteXY.switch_npk_out = 1;
          }          
        }
        break;
  }
  }
}
//читаем датчик уровня полива большой палатки
bool DETECT_IN_BIG(){
  bool IN_BIG;
  if (digitalRead(PIN_DETECT_IN_BIG)==1){
    IN_BIG = false;
  }else if (digitalRead(PIN_DETECT_IN_BIG)==0){
    IN_BIG = true;
  }
  return IN_BIG;
}
//Cloud переключатель слива большой палатки
void SwitchOUTnpk() {  
  switch (RemoteXY.switch_npk_out) {
    case 0:
    {
        digitalWrite(PIN_SWITCH_NPK_OUT, HIGH);
        if (RemoteXY.switch_npk_in == 0) {
          RemoteXY.led_npk_big = 0;
          RemoteXY.led_npk_bigD = 0;
          break;
        }
        break;
    }
    case 1:
    {
        if (RemoteXY.switch_npk_in == 1){
          RemoteXY.switch_npk_out = 0;
          break;
        }else if (RemoteXY.switch_npk_in == 0){
          digitalWrite(PIN_SWITCH_NPK_OUT, LOW); 
          RemoteXY.led_npk_big = 2;
          RemoteXY.led_npk_bigD = 2;
          if (DETECT_OUT_BIG()){
            digitalWrite(PIN_SWITCH_NPK_OUT, HIGH);
            RemoteXY.switch_npk_out = 0;
            RemoteXY.led_npk_big = 0;
            RemoteXY.led_npk_bigD = 0;
            break;
          }
          break;
        }
    }
  }
}
//читаем датчик уровня слива большой палатки
bool DETECT_OUT_BIG(){
  bool OUT_BIG;
  if (digitalRead(PIN_DETECT_OUT_BIG)==1){
    OUT_BIG = false;
  }else if (digitalRead(PIN_DETECT_OUT_BIG)==0){
    OUT_BIG = true;
  }
  return OUT_BIG;
}
//Cloud переключатель полива малой палатки
void SwitchINlitle() {
  switch (RemoteXY.switch_npk_litle) {
    case 0:
      digitalWrite(PIN_SWITCH_NPK_LITLE , HIGH);
      RemoteXY.led_npk_litle = 0;
      RemoteXY.led_npk_litleD = 0;
      break;
    case 1:
      {
        if (DETECT_LITLE()){
          SaveLastWateringLitle();
          PrintLastWateringLitle();
          UpdateNextWateringLitle();
          RemoteXY.switch_npk_litle = 0;
          RemoteXY.led_npk_litle = 0;
          RemoteXY.led_npk_litleD = 0;
          break;
        }
        digitalWrite(PIN_SWITCH_NPK_LITLE, LOW);
        RemoteXY.led_npk_litle = 1;
        RemoteXY.led_npk_litleD = 1;
        break;
      }
  }
}
//читаем датчик уровня полива малой палатки
bool DETECT_LITLE(){
  bool DETECTED_LITLE;
  if (digitalRead(PIN_DETECT_LITLE)==1){
    DETECTED_LITLE = false;
  }else if (digitalRead(PIN_DETECT_LITLE)==0){
    DETECTED_LITLE = true;
  }
  return DETECTED_LITLE;
}
//отображаем время и дату последнего полива большой палатки
void PrintLastWateringBig() {
  int LastWatYear = EEPROM.read(adres_last_watering_big_Y) + 2000;
  if (EEPROM.read(adres_last_watering_big_D) >= 10 && EEPROM.read(adres_last_watering_big_M) >= 10) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_big_D) >= 10 && EEPROM.read(adres_last_watering_big_M) <= 9) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_big_D) <= 9 && EEPROM.read(adres_last_watering_big_M) >= 10) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   %0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_big_D) <= 9 && EEPROM.read(adres_last_watering_big_M) <= 9) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  }
}
//отображаем время и дату последнего полива малой палатки
void PrintLastWateringLitle() {
  int LastWatYear = EEPROM.read(adres_last_watering_litle_Y) + 2000;
  if (EEPROM.read(adres_last_watering_litle_D) >= 10 && EEPROM.read(adres_last_watering_litle_M) >= 10) {
    if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:%d   %d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) < 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "0%d:%d   %d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:0%d   %d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_litle, "0%d:0%d   %d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_litle_D) >= 10 && EEPROM.read(adres_last_watering_litle_M) <= 9) {
    if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:%d   %d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) < 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "0%d:%d   %d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:0%d   %d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_litle, "0%d:0%d   %d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_litle_D) <= 9 && EEPROM.read(adres_last_watering_litle_M) >= 10) {
    if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:%d   0%d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) < 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "0%d:%d   0%d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:0%d   0%d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_litle, "0%d:0%d   %0%d-%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_litle_D) <= 9 && EEPROM.read(adres_last_watering_litle_M) <= 9) {
    if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_litle, "0%d:%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_litle_h) >= 10 && EEPROM.read(adres_last_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_last_watering_litle, "%d:0%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_litle, "0%d:0%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_litle_h), EEPROM.read(adres_last_watering_litle_m), EEPROM.read(adres_last_watering_litle_D), EEPROM.read(adres_last_watering_litle_M), LastWatYear);
  }
}
//отображаем время и дату следующего полива малой палатки
void PrintNextWateringLitle() {
  int NextWYear = EEPROM.read(adres_next_watering_litle_Y) + 2000;
  if (EEPROM.read(adres_next_watering_litle_D) >= 10 && EEPROM.read(adres_next_watering_litle_M) >= 10) {
    if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) < 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:0%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:0%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:0%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:0%d   %d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    }
  } else if (EEPROM.read(adres_next_watering_litle_D) >= 10 && EEPROM.read(adres_next_watering_litle_M) <= 9) {
    if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) < 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:0%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:0%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:0%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:0%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    }
  } else if (EEPROM.read(adres_next_watering_litle_D) <= 9 && EEPROM.read(adres_next_watering_litle_M) >= 10) {
    if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) < 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:0%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:0%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:0%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:0%d   0%d-%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    }
  } else if (EEPROM.read(adres_next_watering_litle_D) <= 9 && EEPROM.read(adres_next_watering_litle_M) <= 9) {
    if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:%d   %d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) < 10 && EEPROM.read(adres_next_watering_litle_m) >= 10) {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:%d   0%d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:%d   0%d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else if (EEPROM.read(adres_next_watering_litle_h) >= 10 && EEPROM.read(adres_next_watering_litle_m) < 10) {
      sprintf (RemoteXY.text_watering_time_litle, "%d:0%d   0%d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "%d:0%d   %0%d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    } else {
      sprintf (RemoteXY.text_watering_time_litle, "0%d:0%d   0%d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_litleDUBLE, "0%d:0%d   0%d-0%d-%d",EEPROM.read(adres_next_watering_litle_h), EEPROM.read(adres_next_watering_litle_m), EEPROM.read(adres_next_watering_litle_D), EEPROM.read(adres_next_watering_litle_M), NextWYear);
    }
  }
}
//отображаем время и дату следующего полива большой палатки
void PrintNextWateringBig() {
  int NextWYear = EEPROM.read(adres_next_watering_big_Y) + 2000;
  if (EEPROM.read(adres_next_watering_big_D) >= 10 && EEPROM.read(adres_next_watering_big_M) >= 10) {
    if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "%d:%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)<10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "0%d:%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)<10){
      sprintf (RemoteXY.text_watering_time_big, "%d:0%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:0%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else {
      sprintf (RemoteXY.text_watering_time_big, "0%d:0%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:0%d   %d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }
  } else if (EEPROM.read(adres_next_watering_big_D) >= 10 && EEPROM.read(adres_next_watering_big_M) <= 9) {
    if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "%d:%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)<10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "0%d:%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)<10){
      sprintf (RemoteXY.text_watering_time_big, "%d:0%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:0%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else {
      sprintf (RemoteXY.text_watering_time_big, "0%d:0%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:0%d   %d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }  
  } else if (EEPROM.read(adres_next_watering_big_D) <= 9 && EEPROM.read(adres_next_watering_big_M) >= 10) {
    if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "%d:%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)<10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "0%d:%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)<10){
      sprintf (RemoteXY.text_watering_time_big, "%d:0%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:0%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else {
      sprintf (RemoteXY.text_watering_time_big, "0%d:0%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:0%d   0%d-%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }
  } else if (EEPROM.read(adres_next_watering_big_D) <= 9 && EEPROM.read(adres_next_watering_big_M) <= 9) {
    if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "%d:%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)<10&&EEPROM.read(adres_next_watering_big_m)>=10){
      sprintf (RemoteXY.text_watering_time_big, "0%d:%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else if (EEPROM.read(adres_next_watering_big_h)>=10&&EEPROM.read(adres_next_watering_big_m)<10){
      sprintf (RemoteXY.text_watering_time_big, "%d:0%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "%d:0%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }else {
      sprintf (RemoteXY.text_watering_time_big, "0%d:0%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
      sprintf (RemoteXY.text_watering_time_bigDUBLE, "0%d:0%d   0%d-0%d-%d", EEPROM.read(adres_next_watering_big_h), EEPROM.read(adres_next_watering_big_m), EEPROM.read(adres_next_watering_big_D), EEPROM.read(adres_next_watering_big_M), NextWYear);
    }  
  }
}
//отображаем выставленную дату старта цикла
void PrintStartDateBig() {
  if ((EEPROM.read(adres_Date_of_start_D) < 10) && (EEPROM.read(adres_Date_of_start_M) < 10)) {
    sprintf (RemoteXY.text_date_of_start, "0%d-0%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
    sprintf (RemoteXY.text_date_of_startDUBLE, "0%d-0%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
  } else if ((EEPROM.read(adres_Date_of_start_D) < 10) && (EEPROM.read(adres_Date_of_start_M) >= 10)) {
    sprintf (RemoteXY.text_date_of_start, "0%d-%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
    sprintf (RemoteXY.text_date_of_startDUBLE, "0%d-%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
  } else if ((EEPROM.read(adres_Date_of_start_D) >= 10) && (EEPROM.read(adres_Date_of_start_M) < 10)) {
    sprintf (RemoteXY.text_date_of_start, "%d-0%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
    sprintf (RemoteXY.text_date_of_startDUBLE, "%d-0%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
  } else {
    sprintf(RemoteXY.text_date_of_start, "%d-%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));
    sprintf(RemoteXY.text_date_of_startDUBLE, "%d-%d-%d", EEPROM.read(adres_Date_of_start_D), EEPROM.read(adres_Date_of_start_M), (2000 + EEPROM.read(adres_Date_of_start_Y)));

  }
}
//отображаем количество дней прошедших со старта
void PrintDayOfRun() {
  watch.gettime();
  int UnixDate_of_start = ((watch.year * 365) - (EEPROM.read(adres_Date_of_start_Y) * 365)) + ((watch.month * 30) - (EEPROM.read(adres_Date_of_start_M) * 30)) + (watch.day - EEPROM.read(adres_Date_of_start_D));
  sprintf (RemoteXY.text_day_of_run, "%d", UnixDate_of_start);
  sprintf (RemoteXY.text_day_of_runDUBLE, "%d", UnixDate_of_start);
}
//отображаем RTC время и дату
void WatchTime() {
  sprintf (RemoteXY.text_watch_all, watch.gettime("d-m-Y   H:i"));
}
//считываем цифры с полей ввода
void ReadEditTime() {
  int monthDay;
  Y = RemoteXY.edit_time_Y;
  M = RemoteXY.edit_time_M;
  D = RemoteXY.edit_time_D;
  h = RemoteXY.edit_time_h;
  m = RemoteXY.edit_time_m;
  if (Y > 99) {
    Y = 99;
  }
  if (Y<0){
    Y = 0;
  }
  if (M > 12) {
    M = 12;
  }
  if (M <1){
    M = 1;
  }
  if (M == 2) {
    monthDay = 28;
  }
  if (M == 1 || M == 3 || M == 5 || M == 7 || M == 8 || M == 10 || M == 12) {
    monthDay = 31;
  }
  if (M == 2 || M == 4 || M == 6 || M == 9 || M == 11){
    monthDay = 30;
  }
  if (D > monthDay) {
    D = monthDay;
  } 
  if (D < 1){
    D = 1;
  }
  if (h > 23) {
    h = 23;
  } 
  if (h < 0) {
    h = 0;
  } 
  if (m > 59) {
    m = 59;
  }
  if (m < 0) {
    m = 0;
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

много видел гавнокода, но такое первый раз....

Ровно половина из тысячи строк - чтение из ЕЕПРОМа 2х переменных?

Вот этот кусок повторяется в коде 96 раз. ДЕВЯНОСТО ШЕСТЬ, КАРЛ!!!!!

 sprintf (RemoteXY.text_last_watering_big, "%d:%d   %d-%d-%d",
EEPROM.read(adres_last_watering_big_h), 
EEPROM.read(adres_last_watering_big_m), 
EEPROM.read(adres_last_watering_big_D),
 EEPROM.read(adres_last_watering_big_M), LastWatYear);

О процедурах никогда не слыхали?

 

 

и после этого вы полезли что-то советовать ветку про реле?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Умные люди еще и код длиннее 20 строк под спойлер прячут. 

Spee
Offline
Зарегистрирован: 20.10.2021

Я сразу написал что новичек.

Вы хотите сказать что нужно делать как то так?

int procedura(int adres){
  int otvet = EEPROM.read(adres);
  return otvet;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Spee пишет:

Вы хотите сказать что нужно делать как то так?

int procedura(int adres){
  int otvet = EEPROM.read(adres);
  return otvet;
}

 

именно. И код станет на 500 строк короче, и , ГЛАВНОЕ!!! - опасность насажать ошибок снизиться раз в 20

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

Начал читать тему, дошёл до "Новичков прошу не лезть" и понял, что мне запрещено... Я протестую!!!

Spee
Offline
Зарегистрирован: 20.10.2021

Лезь лезь) Только советы уверенные нужны, а не что бы сломать мою голову)

b707
Offline
Зарегистрирован: 26.05.2017

Pyotr пишет:

Начал читать тему, дошёл до "Новичков прошу не лезть" и понял, что мне запрещено... Я протестую!!!

мы все в этой жизни новички...

Spee
Offline
Зарегистрирован: 20.10.2021

Спасибо)

Подскажите если не сложно, как делают нормальные люди вместо этой части кода

void PrintLastWateringBig() {
  int LastWatYear = EEPROM.read(adres_last_watering_big_Y) + 2000;
  if (EEPROM.read(adres_last_watering_big_D) >= 10 && EEPROM.read(adres_last_watering_big_M) >= 10) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   %d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_big_D) >= 10 && EEPROM.read(adres_last_watering_big_M) <= 9) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   %d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_big_D) <= 9 && EEPROM.read(adres_last_watering_big_M) >= 10) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   %0%d-%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  } else if (EEPROM.read(adres_last_watering_big_D) <= 9 && EEPROM.read(adres_last_watering_big_M) <= 9) {
    if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) < 10 && EEPROM.read(adres_last_watering_big_m) >= 10) {
      sprintf (RemoteXY.text_last_watering_big, "0%d:%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else if (EEPROM.read(adres_last_watering_big_h) >= 10 && EEPROM.read(adres_last_watering_big_m) < 10) {
      sprintf (RemoteXY.text_last_watering_big, "%d:0%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
    } else sprintf (RemoteXY.text_last_watering_big, "0%d:0%d   0%d-0%d-%d", EEPROM.read(adres_last_watering_big_h), EEPROM.read(adres_last_watering_big_m), EEPROM.read(adres_last_watering_big_D), EEPROM.read(adres_last_watering_big_M), LastWatYear);
  }
}

Я всего то добавляю 0 перед однозначными цифрами. Можно как то проще это делать?

b707
Offline
Зарегистрирован: 26.05.2017

Spee пишет:

 Можно как то проще это делать?

Главноая ошибка - не пытайтесь делать это в одно действие.

Прочитали из ЕЕПРОМ одно значение, например час, добавили ноль, если надо, записали в строчку. Перешли к минутам

Так у вас, как минимум, число чтений из ЕЕПРОМ и число преобразований строк станет равным числу переменных - в вашем случае пять. Если посмотреть на код выше - только в этом обрывке таких кусков двадцать - то есть уже экономия в 4 раа

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

uint16_t PackedTime = Hours*60U+Minutes;

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

Spee пишет:

Лезь лезь) Только советы уверенные нужны, а не что бы сломать мою голову)

Чтоб дать совет, надо видеть интерфейс, тип вводимых данных - целое, дробное или строка. Ну и т.д.

А пока пошёл дальше заземление делать. 10 кг кувалдой махать это вам не по клавишам стучать))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пидец, короче. Код почитал 

Spee
Offline
Зарегистрирован: 20.10.2021

Дело в том, что вывожу эти часы минуты день месяц год в одну строку char, а храню и получаю значения от модуля RTC  в виде int. То есть я не могу напечатать минуты и потом еще подумать какие цифры дальше. Нужно отправить полную строку всю сразу... Или я не правильно понял направление ваших мыслей?

Spee
Offline
Зарегистрирован: 20.10.2021

DetSimen пишет:

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

uint16_t PackedTime = Hours*60U+Minutes;

Хотелось бы, что бы нормальные люди еще и нормально объясняли.

Не понимаю что за "60U"...

Spee
Offline
Зарегистрирован: 20.10.2021

Интерфейс RemoteXY

типы вводимых данных написаны в этом месте. Вывод данных то же со своими правилами..

 uint8_t button_set_time_watch; // =1 если кнопка нажата, иначе =0 
  uint8_t switch_npk_in; // =1 если переключатель включен и =0 если отключен 
  uint8_t switch_npk_out; // =1 если переключатель включен и =0 если отключен 
  uint8_t button_set_date_of_start; // =1 если кнопка нажата, иначе =0 
  uint8_t button_set_watering_time_big; // =1 если кнопка нажата, иначе =0 
  int16_t edit_time_h;  // 32767.. +32767 
  int16_t edit_time_m;  // 32767.. +32767 
  int16_t edit_time_D;  // 32767.. +32767 
  int16_t edit_time_M;  // 32767.. +32767 
  int16_t edit_time_Y;  // 32767.. +32767 
  uint8_t switch_npk_litle; // =1 если переключатель включен и =0 если отключен 
  uint8_t button_set_watering_time_litle; // =1 если кнопка нажата, иначе =0 
  uint8_t switch_mix_big; // =1 если переключатель включен и =0 если отключен 
  uint8_t switch_mix_litle; // =1 если переключатель включен и =0 если отключен 

    // output variables
  char text_watch_all[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_H_Big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_T_Big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_day_of_run[4];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_npk_big; // led state 0 .. 2 
  char text_date_of_startDUBLE[13];  // =строка UTF8 оканчивающаяся нулем 
  char text_date_of_start[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_day_of_runDUBLE[4];  // =строка UTF8 оканчивающаяся нулем 
  char text_watering_time_bigDUBLE[21];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_npk_litle; // led state 0 .. 1 
  char text_watering_time_litleDUBLE[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_last_watering_big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_watering_time_big[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_last_watering_litle[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_watering_time_litle[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_H_Litle[21];  // =строка UTF8 оканчивающаяся нулем 
  char text_T_Litle[21];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_mix_big; // led state 0 .. 1 
  uint8_t led_mix_litle; // led state 0 .. 1 
  uint8_t led_npk_bigD; // led state 0 .. 2 
  uint8_t led_npk_litleD; // led state 0 .. 1 
  uint8_t led_mix_bigD; // led state 0 .. 1 
  uint8_t led_mix_litleD; // led state 0 .. 1 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Spee пишет:

Дело в том, что вывожу эти часы минуты день месяц год в одну строку char, а храню и получаю значения от модуля RTC  в виде int. То есть я не могу напечатать минуты и потом еще подумать какие цифры дальше. Нужно отправить полную строку всю сразу... Или я не правильно понял направление ваших мыслей?

Хорошо, можешь хранить время в Unix формате, как uint32_t.  Зачитай чонить за библиотеку time.h.

Впрочем, я к гуру не отношусь, можешь игнорировать мою писанину. 

Spee
Offline
Зарегистрирован: 20.10.2021

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

Спасибо.

b707
Offline
Зарегистрирован: 26.05.2017

Spee пишет:

То есть я не могу напечатать минуты и потом еще подумать какие цифры дальше. Нужно отправить полную строку всю сразу... Или я не правильно понял направление ваших мыслей?

а зачем ее сразу печатать? Сначала сформируйте строку часов В ПЕРЕМЕННОЙ, потом прибавьте минуты... А когда вся строка будет готова - тогда из переменной напечатаете.

И еще - отдельный совет - посмотрите мануал на printf. узнаете много нового

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

Я имел в виду графический  интерфейс на телефоне. Расположение кнопок, полей...

Вот например код

 do {
      timer_uno += PERIOD_UNO;
      if (timer_uno < PERIOD_UNO) break;
    } while (timer_uno < millis() - PERIOD_UNO);

Что он делает? Таких кусков много.

Еще у тебя есть 5 полей ввода для установки времени и даты. Можно сделать одно поле ввода и отправлять строку вида часы:минуты/день/месяц/год. На стороне ардуино разобрать эту строку.

Больше не смотрел. 

 

Spee
Offline
Зарегистрирован: 20.10.2021

Глянул библиотеку time.h которая почему то timelib.h хе) и оказалась что она сама ставит 0, да и вообще больше плюшек в ней удобных. Буду ее пробовать. Спасибо за совет, я её и правда ни разу не видел)

b707
Offline
Зарегистрирован: 26.05.2017

Spee пишет:
оказалась что она сама ставит 0

блин, ставить 0 вообще не задача, это делается в одну строчку. Почитайте описание printf

А вы тут развели...

Spee
Offline
Зарегистрирован: 20.10.2021

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

b707
Offline
Зарегистрирован: 26.05.2017

Spee пишет:
защита от пропуска при переполнении усилонга..

это дурость, а не защита. Да и не нужна тут никакая защита

да и вообще, чем больше смотрю код - тем больше тошнит от него.

Spee, по-моему единственная техника, которую вы освоили в совершенстве - это копи-пасте. Пишете одну процедуру, а потом копируете ее 3, 5,  10 раз...

Запомните - если один и тот же код повторяется в программе два раза - это уже признак плохого программиста. А если три и более - это говнокод.

У вас половину программы нужно переписать с использованием циклов, функций и процедур

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Коллеги! Вы реально что-то советуете человеку, который просит БЕСПЛАТНО оценить 998 строк говнокода??? Ну он-то охренел, это ясно, но вы то серьезные пожилые люди!

ТС, дорогой, ты только НИКОМУ И НИКОГДА не говори, что тебе этот код на arduino.ru смотрели, ОК? И тогда все нормально у тебя в жизни будет. Ну и жениха тебе хорошего и всё такое прочее!

--------------------------

Пятница, вечер. Всем Шаббат шалом!

Spee
Offline
Зарегистрирован: 20.10.2021

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

Spee
Offline
Зарегистрирован: 20.10.2021

wdrakula пишет:

Коллеги! Вы реально что-то советуете человеку, который просит БЕСПЛАТНО оценить 998 строк говнокода??? Ну он-то охренел, это ясно, но вы то серьезные пожилые люди!

ТС, дорогой, ты только НИКОМУ И НИКОГДА не говори, что тебе этот код на arduino.ru смотрели, ОК? И тогда все нормально у тебя в жизни будет. Ну и жениха тебе хорошего и всё такое прочее!

--------------------------

Пятница, вечер. Всем Шаббат шалом!


Странный вы человека, я сказал что это первое что я сделал, и кстати этот говнокод работает. У меня нет образования инженера, меня ни кто не учил этому, небыло ни курсов ни уроков в школе.
По моему было изначально понятно, что будет говнокод. Я по этому сюда и пришел.
Что мои говнознания толкнуть в правильную сторону.
А вас попрошу впредь заходить в вашу любимую тему про деньги, а не про знания для чайников.
Ну или закусывать...
PS: главное что бы я никому не сказал, что мне на arduino.ru ничего не посоветовали...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Просить отрецензировать 998 строк кода неприлично. Это превышает объем услуг, которые оказывают на дружеских условиях. Неужели это непонятно?
Ты не прав не потому, что новичок. А потому, что вывалил для рецензии 998 строк. И без внятных вопросов о том, что тебе непонятно?

Spee
Offline
Зарегистрирован: 20.10.2021

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

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

Spee, подобные знания принято черпать из учебной литературы. Тем более, что почитать об этом Вам было бы в любом случае полезно. А вот для тех, у кого есть опыт, ковыряться в плохо написанном коде - совершенно бесполезно. Почему Вы сделали не так, как: 1. Общепринято 2. Наиболее полезно ?

Почему написали на форум вместо того, чтобы читать учебную литературу?

Собственно, это и есть та бестактность, которая Выдает в Вас халявщика. А здесь таких не любят.

Spee
Offline
Зарегистрирован: 20.10.2021

Соглашусь с вами. Бестактно и нагло. Так как общепринято не сделал, потому что не знаю как принято. Обучаясь у интернета, он часто даёт общую информацию, которая без азов трудно применима. У меня есть жена ребенок собака работа которые мне просто не позволяют найти столько времени, да и денег(если вы понимаете о чем я) на то что бы нормально обучиться, на курсах или у репетитора.
По этому извиняюсь за дерзость. Однако я получил ту критику которую просил.
И она толкнула в правильную сторону. Почитал про функции и printf иии... Код уже стал меньше в два раза. В ДВА РАЗА КАРЛ! Я в шоке и одновременно счастлив не знаю почему) но мне нравится происходящее) просто мне это нравится) когда приеду код в состояние "не стыдно" выложу здесь всем с полным описанием. Может кому-то понадобится)

Spee
Offline
Зарегистрирован: 20.10.2021

Цитата:

И еще - отдельный совет - посмотрите мануал на printf. узнаете много нового


Этот совет сделал из 60 строк 4... Я как сделал, даже покраснел от стыда. Всего два символа в строку добавил, 12 строк удалил... Жесть

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

Spee пишет:
Так как общепринято не сделал, потому что не знаю как принято.

Вы не учились в школе?

Цитата:

Обучаясь у интернета, он часто даёт общую информацию, которая без азов трудно применима.

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

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

Цитата:

...когда приеду код в состояние "не стыдно" выложу здесь всем с полным описанием. Может кому-то понадобится)

Честно говоря, не разделяю Вашего оптимизма. Тут каждый второй новичок обещает выложить финальный код "вдруг кому понадобится". Больше половины, к счастью, не выкладывают, а на остальные попытки без слез взглянуть нельзя. Но, ничего не утверждаю, возможно Вы - исключение из правил.

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

Spee пишет:

Я всего то добавляю 0 перед однозначными цифрами. Можно как то проще это делать?

Почитать про спецификаторы sprintf предлагать ?

В конкретном данном случае будет "%02d" , а не 0%d.

Spee
Offline
Зарегистрирован: 20.10.2021

Уже прочитал, и уже обомлел)))

uint32_t timer_uno, timer_duo;//переменная для таймера
bool flag_set_watering_time_litle, flag_set_watering_time_big, flag_set_date_of_start, flag_button_set_time_watch, flag_litle, flag_big;//флаги кнопок
//адреса хранения данных в EEPROM
#include <EEPROM.h>
int adres_Date_of_start[3] = {0, 2, 4};
int adres_last_watering_big[5] = {6, 8, 10, 12, 14};
int adres_next_watering_big[5] = {16, 18, 20, 22, 24};
int adres_last_watering_litle[5] = {26, 28, 30, 32, 34};
int adres_next_watering_litle[5] = {36, 38, 40, 42, 44};
//подключаем библиотеки для работы с модулем RTC DS1307 и возможностью использовать формат time_t
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
time_t t_time_RTC;
int entryTime[6];
//подключаем библиотеку для датчиков DHT
#include <TroykaDHT.h>
DHT dhtbig(48, DHT21); //датчик в большой палатке
DHT dhtlitle(49, DHT21);  //датчик в малой палатке
//даем названия пинам
#define PIN_SWITCH_NPK_IN 25  //пин полив большая палатка
#define PIN_SWITCH_NPK_OUT 27 //пин слив большая палатка
#define PIN_SWITCH_NPK_LITLE 29 //пин полив малая палатка
#define PIN_BUTTON_BLEND_BIG 31 //пин перемешивание большая бочка
#define PIN_BUTTON_BLEND_LITLE 33 //пин перемешивание малая бочка
#define PIN_DETECT_IN_BIG 35  //пин датчик уровня при поливе, большая палатка
#define PIN_DETECT_OUT_BIG 37 //пин датчик уровня при сливе, большая палатка
#define PIN_DETECT_LITLE 39 //пин датчик уровня при поливе, малая палатка(слив происходит самотеком) 
//подключаю библиотеки для SD карта
#include <SD.h>
#include <SPI.h>
File myFile;
char ssidStr[20]; //файл с именем сети WiFi
char passwStr[20]; //файл с паролем от сети WiFi
char tokenStr[35]; //файл с токеном RemoteXY
// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__ESP8266_HARDSERIAL_CLOUD
#include <RemoteXY.h>
// настройки соединения
#define REMOTEXY_SERIAL Serial1
#define REMOTEXY_SERIAL_SPEED 115200
const char*REMOTEXY_WIFI_SSID;
const char*REMOTEXY_WIFI_PASSWORD;
#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com"
#define REMOTEXY_CLOUD_PORT 6376
const char*REMOTEXY_CLOUD_TOKEN;
// конфигурация интерфейса
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255, 19, 0, 33, 1, 251, 3, 13, 26, 5,
  130, 2, 0, 0, 63, 10, 0, 25, 130, 1,
  0, 91, 63, 9, 0, 25, 131, 1, 1, 92,
  14, 7, 1, 130, 16, 105, 110, 102, 111, 0,
  131, 0, 50, 92, 11, 7, 2, 14, 16, 226,
  154, 153, 239, 184, 143, 0, 67, 1, 0, 1,
  63, 8, 0, 16, 25, 21, 130, 1, 1, 11,
  61, 30, 1, 28, 129, 0, 51, 12, 10, 6,
  1, 0, 66, 105, 103, 0, 129, 0, 54, 19,
  5, 2, 1, 0, 66, 79, 88, 0, 67, 0,
  3, 12, 43, 5, 1, 31, 26, 21, 67, 0,
  3, 17, 43, 5, 1, 31, 26, 21, 67, 0,
  24, 27, 8, 4, 1, 31, 27, 4, 129, 0,
  3, 27, 21, 4, 1, 29, 68, 97, 121, 32,
  111, 102, 32, 114, 117, 110, 58, 0, 131, 0,
  17, 92, 31, 7, 3, 131, 16, 84, 69, 78,
  84, 83, 0, 129, 0, 47, 81, 2, 5, 2,
  16, 58, 0, 129, 0, 33, 70, 2, 6, 2,
  16, 45, 0, 129, 0, 18, 70, 2, 6, 2,
  16, 45, 0, 129, 0, 39, 78, 6, 2, 2,
  16, 104, 111, 117, 114, 115, 0, 129, 0, 52,
  78, 4, 2, 2, 16, 109, 105, 110, 0, 129,
  0, 10, 68, 3, 2, 2, 16, 100, 97, 121,
  0, 129, 0, 23, 68, 6, 2, 2, 16, 109,
  111, 110, 116, 104, 0, 129, 0, 46, 68, 4,
  2, 2, 16, 121, 101, 97, 114, 0, 1, 3,
  4, 80, 30, 7, 2, 44, 16, 115, 101, 116,
  32, 116, 105, 109, 101, 32, 119, 97, 116, 99,
  104, 0, 130, 1, 1, 12, 61, 32, 3, 28,
  2, 0, 3, 14, 34, 7, 3, 5, 26, 31,
  31, 73, 78, 0, 78, 80, 75, 0, 2, 0,
  3, 23, 34, 7, 3, 41, 26, 31, 31, 79,
  85, 84, 0, 78, 80, 75, 0, 70, 35, 39,
  14, 15, 16, 3, 26, 133, 39, 34, 1, 3,
  3, 20, 35, 5, 2, 128, 16, 115, 101, 116,
  32, 100, 97, 116, 101, 32, 111, 102, 32, 114,
  117, 110, 0, 67, 5, 3, 13, 35, 6, 2,
  16, 27, 21, 130, 0, 39, 12, 1, 14, 2,
  28, 130, 0, 61, 11, 1, 79, 2, 28, 130,
  0, 2, 26, 59, 1, 2, 28, 129, 0, 3,
  31, 27, 4, 1, 29, 76, 97, 115, 116, 32,
  119, 97, 116, 101, 114, 105, 110, 103, 58, 0,
  67, 0, 25, 23, 27, 4, 1, 31, 30, 21,
  130, 0, 2, 46, 59, 1, 2, 28, 130, 0,
  1, 11, 1, 79, 2, 28, 1, 3, 3, 37,
  57, 8, 2, 5, 16, 115, 101, 116, 32, 119,
  97, 116, 101, 114, 105, 110, 103, 32, 116, 105,
  109, 101, 32, 98, 105, 103, 32, 98, 111, 120,
  0, 67, 5, 43, 18, 16, 6, 2, 16, 27,
  4, 129, 0, 44, 13, 14, 3, 2, 30, 68,
  97, 121, 32, 111, 102, 32, 114, 117, 110, 0,
  67, 5, 3, 28, 57, 8, 2, 16, 27, 21,
  130, 0, 2, 11, 59, 1, 2, 28, 7, 21,
  37, 80, 10, 7, 2, 16, 27, 2, 7, 21,
  49, 80, 10, 7, 2, 16, 27, 2, 7, 21,
  7, 70, 9, 7, 2, 16, 27, 2, 7, 21,
  22, 70, 9, 7, 2, 16, 27, 2, 7, 21,
  37, 70, 20, 7, 2, 16, 27, 2, 129, 0,
  3, 35, 27, 4, 1, 29, 78, 101, 120, 116,
  32, 119, 97, 116, 101, 114, 105, 110, 103, 58,
  0, 130, 1, 1, 45, 61, 26, 3, 28, 70,
  19, 43, 47, 10, 10, 3, 26, 133, 2, 2,
  0, 3, 47, 38, 10, 3, 5, 26, 31, 31,
  73, 78, 0, 78, 80, 75, 0, 67, 5, 3,
  48, 57, 8, 2, 16, 27, 21, 1, 3, 3,
  57, 57, 8, 2, 5, 16, 115, 101, 116, 32,
  119, 97, 116, 101, 114, 105, 110, 103, 32, 116,
  105, 109, 101, 32, 108, 105, 116, 108, 101, 32,
  98, 111, 120, 0, 130, 0, 2, 66, 59, 1,
  2, 28, 67, 0, 30, 31, 22, 4, 1, 31,
  26, 21, 67, 0, 30, 35, 22, 4, 1, 31,
  26, 21, 130, 1, 1, 43, 61, 23, 1, 28,
  129, 0, 54, 49, 5, 2, 1, 0, 66, 79,
  88, 0, 129, 0, 51, 44, 10, 5, 1, 0,
  76, 105, 116, 108, 101, 0, 129, 0, 3, 55,
  27, 4, 1, 29, 76, 97, 115, 116, 32, 119,
  97, 116, 101, 114, 105, 110, 103, 58, 0, 129,
  0, 3, 60, 27, 4, 1, 29, 78, 101, 120,
  116, 32, 119, 97, 116, 101, 114, 105, 110, 103,
  58, 0, 67, 0, 30, 55, 21, 4, 1, 31,
  26, 21, 67, 0, 30, 60, 21, 4, 1, 31,
  26, 21, 67, 0, 3, 44, 43, 5, 1, 31,
  26, 21, 67, 0, 3, 49, 43, 5, 1, 31,
  26, 21, 129, 0, 3, 23, 18, 4, 1, 29,
  68, 97, 116, 101, 32, 111, 102, 32, 114, 117,
  110, 58, 0, 129, 0, 56, 13, 5, 3, 3,
  0, 66, 105, 103, 0, 129, 0, 55, 46, 6,
  3, 3, 0, 76, 105, 116, 108, 101, 0, 130,
  2, 2, 32, 59, 11, 3, 0, 2, 1, 5,
  34, 43, 7, 3, 0, 26, 31, 31, 77, 73,
  88, 0, 78, 80, 75, 0, 70, 18, 51, 34,
  7, 7, 3, 26, 31, 2, 130, 2, 2, 59,
  59, 11, 3, 0, 2, 1, 5, 61, 43, 7,
  3, 0, 26, 31, 31, 77, 73, 88, 0, 78,
  80, 75, 0, 70, 18, 51, 61, 7, 7, 3,
  26, 31, 2, 70, 35, 51, 19, 2, 2, 1,
  26, 133, 39, 34, 70, 19, 51, 49, 2, 2,
  1, 26, 133, 2, 70, 18, 59, 19, 2, 2,
  1, 26, 31, 2, 70, 18, 59, 49, 2, 2,
  1, 26, 31, 2, 129, 0, 57, 16, 4, 2,
  3, 0, 66, 79, 88, 0, 129, 0, 57, 49,
  5, 2, 3, 0, 66, 79, 88, 0, 130, 0,
  2, 89, 59, 1, 2, 28
};
// структура определяет все переменные и события вашего интерфейса управления
struct {
  // input variables
  uint8_t button_set_time_watch; // =1 если кнопка нажата, иначе =0
  uint8_t switch_npk_in; // =1 если переключатель включен и =0 если отключен
  uint8_t switch_npk_out; // =1 если переключатель включен и =0 если отключен
  uint8_t button_set_date_of_start; // =1 если кнопка нажата, иначе =0
  uint8_t button_set_watering_time_big; // =1 если кнопка нажата, иначе =0
  int16_t edit_time_h;  // 32767.. +32767
  int16_t edit_time_m;  // 32767.. +32767
  int16_t edit_time_D;  // 32767.. +32767
  int16_t edit_time_M;  // 32767.. +32767
  int16_t edit_time_Y;  // 32767.. +32767
  uint8_t switch_npk_litle; // =1 если переключатель включен и =0 если отключен
  uint8_t button_set_watering_time_litle; // =1 если кнопка нажата, иначе =0
  uint8_t switch_mix_big; // =1 если переключатель включен и =0 если отключен
  uint8_t switch_mix_litle; // =1 если переключатель включен и =0 если отключен
  // output variables
  char text_watch_all[21];  // =строка UTF8 оканчивающаяся нулем
  char text_H_Big[21];  // =строка UTF8 оканчивающаяся нулем
  char text_T_Big[21];  // =строка UTF8 оканчивающаяся нулем
  char text_day_of_run[4];  // =строка UTF8 оканчивающаяся нулем
  uint8_t led_npk_big; // led state 0 .. 2
  char text_date_of_startDUBLE[21];  // =строка UTF8 оканчивающаяся нулем
  char text_date_of_start[21];  // =строка UTF8 оканчивающаяся нулем
  char text_day_of_runDUBLE[4];  // =строка UTF8 оканчивающаяся нулем
  char text_watering_time_bigDUBLE[21];  // =строка UTF8 оканчивающаяся нулем
  uint8_t led_npk_litle; // led state 0 .. 1
  char text_watering_time_litleDUBLE[21];  // =строка UTF8 оканчивающаяся нулем
  char text_last_watering_big[21];  // =строка UTF8 оканчивающаяся нулем
  char text_watering_time_big[21];  // =строка UTF8 оканчивающаяся нулем
  char text_last_watering_litle[21];  // =строка UTF8 оканчивающаяся нулем
  char text_watering_time_litle[21];  // =строка UTF8 оканчивающаяся нулем
  char text_H_Litle[21];  // =строка UTF8 оканчивающаяся нулем
  char text_T_Litle[21];  // =строка UTF8 оканчивающаяся нулем
  uint8_t led_mix_big; // led state 0 .. 1
  uint8_t led_mix_litle; // led state 0 .. 1
  uint8_t led_npk_bigD; // led state 0 .. 2
  uint8_t led_npk_litleD; // led state 0 .. 1
  uint8_t led_mix_bigD; // led state 0 .. 1
  uint8_t led_mix_litleD; // led state 0 .. 1
  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
void setup() {
  Serial.begin(115200);
  ////читаем с SD card имя сети, пароль сети и токен RemoteXY для подключения
  while (!Serial) {
    ;
  }
  if (!SD.begin(53)) {
    while (1);
  }
  //читаем имя сети
  myFile = SD.open("ssid.txt");
  if (myFile) {
    int i = 0;
    while (myFile.available()) {
      char buff = myFile.read();
      ssidStr[i] = buff;
      i++;
    }
    ssidStr[i] = 0;
    REMOTEXY_WIFI_SSID = ssidStr;
  }
  myFile.close();
  //читаем пароль сети
  myFile = SD.open("pass.txt");
  if (myFile) {
    int i = 0;
    while (myFile.available()) {
      char buff = myFile.read();
      passwStr[i] = buff;
      i++;
    }
    passwStr[i] = 0;
    REMOTEXY_WIFI_PASSWORD = passwStr;
  }
  myFile.close();
  //читаем токен RemoteXY
  myFile = SD.open("token.txt");
  if (myFile) {
    int i = 0;
    while (myFile.available()) {
      char buff = myFile.read();
      tokenStr[i] = buff;
      i++;
    }
    tokenStr[i] = 0;
    REMOTEXY_CLOUD_TOKEN = tokenStr;
  }
  myFile.close();
  remotexy = new CRemoteXY (
    RemoteXY_CONF_PROGMEM,
    &RemoteXY,
    "",
    new CRemoteXYConnectionCloud (
      new CRemoteXYComm_ESP8266 (
        new CRemoteXYStream_HardSerial (
          &Serial1, 115200), REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD), REMOTEXY_CLOUD_SERVER, 6376, REMOTEXY_CLOUD_TOKEN));
  //выставляем пины
  pinMode (PIN_SWITCH_NPK_IN, OUTPUT);  //полив большая палатка
  digitalWrite(PIN_SWITCH_NPK_IN, HIGH);
  pinMode (PIN_DETECT_IN_BIG, INPUT_PULLUP);  //датчик уровня при поливе, большая палатка
  pinMode (PIN_SWITCH_NPK_OUT, OUTPUT); //слив большая палатка
  digitalWrite(PIN_SWITCH_NPK_OUT, HIGH);
  pinMode (PIN_DETECT_OUT_BIG, INPUT_PULLUP); //датчик уровня при сливе, большая палатка
  pinMode (PIN_BUTTON_BLEND_BIG, OUTPUT); //перемешивание большая бочка
  digitalWrite(PIN_BUTTON_BLEND_BIG, HIGH);
  pinMode (PIN_SWITCH_NPK_LITLE, OUTPUT); //полив малая палатка
  digitalWrite(PIN_SWITCH_NPK_LITLE, HIGH);
  pinMode (PIN_DETECT_LITLE, INPUT_PULLUP); //датчик уровня при поливе, малая палатка(слив происходит самотеком)
  pinMode (PIN_BUTTON_BLEND_LITLE, OUTPUT); //перемешивание малая бочка
  digitalWrite(PIN_BUTTON_BLEND_LITLE, HIGH);
  setSyncProvider(RTC.get);
  timer_uno = millis();
  timer_duo = millis();
  flag_button_set_time_watch = false;
  flag_set_date_of_start = false;
  flag_set_watering_time_big = false;
  flag_set_watering_time_litle = false;
  printDate();
}
//выводит все паказания в графический интерфейс
void printDate() {
  sprintf (RemoteXY.text_date_of_start, "%02d-%02d-20%02d", readEEPROM(adres_Date_of_start[2]), readEEPROM(adres_Date_of_start[1]), readEEPROM(adres_Date_of_start[0]));
  sprintf (RemoteXY.text_date_of_startDUBLE, "%02d-%02d-20%02d", readEEPROM(adres_Date_of_start[2]), readEEPROM(adres_Date_of_start[1]), readEEPROM(adres_Date_of_start[0]));
  sprintf (RemoteXY.text_day_of_run, "%d", dayOfRUN());
  sprintf (RemoteXY.text_day_of_runDUBLE, "%d", dayOfRUN());
  sprintf (RemoteXY.text_watering_time_big, "%02d:%02d  %02d-%02d-20%d", readEEPROM(adres_next_watering_big[4]), readEEPROM(adres_next_watering_big[3]), readEEPROM(adres_next_watering_big[2]), readEEPROM(adres_next_watering_big[1]), readEEPROM(adres_next_watering_big[0]));
  sprintf (RemoteXY.text_watering_time_bigDUBLE, "%02d:%02d  %02d-%02d-20%d", readEEPROM(adres_next_watering_big[4]), readEEPROM(adres_next_watering_big[3]), readEEPROM(adres_next_watering_big[2]), readEEPROM(adres_next_watering_big[1]), readEEPROM(adres_next_watering_big[0]));
  sprintf (RemoteXY.text_watering_time_litle, "%02d:%02d  %02d-%02d-20%d", readEEPROM(adres_next_watering_litle[4]), readEEPROM(adres_next_watering_litle[3]), readEEPROM(adres_next_watering_litle[2]), readEEPROM(adres_next_watering_litle[1]), readEEPROM(adres_next_watering_litle[0]));
  sprintf (RemoteXY.text_watering_time_litleDUBLE, "%02d:%02d  %02d-%02d-20%d", readEEPROM(adres_next_watering_litle[4]), readEEPROM(adres_next_watering_litle[3]), readEEPROM(adres_next_watering_litle[2]), readEEPROM(adres_next_watering_litle[1]), readEEPROM(adres_next_watering_litle[0]));
  sprintf (RemoteXY.text_last_watering_big, "%02d:%02d  %02d-%02d-20%d", readEEPROM(adres_last_watering_big[4]), readEEPROM(adres_last_watering_big[3]), readEEPROM(adres_last_watering_big[2]), readEEPROM(adres_last_watering_big[1]), readEEPROM(adres_last_watering_big[0]));
  sprintf (RemoteXY.text_last_watering_litle, "%02d:%02d  %02d-%02d-20%d", readEEPROM(adres_last_watering_litle[4]), readEEPROM(adres_last_watering_litle[3]), readEEPROM(adres_last_watering_litle[2]), readEEPROM(adres_last_watering_litle[1]), readEEPROM(adres_last_watering_litle[0]));
}
//принимает номер месяца, возвращает количество в нем дней
int whatMounth(int M) {
  int result[13] = {5, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  return result[M];
}
//считает какой день с начала цикла
int dayOfRUN() {
  t_time_RTC = now();
  int result = (((year(t_time_RTC) - 2000 - readEEPROM(adres_Date_of_start[0])) * 365.24) + ((month(t_time_RTC) - readEEPROM(adres_Date_of_start[1])) * 30.44) + (day(t_time_RTC) - readEEPROM(adres_Date_of_start[2])));
  return result;
}
//принимает числа с поля ввода, их возможное максимальое и минимальное значениея, если ввели больше вернет максимальное правильное, если ввели меньше вернет минимальное правильное, если все правильно просто обратно
int editEntryTime(int date, int maximum, int minimum) {
  if (date > maximum)date = maximum;
  if (date < minimum)date = minimum;
  return date;
}
//записывает данные с поля ввода в переменную которую возвращаем
int *readTextTime() {
  static int entryTime[6];
  entryTime[0] = editEntryTime(RemoteXY.edit_time_h, 23, 0);
  entryTime[1] = editEntryTime(RemoteXY.edit_time_m, 59, 0);
  entryTime[2] = 0;
  entryTime[3] = editEntryTime(RemoteXY.edit_time_D, whatMounth(editEntryTime(RemoteXY.edit_time_M, 12, 1)), 1);
  entryTime[4] = editEntryTime(RemoteXY.edit_time_M, 12, 1);
  entryTime[5] = (editEntryTime(RemoteXY.edit_time_Y, 2099, 2001) - 2000);
  return entryTime;
}
//функция говорит запущен ли графический интерфейс
bool statUserONLINE() {
  bool stat = (byte)RemoteXY.connect_flag;
  return stat;
}
//функция принимает адрес EEPROM, возвращает прочитанное
int readEEPROM(int adressEEPROM) {
  int dataRead = EEPROM.read(adressEEPROM);
  return dataRead;
}
//функция обновляет данные EEPROM, принимает адрес и данные для обновления
void updateEEPROM(int adressEEPROM, int dataUpdate) {
  EEPROM.update(adressEEPROM, dataUpdate);
}
//записывает текущее дату и время в 5 адресов int. принимает первый адрес
void updateEEPROMlast(int firstAdres, bool z){
  int watch[5] = {(year() - 2000), month(), day(), minute(), hour()};
  if (z){
    watch[2] = watch[2]+3;
    if(watch[2]>whatMounth(watch[1])){
      watch[2] = watch[2] - whatMounth(watch[1]);
      watch[1] = watch[1]+1;
    }
    if (watch[1]>12){
      watch[1]=1;
      watch[0]=watch[0]+1;
    }
  }
  for(int i;i<5;i++){
    updateEEPROM(firstAdres, watch[i]);
    firstAdres = firstAdres + 2;
  }
}
//считываем инфу с датчиков темп. и влаж.
void UpdateDHT() {
  dhtbig.read();
  if (dhtbig.getState() == DHT_OK) {
    String valueHumBIGstring(dhtbig.getHumidity(), 1);
    const char * valueHumBIG = valueHumBIGstring.c_str();
    sprintf(RemoteXY.text_H_Big, "Humidity: %s%%" , valueHumBIG);
    String valueTempBIGstring(dhtbig.getTemperatureC(), 1);
    const char * valueTempBIG = valueTempBIGstring.c_str();
    sprintf(RemoteXY.text_T_Big, "Temperature: %s°" , valueTempBIG);
  } else {
    sprintf(RemoteXY.text_H_Big, "NO");
    sprintf(RemoteXY.text_T_Big, "SENSOR");
  }
  dhtlitle.read();
  if (dhtlitle.getState() == DHT_OK) {
    String valueHumLITLEstring(dhtlitle.getHumidity(), 1);
    const char*valueHumLITLE = valueHumLITLEstring.c_str();
    sprintf(RemoteXY.text_H_Litle, "Humidity: %s%%" , valueHumLITLE);
    String valueTempLITLEstring(dhtlitle.getTemperatureC(), 1);
    const char*valueTempLITLE = valueTempLITLEstring.c_str();
    sprintf(RemoteXY.text_T_Litle, "Temperature: %s°" , valueTempLITLE);
  } else {
    sprintf(RemoteXY.text_H_Litle, "NO");
    sprintf(RemoteXY.text_T_Litle, "SENSOR");
  }
}
//функция обновляет отображаемое время и данные датчиков температуры и влажности раз в 2 секунды
void UpdateTimeAndDHT() {
  if (millis() - timer_uno >= 2000) {
    sprintf (RemoteXY.text_watch_all, "%02d:%02d  %02d-%02d-%d", hour(), minute(), day(), month(),  year());
    UpdateDHT();
    timer_uno = millis();
  }
}
//функция устанавливает время из полей ввода в модуль RTC.
void setTimeRTC() {
  int* myText = readTextTime();
  setTime(myText[0], myText[1], myText[2], myText[3], myText[4], myText[5]);
  time_t t_time_RTC = now();
  RTC.set(t_time_RTC);
}
//индикация
void ledLitleCHEK() {
  RemoteXY.led_npk_litle = RemoteXY.switch_npk_litle;
  RemoteXY.led_npk_litleD = RemoteXY.switch_npk_litle;
}
//индикация
void ledNPKbig(byte i) {
  RemoteXY.led_npk_big = i;
  RemoteXY.led_npk_bigD = i;
}
//функция которая исполняется если работает графический интерфейс
void userONLINE() {
  UpdateTimeAndDHT();  //обновляем отображаемое время и данные датчиков температуры и влажности
  //переключатель перемешивания большой бочки
  if (RemoteXY.switch_mix_big == 0) {
    digitalWrite(PIN_BUTTON_BLEND_BIG, HIGH);
    RemoteXY.led_mix_big = 0;
  }
  if (RemoteXY.switch_mix_big == 1) {
    digitalWrite(PIN_BUTTON_BLEND_BIG, LOW);
    RemoteXY.led_mix_big = 1;
  }
  //переключатель перемешивания малой бочки
  if (RemoteXY.switch_mix_litle == 0) {
    digitalWrite(PIN_BUTTON_BLEND_LITLE, HIGH);
    RemoteXY.led_mix_litle = 0;
  }
  if (RemoteXY.switch_mix_litle == 1) {
    digitalWrite(PIN_BUTTON_BLEND_LITLE, LOW);
    RemoteXY.led_mix_litle = 1;
  }
  //кнопка установки времени в модуль RTC
  if (RemoteXY.button_set_time_watch && !flag_button_set_time_watch) {
    flag_button_set_time_watch = true;
    setTimeRTC();
  }
  if (!RemoteXY.button_set_time_watch && flag_button_set_time_watch) {
    flag_button_set_time_watch = false;
  }
  //кнопка установки даты начала цикла
  if (RemoteXY.button_set_date_of_start && !flag_set_date_of_start) {
    flag_set_date_of_start = true;
    int* myText = readTextTime();
    int y = 5;
    for (int i = 0; i < 3; i++) {
      updateEEPROM(adres_Date_of_start[i], myText[y]);
      y = y - 1;
    }
    printDate();
  }
  if (!RemoteXY.button_set_date_of_start && flag_set_date_of_start) {
    flag_set_date_of_start = false;
  }
  //кнопка установки времени и даты следующего полива большой палатки
  if (RemoteXY.button_set_watering_time_big && !flag_set_watering_time_big) {
    flag_set_watering_time_big = true;
    int* myText = readTextTime();
    int y = 5;
    for (int i = 0; i < 5; i++) {
      if (y == 2)y = y - 1;
      updateEEPROM(adres_next_watering_big[i], myText[y]);
      y = y - 1;
    }
    printDate();
  }
  if (!RemoteXY.button_set_watering_time_big && flag_set_watering_time_big) {
    flag_set_watering_time_big = false;
  }
  //кнопка установки времени и даты следующего полива малой палатки
  if (RemoteXY.button_set_watering_time_litle && !flag_set_watering_time_litle) {
    flag_set_watering_time_litle = true;
    int* myText = readTextTime();
    int y = 5;
    for (int i = 0; i < 5; i++) {
      if (y == 2)y = y - 1;
      updateEEPROM(adres_next_watering_litle[i], myText[y]);
      y = y - 1;
    }
    printDate();
  }
  if (!RemoteXY.button_set_watering_time_litle && flag_set_watering_time_litle) {
    flag_set_watering_time_litle = false;
  }
}
//полив в малой палатке
void waterLitle() {
  digitalWrite(PIN_SWITCH_NPK_LITLE, LOW);
  if (!digitalRead(PIN_DETECT_LITLE)) {
    digitalWrite(PIN_SWITCH_NPK_LITLE, HIGH);
    RemoteXY.switch_npk_litle = 0;
    updateEEPROMlast(adres_last_watering_litle[0],false);
    updateEEPROMlast(adres_next_watering_litle[0],true);
    printDate();
  }
  ledLitleCHEK();
}
//полив в большой палатке
void npkBigIN(byte x, byte y) {
  if (x == 0 && y == 0) {
    digitalWrite(PIN_SWITCH_NPK_IN, HIGH);
    digitalWrite(PIN_SWITCH_NPK_OUT, HIGH);
    ledNPKbig(0);
  } else if (x == 1 && y == 0) {
    digitalWrite(PIN_SWITCH_NPK_IN, LOW);
    ledNPKbig(1);
    if (!digitalRead(PIN_DETECT_IN_BIG)) {
      updateEEPROMlast(adres_last_watering_big[0],false);
      updateEEPROMlast(adres_next_watering_big[0],true);
      printDate();
      RemoteXY.switch_npk_in = 0;
      RemoteXY.switch_npk_out = 1;
    }
  } else if (x == 0 && y == 1) {
    digitalWrite(PIN_SWITCH_NPK_IN, HIGH);
    digitalWrite(PIN_SWITCH_NPK_OUT, LOW);
    ledNPKbig(2);
    if (!digitalRead(PIN_DETECT_OUT_BIG)) {
      RemoteXY.switch_npk_out = 0;
      digitalWrite(PIN_SWITCH_NPK_OUT, HIGH);
    }
  } else if (x == 1 && y == 1) {
    digitalWrite(PIN_SWITCH_NPK_IN, HIGH);
    RemoteXY.switch_npk_in = 0;
    digitalWrite(PIN_SWITCH_NPK_OUT, LOW);
    ledNPKbig(2);
  }
}
void loop() {
  RemoteXY_Handler ();
  if (statUserONLINE())userONLINE(); //если графический интерфейс запущен, проверяем кнопки
  if (millis() - timer_duo > 5000) {
    //проверяем пора ли поливать
    t_time_RTC = now();
    if (readEEPROM(adres_next_watering_litle[0]) == (year(t_time_RTC) - 2000) && readEEPROM(adres_next_watering_litle[1]) == month(t_time_RTC) && readEEPROM(adres_next_watering_litle[2]) == day(t_time_RTC) && readEEPROM(adres_next_watering_litle[3]) == minute(t_time_RTC) && readEEPROM(adres_next_watering_litle[4]) == hour(t_time_RTC))RemoteXY.switch_npk_litle = 1;
    if (readEEPROM(adres_next_watering_big[0]) == (year(t_time_RTC) - 2000) && readEEPROM(adres_next_watering_big[1]) == month(t_time_RTC) && readEEPROM(adres_next_watering_big[2]) == day(t_time_RTC) && readEEPROM(adres_next_watering_big[3]) == minute(t_time_RTC) && readEEPROM(adres_next_watering_big[4]) == hour(t_time_RTC))RemoteXY.switch_npk_in = 1;
  }
  //переключатель полива малой палатки
  if (RemoteXY.switch_npk_litle == 0) {
    digitalWrite(PIN_SWITCH_NPK_LITLE , HIGH);
    ledLitleCHEK();
  }
  if (RemoteXY.switch_npk_litle == 1) {
    waterLitle();
  }
  npkBigIN(RemoteXY.switch_npk_in, RemoteXY.switch_npk_out);
}

Переписал... Но все время в голове нет внятного принципа построения всей программы. Не разобрался как передать имя переменной в функцию..и надо ли в принципе так поступать. Мало прочитано...

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

b707
Offline
Зарегистрирован: 26.05.2017

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