Need help with logic in floor heating controller

So, I made a controller with Arduino Mega 2560, ENC28j60 Ethernet Shield, and 8 relay module.
I also have sensors in my rooms that send to Mega temperature (Wemos D1 with BNP180).

My problem is, when the controller changes from heating mode to a normal mode, relays get to HIGH if actualTemp is greater than setTemp - hysteresis. How can I make it to stay relay at LOW after a change to normal until actualTemp value gets to SetTemp.

void heating(){
    for(int i=0; i<4; i++) {
        digitalWrite(r[i], LOW);
        p[i] = 1;
    }
    digitalWrite(r[7], LOW);
    digitalWrite(r[6], LOW);
    led1.on();
    led2.on();
    mode = 1;
    heat = 1;

}


void normal(){
  if(heat == 1){
      for(int i=0; i<4; i++) {
        digitalWrite(r[i], HIGH);
        p[i] = 0;
        digitalWrite(r[7], LOW);
        led1.on();
      }
        
    }
    digitalWrite(r[6], HIGH);
    led2.off();
    led1.off();
    heat = 0;
  }
  if(heat == 0){ 
    for(int i=0; i<4; i++) {
        if(actualTemp[i] < setTemp[i] - histeresis){
            digitalWrite(r[i], LOW);
            p[i] = 1;
        }
        if(actualTemp[i] >= setTemp[i]){
            digitalWrite(r[i], HIGH);
            p[i] = 0;
        }
    }
        if(p[0] == 1 || p[1] == 1 || p[2] == 1 || p[3] == 1){
            digitalWrite(r[7], LOW);
            led1.on();
        }else{
            digitalWrite(r[7], HIGH);
            led1.off();
        }
    digitalWrite(r[6], LOW);
    led2.on();
    mode = 2;
  }
}

And of course, there’s all code:

#define BLYNK_PRINT Serial

#include <UIPEthernet.h>
#include <BlynkSimpleUIPEthernet.h>
#include <TimeLib.h>
#include <EEPROM.h>
#include <WidgetRTC.h>

BlynkTimer timer;
WidgetRTC rtc;
WidgetLED led1(V30);
WidgetLED led2(V31);
WidgetLED ledr0(V32);
WidgetLED ledr1(V33);
WidgetLED ledr2(V34);
WidgetLED ledr3(V35);
WidgetTerminal terminal(V40);

char auth[] = "123123123";

const int r[8] = {30, 31, 32, 33, 34, 35, 36, 37};
const float histeresis = 2.00f;

int p[4] = {0};
float setTemp[4] = {0.00f};
float actualTemp[4] = {1.00f};
float H = 0.00f;
float M = 0.00f;
float T = 0.00f;
float m = 0.00f;
float t[4] = {0.00f};
int mode, stopHeat;
int heat = 1;

BLYNK_CONNECTED() {
  rtc.begin();
}

void setup(){
    Serial.begin(9600);
    Blynk.begin(auth);
    
    EEPROM.get(0, t[0]);
    EEPROM.get(10, t[1]);
    EEPROM.get(20, t[2]);
    EEPROM.get(30, t[3]);
    
    Serial.println("Witam! Zaczynam działanie ;)");
    Serial.println("t0: " + String(t[0]));
    Serial.println("t1: " + String(t[1]));
    Serial.println("t2: " + String(t[2]));
    Serial.println("t3: " + String(t[3]));

    for(int i = 30; i < 38; i++){
        pinMode(i, OUTPUT);
        digitalWrite(i, LOW);
        delay(200);
        digitalWrite(i, HIGH);
    }
    timer.setInterval(60000L, clockDisplay);
    led1.off();
    led2.off();
    setSyncInterval(10 * 60);
    Blynk.run();
}

void loop(){
    if(Blynk.connected()) {
        Blynk.run();
        timer.run();
    } else {
        Blynk.connect(3333);
    }
    m = minute();
    H = hour();
    M = m/60;
    T = H + M;

    if(T >= t[0] && T < (t[0] + 1.00) || T >= t[2] && T < (t[2] + 1.00))heating();

    if(T >= (t[0] + 1.00) && T < t[1] || T >= (t[2] + 1.00) && T < t[3])normal();

    if(T >= t[1] && T < t[2] || T >= t[3] && T < 24.00 || T >= 0.00 && T < t[0])pause();

    if(p[0] == 1){ledr0.on();}
    if(p[1] == 1){ledr1.on();}
    if(p[2] == 1){ledr2.on();}
    if(p[3] == 1){ledr3.on();}
    if(p[0] == 0){ledr0.off();}
    if(p[1] == 0){ledr1.off();}
    if(p[2] == 0){ledr2.off();}
    if(p[3] == 0){ledr3.off();}
    
}

void heating(){
    for(int i=0; i<4; i++) {
        digitalWrite(r[i], LOW);
        p[i] = 1;
    }
    digitalWrite(r[7], LOW);
    digitalWrite(r[6], LOW);
    led1.on();
    led2.on();
    mode = 1;
    heat = 1;

}


void normal(){
  if(heat == 1){
      for(int i=0; i<4; i++) {
        digitalWrite(r[i], HIGH);
        p[i] = 0;
        digitalWrite(r[7], LOW);
        led1.on();
      }
        
    }
    digitalWrite(r[6], HIGH);
    led2.off();
    led1.off();
    heat = 0;
  }
  if(heat == 0){ 
    for(int i=0; i<4; i++) {
        if(actualTemp[i] < setTemp[i] - histeresis){
            digitalWrite(r[i], LOW);
            p[i] = 1;
        }
        if(actualTemp[i] >= setTemp[i]){
            digitalWrite(r[i], HIGH);
            p[i] = 0;
        }
    }
        if(p[0] == 1 || p[1] == 1 || p[2] == 1 || p[3] == 1){
            digitalWrite(r[7], LOW);
            led1.on();
        }else{
            digitalWrite(r[7], HIGH);
            led1.off();
        }
    digitalWrite(r[6], LOW);
    led2.on();
    mode = 2;
  }
}

void pause(){
    for(int i=0; i<4; i++) {
        digitalWrite(r[i], HIGH);
        p[i] = 0;
    }
    digitalWrite(r[7], HIGH);
    digitalWrite(r[6], HIGH);
    led1.off();
    led2.off();
    mode = 3;
}

void clockDisplay() {
    if(mode == 1){
      Serial.println(String(hour()) + ":" + String(minute()) + "     grzanie     " + String(T));
      terminal.println(String(hour()) + ":" + String(minute()) + "     grzanie     " + String(T));      
      }
    if(mode == 2){
      Serial.println(String(hour()) + ":" + String(minute()) + "   normalny    " + String(T));
      terminal.println(String(hour()) + ":" + String(minute()) + "    normalny    " + String(T));      
      }
    if(mode == 3){
      Serial.println(String(hour()) + ":" + String(minute()) + "     przerwa     " + String(T));
      terminal.println(String(hour()) + ":" + String(minute()) + "     przerwa     " + String(T));
      }

}

BLYNK_WRITE(V20){
    float x = param.asFloat();
    t[0] = x;
    EEPROM.put(0, t[0]);
    Serial.println(t[0]);
    terminal.println(t[0]);
}

BLYNK_WRITE(V21){
    float x = param.asFloat();
    t[1] = x;
    EEPROM.put(10, t[1]);
    Serial.println(t[1]);
    terminal.println(t[1]);
}

BLYNK_WRITE(V22){
    float x = param.asFloat();
    t[2] = x;
    EEPROM.put(20, t[2]);
    Serial.println(t[2]);
    terminal.println(t[2]);
}

BLYNK_WRITE(V23){
    float x = param.asFloat();
    t[3] = x;
    EEPROM.put(30, t[3]);
    Serial.println(t[3]);
    terminal.println(t[3]);
}


//sensor0
BLYNK_WRITE(V10) {
  float x = param[0].asFloat();
  float y = param[1].asFloat();
  setTemp[0] = x;
  actualTemp[0] = y;
}
//sensor1
BLYNK_WRITE(V11) {
  float x = param[0].asFloat();
  float y = param[1].asFloat();
  setTemp[1] = x;
  actualTemp[1] = y;
}
//sensor2
BLYNK_WRITE(V12) {
  float x = param[0].asFloat();
  float y = param[1].asFloat();
  setTemp[2] = x;
  actualTemp[2] = y;
}
//sensor3
BLYNK_WRITE(V13) {
  float x = param[0].asFloat();
  float y = param[1].asFloat();
  setTemp[3] = x;
  actualTemp[3] = y;
}



void(* resetFunc) (void) = 0;
BLYNK_WRITE(V100)  // Reset
{
if (param.asInt()==1) {
delay(100);
resetFunc();
  } 
}

Sorry for not having great English, and thanks for all suggestions. :wink:

Are you using blynk IOT ?

@John93 No, I’m using classic Blynk app. There is no trouble with Blynk, just with code itself.

You can try the eventor widget.

@John93 That requires me to change all my code, and use a lot of Eventor Widgets. Maybe there’s another solution?

I’d start by sorting out your void loop by removing all that clutter.

Then, you should post your updated code, and explain to us how your device is switched between the various modes

Pete.