Объясните почему вылазит исключение

Есть вот такой код

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <RTClib.h>
#define DHTPIN D4  // Тот самый номер пина, о котором упоминалось выше
#define DHTPIN1 D3
#define solPin D7
#define smokePin A0
#define CLK D5
#define DT D6

int val = 0, svet = 0, vlazh = 0, gaz = 0, vremya = 0;
int value = 0;
int currentStateCLK;
int lastStateCLK;
float vlaga = 0;
float temp = 0;
// Одна из следующих строк закоментирована. Снимите комментарий, если подключаете датчик DHT11 к arduino
DHT dht(DHTPIN, DHT22);  //Инициация датчика
DHT dht1(DHTPIN1, DHT11);
LiquidCrystal_I2C lcd(0x3F, 20, 4);
int pinD0 = D0;  //пин для датчика света
int sol, minsol = 200, sensorThres = 500;
RTC_DS3231 rtc;
char tim[32];

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  dht.begin();
  dht1.begin();
  pinMode(solPin, INPUT);
  lcd.init();       // Инициализация lcd
  lcd.backlight();  // Включаем подсветку
  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  lastStateCLK = digitalRead(CLK);
}
void loop() {
  Serial.println(value);
   Serial.println(val);
  // value = Encoder(value);
  if (value == 0) {
    while (true) {
      val = Encoder(val);
      if (val != value) {
        value = val;
        lcd.clear();
        break;
      }
      float h = dht.readHumidity();       //Измеряем влажность
      float t = dht.readTemperature();    //Измеряем температуру
      float hh = dht1.readHumidity();     //Измеряем влажность
      float tt = dht1.readTemperature();  //Измеряем температуру


      if (h != vlaga || t != temp) {
        lcd.setCursor(0, 0);
        lcd.print("Humidity1: ");  // Выводим текст
        lcd.setCursor(10, 0);
        lcd.print(h);
        lcd.setCursor(0, 1);  // Устанавливаем курсор в начало 2 строки
        lcd.print("Temperature1: ");
        lcd.setCursor(13, 1);  // Выводим текст
        lcd.print(t);
        lcd.setCursor(0, 2);
        lcd.print("Humidity2: ");
        lcd.setCursor(11, 2);  // Выводим текст
        lcd.print(hh);
        lcd.setCursor(0, 3);  // Устанавливаем курсор в начало 2 строки
        lcd.print("Temperature2: ");
        lcd.setCursor(13, 3);  // Выводим текст
        lcd.print(tt);
      }
      vlaga = h;
      temp = t;
    }
  }
  //вывод данных по датчику света
  if (value == -1 || value == 1) {
    while (true) {
      val = Encoder(val);
      if (val != value) {
        value = val;
        lcd.clear();
        break;
      }
      int xD0;
      lcd.clear();
      xD0 = digitalRead(pinD0);
     // if (xD0 != svet) {
        if (xD0 == HIGH)  // Если xD0 равно "1"
        {
          lcd.setCursor(0, 0);
          lcd.print("illumination ON");  // свет включен
        } else {
          lcd.setCursor(0, 0);
          lcd.print("illumination OFF");  // свет выключен
    //    }
      }
    }
  }
  //Вывод данных по датчику влажности почвы
  if (value == -2 || value == 2) {
    while (true) {
      val = Encoder(val);
      if (val != value) {
        value = val;
        lcd.clear();
        break;
      }
      sol = analogRead(solPin);
      lcd.print("uroven_vlagi= ");  // к которому подключен датчик
      lcd.print(sol);               // выводим в порт значение АЦП сигнала с датчика
      lcd.setCursor(0, 1);
      if (sol > minsol) { lcd.print("Pocva_suhaya"); }
      if (sol < minsol) { lcd.print("Pocva_vlazhnaya"); }
      //delay(100);
    }
  }
  //Вывод данных по датчику газа
  if (value == -3 || value == 3) {
    while (true) {
      val = Encoder(val);
      if (val != value) {
        value = val;
        lcd.clear();
        break;
      }
      int analogSensor = analogRead(smokePin);  // считываем значения АЦП с аналогового входа
      if (analogSensor != gaz) {
        lcd.print("uroven_gaza= ");  // к которому подключен датчик
        lcd.print(analogSensor);     // выводим в порт значение АЦП сигнала с датчика
        lcd.setCursor(0, 1);
        // Проверяем, достигнуто ли пороговое значение
        if (analogSensor > sensorThres) {  // если значение больше допустимого...
          lcd.print(" Gaz!");              // выводим в порт надпись, что газ есть
        } else {                           // иначе...
          lcd.print(" normal");            // выводим в порт надпись, что газа нет
        }
      }
    }
  }

  //вывод времени и даты
  if (value == -4 || value == 4) {
    while (true) {
      val = Encoder(val);
      if (val != value) {
        value = val;
        lcd.clear();
        break;
      }
      lcd.print(F("   Time:   Date:"));
      lcd.setCursor(0, 2);

      for (int i = 0; i < 5; i++) {
        DateTime now = rtc.now();
        sprintf(tim, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());
        lcd.setCursor(0, 2);
        lcd.print(tim);
        // delay(1000);
      }
    }
  }
}

int Encoder(int value1) {
  currentStateCLK = digitalRead(CLK);
  // Если последнее и текущее состояние CLK различаются, то произошел импульс.
  // Реагируем только на одно изменение состояния, чтобы избежать двойного счета
  if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {

    // Если состояние DT отличается от состояния CLK, то
    // энкодер вращается против часовой стрелки, поэтому уменьшаем
    if (digitalRead(DT) != currentStateCLK) {
      value1--;
    } else {
      // Энкодер вращается по часовой стрелке, поэтому увеличиваем
      value1++;
    }
    if (value1 > 4 || value1 < -4) {
      value1 = 0;
    }
  }
  // Запоминаем последнее состояние CLK
  lastStateCLK = currentStateCLK;
  return value1;
}




> После добавления функции стало выскакивать исключение
> 
> 3fffff40:  3ffee618 3ffee63c 41d00000 42286666  
> 3fffff50:  00000000 00000000 3ffee5f0 42286666  
> 3fffff60:  41d00000 3ffee63c 3ffee604 402011e1  
> 3fffff70:  3fffda08 00000020 3ffee5f0 3ffee818  
> 3fffff80:  3fffdad0 3ffee648 3ffee660 40201754  
> 3fffff90:  422c0000 41c33333 3ffee5f0 402010aa  
> 3fffffa0:  111b0417 feef2429 feefeffe 3ffee818  
> 3fffffb0:  3fffdad0 00000000 3ffee7ec 40202f8c  
> 3fffffc0:  feefeffe feefeffe 3fffdab0 40101041  
> <<<stack<<<
> 
> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
> H!��1��)9;��9j$h0�Zh�
> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
> 
> Soft WDT reset
> 
> Exception (4):
> epc1=0x4000c999 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
> 
> >>>stack>>>
> 
> ctx: cont
> sp: 3ffffdd0 end: 3fffffd0 offset: 0160
> 3fffff30:  00000000 7fc31999 00000004 4229999a  
> 3fffff40:  3ffee618 3ffee63c 41d00000 4229999a  
> 3fffff50:  00000000 00000000 3ffee5f0 4229999a  
> 3fffff60:  41d00000 3ffee63c 3ffee604 402011d5  


В чем причина? в Ардуино совсем новичок

Где то повисает сильнее чем позволяет WDT …