Problema millis() e cambio pagina

salve, sto impazzendo da qualche giorno. Ho creato questo codice e per ora fa quello che voglio, ma nel momento in cui vorrei aggiungere la funzione millis() per uscire automaticamente da una funzione, il programma impazzisce, oppure se sono in funzione e voglio passare a un’altra, devo premere esc e poi posso entrare nell’altra. Qualcuno mi può aiutare? questo è il codice

/*connessioni sulla scheda
   ir 1838 ( s - +) pin 11
   led resisteza 220ohm sul -, pin 13
   dht 11 ( s + -) pin 12
   rtc1302 (+ - CE , IO , CLK) pin 10 9 8, rst=ce, IO=dat, clk=clk
   schermo (- + sda scl) pin A4 sda, A5 scl
     lcd.backlight();
     lcd.noBacklight();
   bottone pag1 pin7
   bottone pag2 pin6
   bottone esc pin5
*/
///////////////////////////////////// LIBRERIE ///////////////////////////////////
#include <DS1302.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "IRremote.h"
#include <Wire.h>

/////////////////////////////////// VARIABILI ///////////////////////////////////
int receiver = 11; // Non usare 3 e 13
float temp,u, tmax = 0, tmin = 80, TMax = 0, TMin = 0; 
int  statopulsante1, statopulsante2, esci = LOW;
int statopulizia, statomain;
int stato = 0;
int ButtonValue;
const byte led1 = 13;

byte bulbo[8] = {B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110};
byte goccia[8] = {B00100,B00100,B01010,B01010,B10001,B10001,B10001,B01110};
byte gradi[8] = {B11000,B11000,B00011,B00100,B00100,B00100,B00011,B00000};
byte luce[8] = {B00100,B01010,B10001,B10001,B01010,B00100,B00100,B01110};
const int pag1 = 7; 
const int pag2 = 6;
const int esc = 5;


/////////////////////////////////////////////////////////////////////////////
IRrecv irrecv(receiver);           // IR
decode_results results;            // IR
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  //DISPLAY
DS1302 rtc(10, 9, 8); //RTC orologio
DHT dht(12, DHT11); //DHT temperatura

void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  
  pinMode(pag1, INPUT);     // bottone 1
  pinMode(pag2, INPUT);     // bottone2
  pinMode(esc, INPUT);     // esc
  pinMode (led1, OUTPUT);  //led
   //// disabilita protezione RTC per orologio/////////////////////////
  rtc.halt(false);
  rtc.writeProtect(false);
  lcd.createChar(1, bulbo);
  lcd.createChar(2, goccia);
  lcd.createChar(3, gradi);
  lcd.createChar(4, luce);
  dht.begin();
  irrecv.enableIRIn(); // Start IR
  // Per modificare data o ora togliere commento e caricare i 3 set, poi ripristinarli e ricaricare
 //rtc.setDOW(SABATO);        // Set Day-of-Week to FRIDAY
  //rtc.setTime(12, 46, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(24, 12, 2016);   // Set the date to August 6th, 2010
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  ir();  
  statopulizia = stato;
  errore();
  dati();
  mainpage();
  bottone();
  if (ButtonValue == 10) lcd.noBacklight(); else if (ButtonValue == 12) lcd.backlight();
  if (statopulsante1 == HIGH && esci == LOW || ButtonValue == 1) {
    while (esci == LOW) 
    {
      pagina1();
     }
  }
  if (statopulsante2 == HIGH && esci == LOW || ButtonValue == 2) {
    while (esci == LOW) 
    {
    pagina2();
   }
}
  }
/////////////////////////////////////////////////////////////////////////////Mainpage
void mainpage(){
  
  if (statomain == stato) lcd.clear();

  lcd.setCursor(12, 0);
  lcd.print("     ");
  lcd.setCursor(10, 1);
  lcd.print(" ");
  
  // scrittura a video
  // GIORNO
  lcd.setCursor(3, 0);
  lcd.print(rtc.getDOWStr()); //FORMAT_SHORT
    // Data
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDateStr()); //FORMAT_SHORT
  //ORA
  lcd.setCursor(11, 1);
  lcd.print(rtc.getTimeStr(FORMAT_SHORT)); //FORMAT_SHORT
  statomain = 1;
  }

/////////////////////////////////////////////////////////////Dati
void dati() {
  temp = dht.readTemperature() - 3;
  u = dht.readHumidity() + 10;
  TMax = TMin = temp;
}
////////////////////////////////////////////////////////////////Pagina1
void pagina1() {
   if (statopulizia == stato) lcd.clear();
  if (esci == LOW)
  {
    ir();
  errore();
  dati();
  bottone();
  lcd.setCursor(0, 0);
  lcd.write("Int ");
  lcd.setCursor(5, 0);
  lcd.write(1);
  lcd.setCursor(7, 0);
  lcd.print(temp, 0);
  lcd.setCursor(9, 0);
  lcd.write(3);
  lcd.setCursor(11, 0);
  lcd.write(2);
  lcd.setCursor(13, 0);
  lcd.print(u, 0);
  lcd.setCursor(15, 0);
  lcd.print("%");
  /////EXT//////////////
  lcd.setCursor(0, 1);
  lcd.write("Ext ");
  lcd.setCursor(5, 1);
  lcd.write(1);
  lcd.setCursor(7, 1);
  //lcd.print(tx, 0);
  lcd.setCursor(9, 1);
  lcd.write(3);
  lcd.setCursor(11, 1);
  lcd.write(2);
  lcd.setCursor(13, 1);
 // lcd.print(ux, 0);
  lcd.setCursor(15, 1);
  lcd.print("%");
  statopulizia = 1;
  statomain = 0;
  if (statopulsante2 == HIGH && esci == LOW) 
  lcd.clear();
  pagina2();
  }
  else
  mainpage();
}
//////////////////////////////////////////////////////////Pagina2
void pagina2() {
  if (statopulizia == stato) lcd.clear();
  if (esci == LOW)
  { 
    ir();
  errore();
  dati();
  bottone();
  Tmaxmin();
  }
   else
  mainpage();
    }
/////////////////////////////////////////////////////////Tmaxmin
void Tmaxmin(){
    
   if (temp < tmin) tmin = TMin;

  if (temp > tmax) tmax = TMax;
  
    /////////min////////
  lcd.setCursor(1, 0);
  lcd.print("T-Min");
  lcd.setCursor(1, 1);
  lcd.print(tmin,1);
  lcd.setCursor(5, 1);
  lcd.write(3);
  //////////max//////////
  lcd.setCursor(10, 0);
  lcd.print("T-Max");
  lcd.setCursor(10, 1);
  lcd.print(tmax,1);
  lcd.setCursor(14, 1);
  lcd.write(3);
  statopulizia = 1;
  statomain = 0;
        
}
///////////////////////////////////////////////////////Errore DHT
void errore() {
    
  if  (isnan(temp) || isnan(u))
  {
     lcd.clear();  
    lcd.setCursor(4, 0);
    lcd.print("ERRORE DHT");
    digitalWrite(led1, HIGH);
    delay(1000);    
    statomain = 0;
  }
  else
  {
    digitalWrite(led1, LOW);
  }
}
///////////////////////////////////////////////
void bottone(){
  statopulsante1 = digitalRead(pag1);  
  statopulsante2 = digitalRead(pag2);
  esci = digitalRead(esc);
  
}
/////////////////////////////////////////////ir
void ir() {
   if (irrecv.decode(&results)) 
   {
    ButtonValue = translateIR();
    //lcd.setCursor(7, 1);
    //lcd.print(ButtonValue, DEC);
    irrecv.resume(); // receive the next value
    } 
}

int translateIR() {

 switch(results.value)

  {

  case 0xFFA25D:  
      return 10;  // CH-
    break;

  case 0xFF629D:  
    return 11; // CH
    break;

  case 0xFFE21D:  
    return 12; // CH+
    break;

  case 0xFF22DD:  
    return 13; // PREV
    break;

  case 0xFF02FD:  
    return 14; // NEXT
    break;

  case 0xFFC23D:  
    return 15; //  PLAY/PAUSE     
    break;

  case 0xFFE01F:  
    return 16; // VOL-
    break;

  case 0xFFA857:  
    return 17; // VOL+ 
    break;

  case 0xFF906F:  
    return 18; // EQ 
    break;

  case 0xFF6897:  
    return 0; // ZERO
    break;

  case 0xFF9867:  
    return 100; // 100+ 
    break;

  case 0xFFB04F:  
    return 200; // 200+ 
    break;

  case 0xFF30CF:  
    return 1;  // 1 etc.. to 9
    break;

  case 0xFF18E7:  
    return 2; 
    break;

  case 0xFF7A85:  
    return 3; 
    break;

  case 0xFF10EF:  
    return 4;  
    break;

  case 0xFF38C7:  
    return 5; 
    break;

  case 0xFF5AA5:  
    return 6; 
    break;

  case 0xFF42BD:  
    return 7; 
    break;

  case 0xFF4AB5:  
    return 8;  
    break;

  case 0xFF52AD:  
    return 9; // 9 
    break;

  case 0xFFFFFFFF:  
    return -2; // REPEAT: Button Held down longer than 
    break;
  default: 
    return -1; // Other Button  / Bad Code
  }
  }