U8glib si blocca

Ciao, nel mio progetto sto utilizzando un LCD 128x64 con la libreria U8glib; riesco a far funzionare tutto e visualizzo quello che mi serve ma dopo circa mezzora si blocca;
LCD bloccato, comunicazione seriale bloccata, controlli sugli ingressi bloccati, timer e tutto il resto....tutto bloccato!

Cosa potrebbe essere?

#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1307.h>
#include <OneWire.h>
#include <Wire.h>
#include <Time.h>
#include <TimeAlarms.h>
#include "U8glib.h"

int intTempPlafo = 45;
int intTempCentr = 35;
int intTempVasca = 25;
int DeltaTempVasca = 1;
int DeltaTempCentr = 5;
int DeltaTempPlafo = 5;
const int Riscaldatore = 22;
const int PompaFiltro = 23;
const int PompaOsmo = 24;
const int Luce = 25;
const int Refrigeratore = 26;
const int LuceNotte = 27;
const int VentolaPlafo = 28;
const int VentolaCentr = 29;
const int Galleggiante = 30;


int rtc[7];
int intMin;
int intOre;
int intsec;
int intGg;
int intMese;
int intAnno;

char ora[9] = "";
char giorno[3];
char anno[5];
char mese[4];

long delayTemp;
long lungDelayTemp = 5;  //  INDICARE IN SECONDI
long sviluppoDelayTemp;

#define ONE_WIRE_BUS 4  // Data wire is plugged into pin 4 on the Arduino

OneWire oneWire(ONE_WIRE_BUS);  
DallasTemperature sensors(&oneWire);  

DeviceAddress TempCentr = { 0x28, 0x36, 0xD2, 0x32, 0x04, 0x00, 0x00, 0x4D };
DeviceAddress TempVasca = { 0x28, 0x5F, 0x04, 0x51, 0x05, 0x00, 0x00, 0x69 };
DeviceAddress TempPlafo = { 0x28, 0xAE, 0x5D, 0x5C, 0x06, 0x00, 0x00, 0x33 };


U8GLIB_ST7920_128X64_4X u8g(18, 16, 17);

void setup(void)
{
  pinMode(Riscaldatore, OUTPUT);
  pinMode(PompaFiltro, OUTPUT);
  pinMode(PompaOsmo, OUTPUT);
  pinMode(Luce, OUTPUT);
  pinMode(Refrigeratore, OUTPUT);
  pinMode(LuceNotte, OUTPUT);
  pinMode(VentolaPlafo, OUTPUT);
  pinMode(VentolaCentr, OUTPUT);
  pinMode(Galleggiante, INPUT);
  sviluppoDelayTemp = lungDelayTemp * 1000;
  delayTemp = sviluppoDelayTemp;
  
  Serial.begin(19200);
  
  sensors.begin();   
  

  sensors.setResolution(TempCentr, 10);
  sensors.setResolution(TempPlafo, 10);
  sensors.setResolution(TempVasca, 10);
  
  digitalWrite(Riscaldatore,HIGH);  
  digitalWrite(PompaFiltro,LOW);  
  digitalWrite(PompaOsmo,HIGH);  
  digitalWrite(Luce,HIGH);  
  digitalWrite(Refrigeratore,HIGH);  
  digitalWrite(LuceNotte,HIGH);  
  digitalWrite(VentolaPlafo,HIGH);  
  digitalWrite(VentolaCentr,HIGH);
  
  
  
  RTC.get(rtc,true);
  Serial.begin(19200);
  if (rtc[6]<2015){
    RTC.stop();
    RTC.set(DS1307_SEC,0);
    RTC.set(DS1307_MIN,00);
    RTC.set(DS1307_HR,11);
    RTC.set(DS1307_DOW,1);
    RTC.set(DS1307_DATE,11);
    RTC.set(DS1307_MTH,10);
    RTC.set(DS1307_YR,15);

    RTC.start();
  }
  RTC.SetOutput(DS1307_SQW32KHZ);
  
  
  intOre = rtc[2];
    intMin = rtc[1];
    intsec = rtc[0];
    intGg = rtc[4];
    intMese = rtc[5];
    intAnno = rtc[6];
    setTime(intOre, intMin, intsec, intMese, intGg, 15);
    
    
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.println(); 
    
    
    Alarm.alarmRepeat(14,00,00, LUCEon); 
    Alarm.alarmRepeat(22,00,00,LUCEoff);
    Alarm.alarmRepeat(13,45,00, NOTTEon);  
    Alarm.alarmRepeat(14,15,00,NOTTEoff);
    Alarm.alarmRepeat(21,45,00, NOTTEon);  
    Alarm.alarmRepeat(22,00,00,NOTTEoff);

}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Errore di lettura...");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
  }
}

void loop(void)
{ 
  Alarm.delay(1);
  
  RTC.get(rtc,true);
  
  u8g.firstPage();  
   
  do {
    Home();
  } while( u8g.nextPage() );
  
  if (millis() >= delayTemp){
    Serial.print("Lettura Temperature...\n\r");
    sensors.requestTemperatures();
    
    Serial.print("Temperatura centralina: ");
    printTemperature(TempCentr);
    Serial.print("\n\r");
    Serial.print("Temperatura plafo: ");
    printTemperature(TempPlafo);
    Serial.print("\n\r");
    Serial.print("Temperatura vasca: ");
    printTemperature(TempVasca);
    Serial.print("\n\r\n\r");
    
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.println();
    delayTemp = millis() + sviluppoDelayTemp;
    
  }
  
  if(sensors.getTempC(TempCentr) >= (intTempCentr + DeltaTempCentr)){
    digitalWrite(VentolaCentr,LOW);
  }
  if(sensors.getTempC(TempCentr) < (intTempCentr - DeltaTempCentr)){
    digitalWrite(VentolaCentr,HIGH);
  }
  
  
  if(sensors.getTempC(TempPlafo) >= (intTempPlafo + DeltaTempPlafo)){
    digitalWrite(VentolaPlafo,LOW);
  }
  if(sensors.getTempC(TempPlafo) < (intTempPlafo - DeltaTempPlafo)){
    digitalWrite(VentolaPlafo,HIGH);
  }
  
  
  if(sensors.getTempC(TempVasca) >= (intTempVasca + DeltaTempVasca)){
    digitalWrite(Refrigeratore,LOW);
    digitalWrite(Riscaldatore,HIGH);
  }
  if(sensors.getTempC(TempVasca) < (intTempVasca - DeltaTempVasca)){
    digitalWrite(Refrigeratore,HIGH);
    digitalWrite(Riscaldatore,LOW);
  }
  if((sensors.getTempC(TempVasca) > (intTempVasca - DeltaTempVasca)) && (sensors.getTempC(TempVasca) < (intTempVasca + DeltaTempVasca))){
    digitalWrite(Refrigeratore,HIGH);
    digitalWrite(Riscaldatore,HIGH);
  }
  if (digitalRead(Galleggiante) == HIGH){
    digitalWrite(PompaOsmo, LOW);
  }
  if (digitalRead(Galleggiante) == LOW){
    digitalWrite(PompaOsmo, HIGH);
  }
  
  
} 


void LUCEon(){
  digitalWrite(Luce, LOW);
  Serial.println("Accensione Luce diurna");
}

void LUCEoff(){
  digitalWrite(Luce, HIGH);
    Serial.println("Spegnimento Luce diurna");
}

void NOTTEon(){
  digitalWrite(LuceNotte, LOW);
    Serial.println("Accensione Luce notturna");
}

void NOTTEoff(){
  digitalWrite(LuceNotte, HIGH);
    Serial.println("Spegnimento Luce notturna");

}
    
void FunMese(){
  RTC.get(rtc, true);
  switch (rtc[5]){

  case 1:
    sprintf(mese,"GEN","0");
    break;
  case 2:
    sprintf(mese,"FEB","0");
    break;
  case 3:
    sprintf(mese,"MAR","0");
    break;
  case 4:
    sprintf(mese,"APR","0");
    break;
  case 5:
    sprintf(mese,"MAG","0");
    break;
  case 6:
    sprintf(mese,"GIU","0");
    break;
  case 7:
    sprintf(mese,"LUG","0");
    break;
  case 8:
    sprintf(mese,"AGO","0");
    break;
  case 9:
    sprintf(mese,"SET","0");
    break;
  case 10:
    sprintf(mese,"OTT","0");
    break;
  case 11:
    sprintf(mese,"NOV","0");
    break;
  case 12:
    sprintf(mese,"DIC","0");
    break;

  }
  //Serial.println(mese);
  //Serial.println(rtc[5]);
}

void Home(){
  
      sprintf(ora,"%02d:%02d:%02d",rtc[2],rtc[1],rtc[0], "0");
      u8g.setFont(u8g_font_profont22);
      u8g.drawStr(3,22, ora);
      u8g.drawLine(0,30,127,30);
      u8g.setFont(u8g_font_helvB12);
      sprintf(giorno, "%02d", rtc[4], "0");
      u8g.drawStr(105,15, giorno);
      FunMese();
      u8g.setFont(u8g_font_7x14);
      u8g.drawStr(104,27, mese);
      u8g.setFont(u8g_font_04b_03);      
      u8g.drawFrame(101,0,27,29);     
      u8g.drawFrame(0,0,100,29); 
}

Ciao,
a vedere cosi potrebbe piantarsi sul loop while

  do {
    Home();
  } while( u8g.nextPage() );

se puoi prova a rimuoverlo per vedere se è quello (oppure a mettere un log seriale per capire se continua a fare ciclo infinito senza uscirne mai).
Una cosa che non mi convince è il controllo sul ritardo in tempo:
if (millis() >= delayTemp) incrementi continuamente la variabile senza nulla che la resetti .. sicuro che non la hai un wraparound? Cosa intendevi fare in quel controllo?

Se tolgo il ciclo do(), il listato continua senza problemi.
Il controllo tramite seriale l'ho provato solo che, come dicevo prima, quando si blocca, su blocca anche la seriale.
Il controllo dei millis() lo uso per effettuare la verifica delle temperature senza usare delay().