Problema em Ler Temperatura e Controlar Tensão Dimmer Shield L293D

Boa tarde, estou fazendo um projeto de uma chocadeira automática, mas estou penando para que o controlador de tensão e o dht22 funcionem corretamente juntos. Ele deve funcionar assim: Enquanto a temperatura estiver abaixo do mínimo, ele deve aumentar a potencia gradualmente da lampada, até que a temperatura chegue a temperatura ideal. Depois que ela chega na temperatura ideal, a lampada deve reduzir a potencia, até que estabilize a temperatura na faixa ideal, oscilando pouco na potencia.
Meu código é esse:

#include "DHT.h" //Biblioteca do DHT
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

#define PINODHT 7     //Pino para comunicação com DHT
#define TIPODHT DHT22 //DHT22(AM2302/ AM2321)
 
DHT dht(PINODHT, TIPODHT);    //Configuraçãoes do DHT

//Porcentagem inicial em 40%, variável com valor da 0 a 100.
volatile int power = 40;
float tempmax = 38.2;
float tempmin = 37.2;
float tempmed = 37.8;
volatile float dif = 0;
int load = 3;

void setup() {

   lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.begin(20, 4); // inicializa o LCD
  lcd.setCursor(0, 1);
  lcd.print("Chocadeira Iniciando");
  delay(2500);
  lcd.clear();
  dht.begin(); //Inicializa o DHT

    pinMode(load, OUTPUT);
  //Inicializa interrupção. O número zero indica a porta 2 do arduino,
  //zero_cross_int é a função que será chamada toda vez que pino 2 do
  //Aeduino, "subir" (RISING) de valor de 0 para 1.
    attachInterrupt(0, zero_cross_int, RISING);
    
    }

void loop() {
  //delay(1000);
  //Ler a temperatura ou humidade leva cerca de 250 milisegundos!
  float h = dht.readHumidity();
  //Lê a temperatura em Celsius (padrão)
  float t = dht.readTemperature();
  // Checando se qualquer leitura falhou.
    if (isnan(h) || isnan(t)) {
      lcd.setCursor(0, 1);
      lcd.print("Falha ao ler");
      return;
    }

    delay(500);

    dif = tempmed - t;
  lcd.setCursor(0, 0);
  lcd.print("Umid: ");
  lcd.setCursor(6, 0);
  lcd.print(h);
  lcd.setCursor(12, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.setCursor(6, 1);
  lcd.print(t);
  lcd.setCursor(12, 1);
  lcd.print("C ");
  lcd.setCursor(0, 2);
  lcd.print("Lamp: ");
  lcd.setCursor(6, 2);
  lcd.print(power);
  lcd.setCursor(12, 2);
  lcd.print("%");
  lcd.setCursor(0, 3);
  lcd.print("dif: ");
  lcd.setCursor(6, 3);
  lcd.print(dif);
  lcd.setCursor(12, 3);
  lcd.print("");
  
//abaixo da temperattura mínima
  if(t <= tempmin){
    if(power < 95){
    power++;
    delay(200);
    }
    lcd.setCursor(12, 3);
    lcd.print("abaixo");
  }

//manutenção da temperatura ideal
  if(t > tempmin){
    if(t < tempmed){
       if(power < 95){
          power++;
          delay(200);
          lcd.setCursor(12, 3);
          lcd.print("media+");
          }
    }
    if(t >= tempmed){
       if(power > 40){
        power--;
        delay(200);
        }
       lcd.setCursor(12, 3);
       lcd.print("media-");
    }     
  }     
}

//Função executada quando o Dimmer Shield detecta a passagem por zero da
//tensão alternada (senóide)
void zero_cross_int()
{
  //Cálculo do ângulo de disparo: 60Hz -> 8,33ms (1/2 ciclo)
  //(8333us - 8,33us) / 100 = 83 (aproximadamente)

  //O powertime é o tempo que o TRIAC permanescerá desligado quando é
  //detectado o ponto 0 da senóide e varia de 0 a 8300 microsegundos
  int powertime = (83 * (100 - power));

  //Se o powertime for menor ou igual a 300 microsegundos, dar o comando
  //de ligar a lâmpada (carga) - potência total fornecida
  if (powertime <= 830)
  {
    //Liga o pulso do sinal ao TRIAC para que ele passe a conduzir,
    //coloca o pino digital "load" em nível alto
    digitalWrite(load, HIGH);
  }

  //Se o powertime for menor ou igual a 8000 microsegundos, dar o comando
  //de desligar a lâmpada (carga) - potência zero fornecida
  else if (powertime >= 8000)
  {
    //Desliga o pulso do sinal ao TRIAC para que ele não conduza,
    //coloca o pino digital "load" em nível baixo
    digitalWrite(load, LOW);
  }

  //Se o powertime estiver entre 300 microsegundos a 8000 microsegundos
  else if ((powertime > 830) && (powertime < 8000))
  {
    //Mantém o circuito desligado por powertime microssegundos (espera
    //powertime microssegundos)
    delayMicroseconds(powertime);

    //Envia sinal ao TRIAC para que ele passe a conduzir, coloca o pino
    //digital "load" em nível alto
    digitalWrite(load, HIGH);

    //Espera 8,33 microssegundos para que o TRIAC perceba o pulso
    delayMicroseconds(8.33);

    //Desliga o pulso do TRIAC, coloca o pino digital "load" em nível baixo
    digitalWrite(load, LOW);
  }
}

Meu problema está quando a temperatura sobe, e deveria começar a baixar a potencia, ai meu dht22 para de ler a temperatura.
Obrigado.