Strano freeze del loop

finalmente ho due minuti per scrivere ...

// librerie usate nel progetto
#include "Wire.h"             
#include "SRF02.h"
#include "Ethernet.h"
#include "SPI.h"             
#define DEBUG 0
// costanti che contengono il mac e l'IP della scheda di rete
//byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x50, 0x18 }; //ethernet shield mia
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0C, 0x00, 0x6D }; //ethernet shield mia 2
byte ip[] = { 192,168,1,50 };

// inizializzazione componente SRF con l'indirizzo 0x70
SRF02 sensor(0x70, SRF02_CENTIMETERS);
float larghezza_cisterna = 2;
float lunghezza_cisterna = 2;
float altezza_cisterna = 1.3;
float livello_acqua = 0;
float delta_sensore_galleggiante = 13;
const float capienza_metricubi = larghezza_cisterna * lunghezza_cisterna * altezza_cisterna;
const float capienza_litri = capienza_metricubi * 1000;
float disponibilita_metricubi = 0;
float disponibilita_litri = 0;
float livello_attenzione = 2000;
float livello_allerta = 1200;
float livello_allarme = 700;
bool attenzione = false;
bool allerta = false;
bool allarme = false;
String colore = "white";
unsigned long nextPrint = 0;
byte SD_CS = 4;  // pin 4 is the SPI select pin for the SDcard
byte ETHER_CS = 10; // pin 10 is the SPI select pin for the Ethernet

int led = 12;

//creo una variabile char per memorizzare i byte letti dal client
char Data_RX;
String msg = "";
int cmd = 0;
int real_level = 0;
int thelevel = 0;
String thelevel_txt;
float thelevel_flt;
//creo un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);

void ToSerial(String stringa)
{
  #if DEBUG
  Serial.println(stringa);
  #endif
}

void ToSerial(float stringa)
{
  #if DEBUG
  Serial.println(stringa);
  #endif
}

 
void setup()
{
  pinMode(ETHER_CS, OUTPUT);      
  digitalWrite(ETHER_CS, HIGH);
  pinMode(SD_CS, OUTPUT);      
  digitalWrite(SD_CS, HIGH); 
  
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);
  #if DEBUG
  Serial.begin(9600);
  #endif
  Wire.begin();
  sensor.setInterval(500);
  //inizializza lo shield con il mac e l'ip
  ToSerial("Ethernet initialization ...");
  Ethernet.begin(mac, ip);
  msg = "1234567890123456789012345678901234567890123456789012345678901234567890";
  String secs_txt;
  for(int i = 1; i < 6; i++){
    secs_txt = String(30 - i * 5);
	ToSerial("Ethernet ready in " + secs_txt + " sec.");
    digitalWrite(led, HIGH);
    delay(100);
    digitalWrite(led, LOW);
    delay(4900);
  };
  ToSerial("Ethernet ready");
  //inizializza l'oggetto server
  ArduinoServer.begin();
  ToSerial("Webserver ready");
  sensor.update();
  ToSerial("SRF ready");

  // stato di fine setup e inizio loop 
  for(int j = 0; j < 5; j++){
    digitalWrite(led, HIGH);
    delay(250);            
    digitalWrite(led, LOW);
	delay(250);
  }; 
}

//String toWeb(lastringa

void loop()
{
//  SRF02::update();

  //IMPORTANTE pulisco la variabile msg
  msg = "";
  //Ascolto le richieste dei client controllo se ci sono dati da leggere
  //e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
  EthernetClient pc_client = ArduinoServer.available();
  //controllo se pc_client è diverso da false
  if (pc_client != false)
  {
    digitalWrite(led, HIGH);
    //controllo se il client è connesso
    while (pc_client.connected())
    {
      //leggo i byte disponibili
      //provenienti dal client
      Data_RX = pc_client.read();
      //invio i dati letti al Serial Monitor
      ToSerial(Data_RX);
//	  Serial.write(Data_RX);
      //Attendo che tutti i byte siano letti
      //quando Data_RX contiene il carattere
      //di nuova line capisco tutti i byte sono
      //stati letti
      msg += Data_RX;
      if (Data_RX == '\n')
      {
        ToSerial("richiesta http completata");
        //Invio la risposta al client
        //invio lo status code
        pc_client.println(F("HTTP/1.1 200 OK"));
        //imposto il data type
        pc_client.println(F("Content-Type: text/html"));
        pc_client.println(F("\n"));
        //invio codice html
        pc_client.println(F("<html>"));
        pc_client.println(F("<head>"));
        pc_client.println(F("<title>Water level</title>"));
        pc_client.println(F("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10\">"));
        pc_client.println(F("<META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">"));
        pc_client.println(F("</head>"));
        pc_client.println(F("<body bgcolor=\"black\" text=\"white\" link=\"lime\" vlink=\"lime\">"));
        pc_client.println(F("<div align=\"center\" style=\"font-family:tahoma,verdana,arial;font-size:18px;font-style:italic\">"));
        // chiedo il valore all'SRF
        ToSerial("before sensor.update");
        sensor.update();
        ToSerial("after sensor.update");
        if (millis() > nextPrint)
        {
          ToSerial("before sensor.read");
          real_level = sensor.read();
          thelevel = real_level;
          thelevel = thelevel - delta_sensore_galleggiante; 
          thelevel_txt =  String(thelevel, DEC);
          thelevel_flt = (float) thelevel / 100;
          livello_acqua = altezza_cisterna - thelevel_flt;
          disponibilita_metricubi = livello_acqua  * lunghezza_cisterna * larghezza_cisterna;
          disponibilita_litri = disponibilita_metricubi * 1000;
          ToSerial("disponibilita = ");
          ToSerial(disponibilita_litri);
          colore = "white";
          if (disponibilita_litri <= livello_attenzione) {
            attenzione = true;
            colore = "yellow";
            ToSerial("stato attenzione");
          };     
          if (disponibilita_litri <= livello_allerta) {
            attenzione = false;
            allerta = true;
            colore = "orange";
            ToSerial("stato allerta");
          };     
          if (disponibilita_litri <= livello_allarme) {
            attenzione = false;
            allerta = false;
            allarme = true;
            colore = "red";
            ToSerial("stato allarme");
          };     
          ToSerial("stato attenzione");
          ToSerial("after sensor.read");
          ToSerial("livello = " + thelevel_txt);
          nextPrint = millis () + 1000;
        };
        pc_client.print(F("valore al sensore "));
        pc_client.print(real_level);
        pc_client.println(F("
"));
        pc_client.println(F("valore per i calcoli "));
        pc_client.println(thelevel_flt);
        pc_client.println(F("</div>




"));
        pc_client.println(F("<div align=\"center\" style=\"font-family:tahoma,verdana,arial;font-size:72px\">"));
        pc_client.println(disponibilita_metricubi);
        pc_client.println(F("m<sup>3</sup> di "));
        pc_client.println(capienza_metricubi);
        pc_client.println(F("m<sup>3</sup>"));

        pc_client.println(F("</div>"));
        pc_client.println("<div align=\"center\" style=\"color:" + colore + ";font-family:tahoma,verdana,arial;font-size:72px\">");
        pc_client.println(disponibilita_litri);
        pc_client.println(F(" di "));
        pc_client.println(capienza_litri);
        pc_client.println(F("litri"));
        pc_client.println(F("</div>"));
        pc_client.println(F("</body>"));
        pc_client.println(F("</html>"));
        //aspetto 10 ms affinche la risposta giunga al browser del client
        delay(10);
        //esco dal ciclo while una volta completato l'invio della risposta
        break;
      }
      //chiudo la connessione
    }
	pc_client.flush();
    pc_client.stop();
    pc_client = false;
    msg = "";
	delay(7500);
    digitalWrite(led, LOW);
  } else {
    digitalWrite(led, HIGH);
    delay(80);            
    digitalWrite(led, LOW);
    delay(2000);
  };
}

ecco il codice montato sulla mia leonardo, ma dopo circa 12/15 ore di funzionamento si blocca.
Potrebbe essere guasta? La shield ethernet l'ho già cambiata.

Ho anche una mega 2560, provo con quella?

Ciao e grazie a tutti