Проблема после перехода на библиотеку 0.5.1/0.5.0

Смартфон Android версия прошивки - 2.20.0
Локальный сервер - версия 0.33.2.
Версия библиотеки - 0.5.1
Версия ядра esp8266 - 2.4.1
Устройства основаны на Wemos d1 mini pro.

Суть проблемы:
У меня на локальном сервере крутится около 5ти устройств. После перехода на новую версию библиотеки а именно 0.5.1 и 0.5.0 два устройства стали перезагружаться с разной периодичностью. Более нагруженное в программном смысле устройство раз в 5мин. Другое 1-2 раза в день. Такое ощущение что срабатывает WDT. Отследить что летит в сериал монитор проблематично. При откате библиотеки до 0.4.10 проблема уходит. Понимаю, что вопрос звучит очень размыто, но возможно кто-то сталкивался с подобной проблемой? Также где-то читал на форуме что это возможно связано с новым ядром и библиотекой DHT, Заранее спасибо.

Скетч:


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <UTFT.h>
#include <SimpleDHT.h>
#include <Encoder.h>
#include <ArduinoOTA.h>

SimpleDHT22 dht22;

BlynkTimer timer; 

WidgetRTC rtc;

WidgetTerminal terminal(V5); // виртуальный пин для терминала на телефоне

WidgetBridge homet(V8); // мост для отправки температуру в топочную

Encoder myEnc(5, 4); // подключаем єнкодер к пинам D1 D2

char auth[] = "-";
char ssid[] = "-";
char pass[] = "-";
String currentTime = "--:--"; // переменная хранит время
String currentDate = "--.--.----"; // переменная хранит дату
String minutenorm; // переменная для преобразования минут в нормальный формат
String hournorm; // переменная для преобразования часов в нормальный формат
String daynorm; // переменная для преобразования дней в нормальный формат
String monthnorm; // переменная для преобразования месяцев в нормальный формат
char *week = "--";
float ylicat; // переменная хранит температуру на улице
float ylicah; // переменная хранит температуру на улице
float ylicam; // переменная хранит давление на улице
float domt; // переменная хранит температуру на улице
float domh; // переменная хранит температуру на улице
float fakttemprec, fakttempgvs, fakttemppodacha, fakttempobratka, fakttemptverd; // переменная хранит значение датчиков
int buttonV16; // кнопка ГАЗ/ТВЕРД
int buttonV18; // кнопка рециркуляции
int buttonV17; // кнопка ГВС
boolean firststart; //переменная хранящая значение первый ли это старт, чтобы при старте устройства не писалось сообщение о подключении к облаку.
boolean sostoyaniezima = false; // текущее состояние РЕЖИМА ЗИМА/ЛЕТО
boolean alarmzaryad = false; //хранит состояние аварии по АККУМУЛЯТОРУ
boolean alarmtk = false; //хранит состояние аварии по ТВЕРДОТОПУ
boolean alarmzagtk = false; //хранит состояние аварии по загрузке ТВЕРДОТОПА
boolean alarmgaz = false; //хранит состояние аварии датчика ГАЗА/ДЫМА
int temprec; //переменная хранит заданную пользователем температуру рециркуляции
int tempgvs; //переменная хранит заданную пользователем температуру ГВС
int tempzl; //переменная хранит заданную пользователем температуру ЗИМА/ЛЕТО
int tempavar; //переменная хранит заданную пользователем температуру аварии ТВЕРДОТОПливного котла
int tempzagtverd; //переменная хранит температуру загрузки твердотопа
extern uint8_t SmallRusFont[]; // Объявляем шрифт
extern uint8_t BigRusFont[]; 
extern uint8_t SevenSegNumFontPlusPlus[]; 
long oldPosition = -999; // переменная хранит старое положение энкодера
long newPosition; // переменна хранит новое положение єнкодера
int menu = 0; // переменная хранит номер меню
int menupos = 0; //переменная хранит положение єнкодера при переключении меню
float temphome = 20; // переменная хранит выставленную температуру, 20 градусов начальная температура
boolean granica = false;
boolean butterm = false; // переменная хранит состояние, если пользователь зашел в меню термостата true, вышел - false
//Переменные ЗОНЫ 1
long startTimeV1 = 0; // начало задания в секундах, зона 1
long stopTimeV1 = 0; // конец задания в секундах, зона 1
boolean weekV1[8]; // день недели, зона 1
boolean sostoyanieV1 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 1
//Переменные ЗОНЫ 2
long startTimeV2 = 0; // начало задания в секундах, зона 2
long stopTimeV2 = 0; // конец задания в секундах, зона 2
boolean weekV2[8]; // день недели, зона 2
boolean sostoyanieV2 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 2
//Переменные ЗОНЫ 3
long startTimeV3 = 0; // начало задания в секундах, зона 3
long stopTimeV3 = 0; // конец задания в секундах, зона 3
boolean weekV3[8]; // день недели, зона 3
boolean sostoyanieV3 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 3
//Переменные ЗОНЫ 4
long startTimeV4 = 0; // начало задания в секундах, зона 4
long stopTimeV4 = 0; // конец задания в секундах, зона 4
boolean weekV4[8]; // день недели, зона 4
boolean sostoyanieV4 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 4
//Переменные ЗОНЫ 5
long startTimeV5 = 0; // начало задания в секундах, зона 5
long stopTimeV5 = 0; // конец задания в секундах, зона 5
boolean weekV5[8]; // день недели, зона 5
boolean sostoyanieV5 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 5
//Переменные ЗОНЫ 6
long startTimeV6 = 0; // начало задания в секундах, зона 6
long stopTimeV6 = 0; // конец задания в секундах, зона 6
boolean weekV6[8]; // день недели, зона 6
boolean sostoyanieV6 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 6
//Переменные ЗОНЫ 7
long startTimeV7 = 0; // начало задания в секундах, зона 7
long stopTimeV7 = 0; // конец задания в секундах, зона 7
boolean weekV7[8]; // день недели, зона 7
boolean sostoyanieV7 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 7
int buttonV0; // кнопка автополива
int buttonV19; // кнопка пуш уведомлений
boolean sostoyaniemanual = false; // текующее состояние ручного полива

UTFT tft ( ILI9341_S5P, 13, 14, 15, 2, 12 ); // подключаем экран SDI (MOSI), SCK, CS, RESET, D/C - D7, D5, D8, D4, D6

const uint8_t utf8_rus_charmap[] PROGMEM = {'A',128,'B',129,130,'E',131,132,133,134,135,'K',136,'M','H','O',137,'P','C','T',138,139,'X',140,141,
142,143,144,145,146,147,148,149,'a',150,151,152,153,'e',154,155,156,157,158,159,160,161,162,'o',163,'p','c',164,'y',165,'x',166,167,168,169,170,
171,172,173,174,175};

BLYNK_CONNECTED() {
homet.setAuthToken("-"); // авторизуемся с топочной
if (firststart == true) {
 terminal.println(String(currentTime) + " " + currentDate + " Подключение к облаку!"); // сообщение о подключении к облаку
 terminal.flush(); // отправляет данные из устройства в терминал
}
Blynk.syncAll();// синхронизируем выходы, после потерия связи.
}

BLYNK_WRITE(V1) { // данные с автополива, метео
 ylicat = param[0].asFloat(); //сохраняем в переменную уличную температуру 
 ylicah = param[1].asFloat(); //сохраняем в переменную уличную влажность
 ylicam = param[2].asFloat(); //сохраняем в переменную уличное давление
}

BLYNK_WRITE(V2) { // данные с топочной
 fakttemprec = param[0].asFloat(); // температура рециркуляции
 fakttempgvs = param[1].asFloat(); // температура гвс
 fakttemppodacha = param[2].asFloat(); // температура подачи
 fakttempobratka = param[3].asFloat(); // температура обратки
 fakttemptverd = param[4].asFloat(); // температура ТК
 sostoyaniezima = param[5].asInt(); // текущее состояние РЕЖИМА ЗИМА/ЛЕТО
 buttonV16 = param[6].asInt(); // кнопка ГАЗ/ТВЕРД
 alarmzaryad = param[7].asInt(); //хранит состояние аварии по АККУМУЛЯТОРУ
 alarmtk = param[8].asInt(); //хранит состояние аварии по ТВЕРДОТОПУ
 alarmzagtk = param[9].asInt(); //хранит состояние аварии по загрузке ТВЕРДОТОПА
 alarmgaz = param[10].asInt(); //хранит состояние аварии датчика ГАЗА/ДЫМА
 temprec = param[11].asInt(); //переменная хранит заданную пользователем температуру рециркуляции
 tempgvs = param[12].asInt(); //переменная хранит заданную пользователем температуру ГВС
 tempzl = param[13].asInt(); //переменная хранит заданную пользователем температуру ЗИМА/ЛЕТО
 tempavar = param[14].asInt(); //переменная хранит заданную пользователем температуру аварии ТВЕРДОТОПливного котла
 tempzagtverd = param[15].asInt(); //переменная хранит температуру загрузки твердотопа
 buttonV18 = param[16].asInt(); // кнопка рециркуляции
 buttonV17 = param[17].asInt(); // кнопка ГВС 
}

BLYNK_WRITE(V7) { // данные с автополива
 startTimeV1 = param[0].asInt(); 
 stopTimeV1 = param[1].asInt(); 
 weekV1[weekday()] = param[2].asInt(); 
 sostoyanieV1 = param[3].asInt();  
 startTimeV2 = param[4].asInt(); 
 stopTimeV2 = param[5].asInt(); 
 weekV2[weekday()] = param[6].asInt(); 
 sostoyanieV2 = param[7].asInt();  
 startTimeV3 = param[8].asInt(); 
 stopTimeV3 = param[9].asInt(); 
 weekV3[weekday()] = param[10].asInt(); 
 sostoyanieV3 = param[11].asInt();  
 startTimeV4 = param[12].asInt(); 
 stopTimeV4 = param[13].asInt(); 
 weekV4[weekday()] = param[14].asInt(); 
 sostoyanieV4 = param[15].asInt();  
 startTimeV5 = param[16].asInt(); 
 stopTimeV5 = param[17].asInt(); 
 weekV5[weekday()] = param[18].asInt(); 
 sostoyanieV5 = param[19].asInt();  
 startTimeV6 = param[20].asInt(); 
 stopTimeV6 = param[21].asInt(); 
 weekV6[weekday()] = param[22].asInt(); 
 sostoyanieV6 = param[23].asInt();  
 startTimeV7 = param[24].asInt(); 
 stopTimeV7 = param[25].asInt(); 
 weekV7[weekday()] = param[26].asInt(); 
 sostoyanieV7 = param[27].asInt();  
 buttonV0 = param[28].asInt(); 
 buttonV19 = param[29].asInt();
 sostoyaniemanual = param[30].asInt();
}

BLYNK_WRITE(V6) {
 if(param.asFloat() != temphome){ 
  temphome = param.asFloat(); //сохраняем в переменную установленную температуру в приложении
  terminal.println(String(currentTime) + " " + currentDate + " Темп. в доме: " + temphome + "*С");
  terminal.flush(); // отправляет данные из устройства в терминал 
 }
}

void printRus(UTFT rus,char *st, int x, int y, int deg){ // функция для написания руского текста в библиотеке UTFT
 int stl, i;
 stl = strlen(st);
 if (rus.orient==PORTRAIT){
    if (x==RIGHT) x=(rus.disp_x_size+1)-(stl*rus.cfont.x_size);
    if (x==CENTER) x=((rus.disp_x_size+1)-(stl*rus.cfont.x_size))/2;
 } else {
  if (x==RIGHT) x=(rus.disp_y_size+1)-(stl*rus.cfont.x_size);
  if (x==CENTER) x=((rus.disp_y_size+1)-(stl*rus.cfont.x_size))/2;
 }
 uint8_t utf_high_byte = 0;
 uint8_t ch, ch_pos = 0;
 for (i = 0; i < stl; i++) {
  ch = st[i];
   if ( ch >= 128) {
     if ( utf_high_byte == 0 && (ch ==0xD0 || ch == 0xD1)) {
         utf_high_byte = ch;
      continue;
     } else {
     if ( utf_high_byte == 0xD0) {
    if (ch == 0x81) { //Ё
      ch = 6;
    } else {
    if(ch <= 0x95) {
       ch -= 0x90;
    } else if( ch < 0xB6){
    ch -= (0x90 - 1);
    } else {
    ch -= (0x90 - 2);
    }}
    ch = pgm_read_byte(utf8_rus_charmap + ch);
    } else if (utf_high_byte == 0xD1) {
           if (ch == 0x91) {//ё
           ch = 39;
       } else {
        ch -= 0x80;
        ch += 50;
       }
           ch = pgm_read_byte(utf8_rus_charmap + ch);
    }
    utf_high_byte = 0;
   }
   } else {
     utf_high_byte = 0;
     }
     if (deg==0) {rus.printChar(ch, x + (ch_pos * (rus.cfont.x_size)), y);} else {
          rus.rotateChar(ch, x, y, ch_pos, deg);
        }
      ++ch_pos;
 }
};

void autoplay() {
// МЕНЮ 
 switch (menu) {
  case 1: // меню метеостанции
   tft.setFont(BigRusFont);
   tft.setColor(VGA_LIME); 
   tft.printNumF ( ylicat, 1, 50, 80 ); // выводим температура улица
   tft.printNumF ( ylicah, 1, 50, 165 ); // выводим влажность улица
   tft.printNumF ( domt, 1, 175, 80 ); // выводим температура дом
   tft.printNumF ( domh, 1, 210, 165 ); // выводим влажность дом
   tft.printNumF ( ylicam * 0.00750062, 1, 200 , 213 ); // выводим влажность улица
   tft.setColor(VGA_YELLOW);
   tft.printNumF ( temphome, 1, 245, 80 ); // выводим температура дом
   tft.setColor(VGA_WHITE);
   tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
   tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
   printRus(tft, week, 280, 6, 0); // выводим ДЕНЬ НЕДЕЛИ
   tft.setFont(SmallRusFont);
   printRus(tft,"ТЕМПЕРАТУРА НА", 25, 40, 0);
   printRus(tft,"УЛИЦЕ, *С:", 45, 55, 0);
   printRus(tft,"ТЕМПЕРАТУРА В", 190, 40, 0);
   printRus(tft,"ДОМЕ, *С:", 210, 55, 0);
   printRus(tft,"ВЛАЖНОСТЬ НА", 35, 125, 0);
   printRus(tft,"УЛИЦЕ, %:", 50, 140, 0);
   printRus(tft,"ВЛАЖНОСТЬ В", 200, 125, 0);
   printRus(tft,"ДОМЕ, %:", 215, 140, 0);
   printRus(tft,"ДАВЛЕНИЕ, ММ.ВОД.СТ:", 30, 215, 0);
   tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
   tft.drawLine ( 0, 115, 319, 115 ); // горизонтальная линия посередине
   tft.drawLine ( 159, 30, 159, 200  ); // вертикальная линия
   tft.drawLine ( 0, 200, 319, 200 ); // горизонтальная линия над давлением
   if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
   break;
  case 2: // меню топочной
   tft.setColor(VGA_WHITE);
   tft.setFont(BigRusFont);
   tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
   tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
   printRus(tft, week, 280, 6, 0); // вывідим ДЕНЬ НЕДЕЛИ
   tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
   tft.setFont(SmallRusFont);
   printRus(tft,"ТЕМПЕРАТУРА РЕЦИРКУЛЯЦИИ:", 5, 40, 0);
   printRus(tft,"ТЕМПЕРАТУРА ГВС:", 5, 58, 0);
   printRus(tft,"ТЕМПЕРАТУРА НА УЛИЦЕ:", 5, 76, 0);
   printRus(tft,"ТЕМПЕРАТУРА В ДОМЕ:", 5, 94, 0);
   printRus(tft,"РЕЖИМ ГАЗОВОГО КОТЛА:", 5, 112, 0);
   printRus(tft,"ТЕМПЕРАТУРА ПОДАЧА:", 5, 130, 0);
   printRus(tft,"ТЕМПЕРАТУРА ОБРАТКА:", 5, 148, 0);
   printRus(tft,"ТЕМПЕРАТУРА ТВЕРДОТОП:", 5, 166, 0);
   printRus(tft,"РЕЖИМ ТОПОЧНОЙ:", 5, 184, 0);
   printRus(tft,"АВАРИЯ:", 5, 202, 0);
   tft.print ( "WI-FI dBm:", 5, 220 ); 
   tft.setColor(VGA_LIME);
   tft.printNumF ( fakttemprec, 1, 210, 40 ); // выводим температура рециркуляции
   tft.printNumF ( fakttempgvs, 1, 210, 58 ); // выводим температура ГВС
   tft.printNumF ( ylicat, 1, 210, 76 ); // выводим температура на улице
   tft.printNumF ( domt, 1, 210, 94 ); // выводим температура дом
   if (sostoyaniezima == false) { printRus(tft,"ЛЕТО", 210, 112, 0); } else { printRus(tft,"ЗИМА", 210, 112, 0); } // выводим режим газового котла
   tft.printNumF ( fakttemppodacha, 1, 210, 130 ); // выводим температура подачи
   tft.printNumF ( fakttempobratka, 1, 210, 148 ); // выводим температура обратки
   tft.printNumF ( fakttemptverd, 1, 210, 166 ); // выводим температура ТК
   if (buttonV16 == 1) { printRus(tft,"ГАЗОВЫЙ КОТЕЛ        ", 130, 184, 0); } else { printRus(tft,"ТВЕРДОТОПЛИВНЫЙ КОТЕЛ", 130, 184, 0); } // выводим режим топочной
   if ((alarmzaryad == false) && (alarmtk == false) && (alarmzagtk == false) && (alarmgaz == false)) { printRus(tft,"НЕТ                       ", 65, 202, 0); } // если нет аварий
   tft.printNumI ( WiFi.RSSI(), 90, 220 ); // выводим уровень связи Wi-Fi
   tft.setColor(VGA_YELLOW);
   tft.printNumI ( temprec, 250, 40 ); // выводим установленную температуру рециркуляции
   if (buttonV18 == 1) { printRus(tft,"АВТО", 275, 40, 0); } else { printRus(tft,"ВЫКЛ", 275, 40, 0); } // режим рециркуляции АВТО/ВЫКЛ
   tft.printNumI ( tempgvs, 250, 58 ); // выводим установленную температуру ГВС
   if (buttonV17 == 1) { printRus(tft,"АВТО", 275, 58, 0); } else { printRus(tft,"ВЫКЛ", 275, 58, 0); } // режим ГВС АВТО/ВЫКЛ
   tft.printNumI ( tempzl, 250, 76 ); // выводим установленную температуру ЗИМА/ЛЕТО
   tft.printNumF ( temphome, 1, 250, 94 ); // выводим установленную температуру в доме
   tft.printNumI ( tempavar, 250, 166 ); // выводим установленную температуру аварии ТК
   tft.printNumI ( tempzagtverd, 275, 166 ); // выводим установленную температуру загрузки ТК
   tft.setColor(VGA_RED);
   if (alarmzaryad == true) { printRus(tft,"НИЗКИЙ ЗАРЯД АККУМУЛЯТОРА!", 65, 202, 0); } // авария аккумулятор
   if (alarmtk == true) { printRus(tft,"ПЕРЕГРЕВ ТК!              ", 65, 202, 0); } // авария ТК
   if (alarmzagtk == true) { printRus(tft,"ЗАГРУЗИТЬ ТК ТОПЛИВОМ!    ", 65, 202, 0); } // авария загрузить топливом ТК
   if (alarmgaz == true) { printRus(tft,"ОБНАРУЖЕН ГАЗ!           ", 65, 202, 0); } // авария ГАЗ
   if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
   break;
  case 3: // меню автополива
   tft.setColor(VGA_WHITE);
   tft.setFont(BigRusFont);
   tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
   tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
   printRus(tft, week, 280, 6, 0); // выводим ДЕНЬ НЕДЕЛИ
   tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
   tft.setFont(SmallRusFont);
   printRus(tft,"КАПЕЛЬНЫЙ ЮГ:", 5, 40, 0);
   printRus(tft,"ГАЗОН ЮГ 2:", 5, 60, 0);
   printRus(tft,"ГАЗОН ЮГ 3:", 5, 80, 0);
   printRus(tft,"ЗАБОР СМУ:", 5, 100, 0);
   printRus(tft,"СЕВЕР 2:", 5, 120, 0);
   printRus(tft,"КАПЕЛЬНЫЙ СЕВЕР:", 5, 140, 0);
   printRus(tft,"ГАЗОН СЕВЕР:", 5, 160, 0);
   printRus(tft,"УВЕДОМЛЕНИЯ:", 5, 180, 0);
   printRus(tft,"АВТОПОЛИВ:", 5, 200, 0);
   printRus(tft,"РУЧНОЙ ПОЛИВ:", 5, 220, 0);
   poliv(startTimeV1, stopTimeV1, 150, 40, weekV1[weekday()], sostoyanieV1); 
   poliv(startTimeV2, stopTimeV2, 150, 60, weekV2[weekday()], sostoyanieV2); 
   poliv(startTimeV3, stopTimeV3, 150, 80, weekV3[weekday()], sostoyanieV3); 
   poliv(startTimeV4, stopTimeV4, 150, 100, weekV4[weekday()], sostoyanieV4); 
   poliv(startTimeV5, stopTimeV5, 150, 120, weekV5[weekday()], sostoyanieV5); 
   poliv(startTimeV6, stopTimeV6, 150, 140, weekV6[weekday()], sostoyanieV6); 
   poliv(startTimeV7, stopTimeV7, 150, 160, weekV7[weekday()], sostoyanieV7); 
   tft.setColor(VGA_LIME);
   if (buttonV19 == 1) { printRus(tft,"ВКЛ ", 150, 180, 0); } else { printRus(tft,"ВЫКЛ", 150, 180, 0); } // уведомления АВТО/ВЫКЛ
   if (buttonV0 == 1) { printRus(tft,"ВКЛ ", 150, 200, 0); } else { printRus(tft,"ВЫКЛ", 150, 200, 0); } // режим автополива АВТО/ВЫКЛ
   if (sostoyaniemanual == true) { printRus(tft,"ВКЛ ", 150, 220, 0); } else { printRus(tft,"ВЫКЛ", 150, 220, 0); } // режим автополива АВТО/ВЫКЛ
   if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
   break; 
  case 4: // меню термостата
   tft.setColor(VGA_WHITE);
   tft.setFont(BigRusFont);
   tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
   tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
   printRus(tft, week, 280, 6, 0); // выводим ДЕНЬ НЕДЕЛИ
   tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
   tft.drawCircle (160, 135, 85);
   tft.drawCircle (160, 135, 90);
   tft.setFont(SmallRusFont);
   if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
   tft.setFont(SevenSegNumFontPlusPlus);
   if (temphome <= 18) { tft.setColor(VGA_AQUA); }
   else if (temphome >= 25) { tft.setColor(VGA_RED); }
   else { tft.setColor(VGA_LIME); }
   tft.printNumF ( temphome, 1, 95, 110 );
   break; 
 }
}

void button() { // функция выполняется при нажатии кнопки
 if(digitalRead(0) == LOW){  
  butterm = !butterm; // меняем значение на противоположное
  if (butterm == true) { menu = 4; } //заходим/выходим в/из меню термостата
  else { 
  menu = 1; 
  menupos = 1;
  Blynk.virtualWrite(V6, temphome); //отправляем из термостата в приложение установленную температуру
  terminal.println(String(currentTime) + " " + currentDate + " Темп. в доме: " + temphome + "*С");
  terminal.flush(); // отправляет данные из устройства в терминал 
  } 
  tft.clrScr(); // Заливаем экран черным
  autoplay();
 } 
}

void termostat() { // отправляем данные в приложение и отвечает за часы
 if (minute() < 10) {minutenorm = String("0") + minute();} // необходимо для преобразования минут в формат 00 - 59
 else {minutenorm = minute();}
 if (hour() < 10) {hournorm = String("0") + hour();} // необходимо для преобразования часов в формат 00 - 24
 else {hournorm = hour();}
 currentTime = String(hournorm) + ":" + minutenorm; //записываем в переменную время
 switch (weekday()) {
    case 1:
      week = "ВС";
      break;
    case 2:
      week = "ПН";
      break;
    case 3:
      week = "ВТ"; 
      break;
    case 4:
      week = "СР";
      break;
    case 5:
      week = "ЧТ";
      break;
    case 6:
      week = "ПТ";
      break;
    case 7:
      week = "СБ";
      break;
 } 
 if (day() < 10) {daynorm = String("0") + day();} // необходимо для преобразования дней в формат 01 - 31
 else {daynorm = day();}
 if (month() < 10) {monthnorm = String("0") + month();} // необходимо для преобразования месяцев в формат 01 - 12
 else {monthnorm = month();} 
 currentDate = String(daynorm) + "." + monthnorm + "." + year(); //записываем в переменную дату 
 dht22.read2(16, &domt, &domh, NULL); // считываем данные термостата
 Blynk.virtualWrite(V3, domt); // температура
 Blynk.virtualWrite(V4, domh); // влажность
 Blynk.virtualWrite(V0, WiFi.RSSI()); // уровень WI-FI
 homet.virtualWrite(V33, domt, temphome);  // Отправляем данные в топочную
}

void poliv (long startzone, long stopzone, int x, int y, boolean week, boolean sost) { // функция приводит время начала и остановки полива в нужный формат и выводит на экран
 String mstartnorm;
 String mstopnorm;  
 String hstartnorm;
 String hstopnorm;
 int hstart = floor(startzone / 3600);
 int mstart = (startzone - hstart*3600)/60; 
 if (hstart < 10) {hstartnorm = String("0") + hstart;} else {hstartnorm = hstart;} 
 if (mstart < 10) {mstartnorm = String("0") + mstart;} else {mstartnorm = mstart;}
 int hstop = floor(stopzone / 3600);
 int mstop = (stopzone - hstop*3600)/60;  
 if (hstop < 10) {hstopnorm = String("0") + hstop;} else {hstopnorm = hstop;}
 if (mstop < 10) {mstopnorm = String("0") + mstop;} else {mstopnorm = mstop;}
 if (week == true) { tft.setColor(VGA_LIME); } else { tft.setColor(VGA_RED); }
 tft.print (String(hstartnorm) + ":" + mstartnorm + " - " + hstopnorm + ":" + mstopnorm, x, y);
 if (sost == true) { tft.setColor(VGA_LIME); } else { tft.setColor(VGA_RED); }
 tft.fillCircle (x+125, y+6, 6);
}

void setup() {
 pinMode(0, INPUT); // перевод пина D3 в режим входа - кнопка энкодера
 Blynk.begin(auth, ssid, pass, IPAddress(192,168,0,105), 8080);
 while (Blynk.connect() == false) {
    // Ждем пока не подключится к серверу
 }
 rtc.begin(); // синхронизируем часы 
 terminal.println("Успешный старт!");  // пишем что все ОК
 terminal.print("- Уровень сигнала, dBm: "); 
 terminal.println(WiFi.RSSI()); // уровень сигнала
 terminal.print("- IP адресс: "); 
 terminal.println(WiFi.localIP()); // IP адресс выданный в сети
 terminal.print("- MAC адресс: "); 
 terminal.println(WiFi.macAddress()); // MAC адресс выданный в сети
 terminal.flush(); // отправляет данные из устройства в терминал 
 firststart = true; // первое подключение к облаку.
 tft.InitLCD(); // Запускаем экран
 timer.setInterval(60000L, termostat); // вызываем цикл каждые 60 секунд - отправка данных в приложение и часы
 timer.setInterval(20000L, autoplay); // вызываем цикл каждые 20 секунд - обновляем данные на экране
 timer.setInterval(200L, button); // вызываем цикл каждые 200мс - контролируем нажатие на энкодер
 ArduinoOTA.setPassword((const char *)"-"); // пароль для обновления по воздуху
 ArduinoOTA.begin(); //обновление по воздуху
}

void loop() {
 Blynk.run();
 timer.run();
 newPosition = myEnc.read()/2;
 if (newPosition != oldPosition) {
// ПРОЛИСТІВАЕМ МЕНЮ 
  if ((newPosition > oldPosition) && (butterm == false)) { // если крутим в право вне меню термостата
   menupos += 1; 
   if (menupos > 11) {menupos = 11; granica = true;} else {granica = false;} // если значение больше максимума приравниваем его максимуму, также недаем очищаться экрану и выполнять функцию автоплей
  }
  if ((newPosition < oldPosition) && (butterm == false)) { // если крутим в лево вне меню термостата
   menupos -= 1; 
   if (menupos < 1) {menupos = 1; granica = true;} else {granica = false;} // если значение меньше минимума приравниваем его минимуму, также недаем очищаться экрану и выполнять функцию автоплей
  }  
// МЕНЯЕМ ТЕМПЕРАТУРУ В МЕНЮ ТЕРМОСТАТА
  if ((newPosition > oldPosition) && (butterm == true)) { // если крутим в право в меню термостата
   temphome += 0.2;  
   if (temphome > 30) { temphome = 30; } // если значение температуры больше максимума, выставляем максимум
  }
  if ((newPosition < oldPosition) && (butterm == true)) { // если крутим в лево в меню термостата
   temphome -= 0.2; 
   if (temphome < 10) { temphome = 10; } // если значение температуры меньше минимума, выставляем минимум
  }
  oldPosition = newPosition;
  if ((granica == false) && (butterm == false)) { // если мы находимся в пределах границы и не в меню термостата
   switch (menupos) { // если значение достигло необходимого для данного номера меню
     case 1:
       menu = 1;
       tft.clrScr(); // Заливаем экран черным
       autoplay(); 
       break;
     case 6:
       menu = 2;
       tft.clrScr(); // Заливаем экран черным
       autoplay(); 
       break;
     case 11:
       menu = 3;
       tft.clrScr(); // Заливаем экран черным
       autoplay(); 
       break;
   }
  }  
  if (butterm == true) { // если мы в меню термостата
   if (temphome <= 18) { tft.setColor(VGA_AQUA); }
   else if (temphome >= 25) { tft.setColor(VGA_RED); }
   else { tft.setColor(VGA_LIME); }
   tft.printNumF ( temphome, 1, 95, 110 ); // необходимо, чтобы в меню термостата при повороте энкоде менялась температура
  } 
 }
 ArduinoOTA.handle();
}

Для определения причины перезагрузки добавил в скетч функцию ESP.getResetReason() . При перезагрузке возвращает значение - exception. Возможно, можно что-то добавить в скетч, чтобы увидеть больше подробностей из сериалмонитора (возможно как-то отправить данные на виджет теминал)??

@vshymanskyy плиз посмотри

оч. сложний скетч. надо минимал скетч, на котором воспроизводится проблема.