Sonda di profondità

un saluto a tutti,
dopo un bel po’ di tempo
devo richiedere il vostro aiuto,

mi succede che al progetto di misurazione della quantità di acqua in un serbatoio il cui codice è qui sotto riportato fa egregiamente il suo lavoro… utilizzando la seguente sonda

datasheet sonda: http://www.maxbotix.com/documents/HRXL-MaxSonar-WR_Datasheet.pdf

la misurazione è perfetta.
ma dopo qualche giorno che il programma è in esecuzione si blocca e compaiono caratteri incomprensibili sullo schermo lcd.

Non so assolutamente cosa possa essere.
per comodità posto il codice sotto.
attendo di conoscere eventuali errori nel programma.

saluti

#include <LiquidCrystal.h>

const float lato1=2.950;         //metri 
const float lato2=2.100;         //metri
const float H_serbatoio=1320;    //mm
const float pieno=980;           //mm
const float troppo_pieno=990;    //mm

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// creo un carattere personalizzato:
byte Pallino[8] = {
  0b01110,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b01110
};
//fine carattere personalizzato
void setup() {
  // create a new character
  lcd.createChar(1, Pallino);
  lcd.begin(16, 2);
//Serial.begin(9600);
}
void loop() {
  float H_h2o=0, H_sonda=0;     //numeri a virgola mobile 
  float volume_h2o=0;         
  int H_h2o_cm=0; 
  unsigned long ritardo=60*5;   //ritardo secondi x minuti 
  // read the potentiometer on A0:
  int sensorReading=calcola_misura();
  // map the result to 0 - 5000:
  H_sonda = map(sensorReading, 0, 1023, 0, 5115);
  H_h2o=H_serbatoio-H_sonda; 
  H_h2o_cm=H_h2o/10;
  int stampe = map(H_h2o,0,pieno,0,16);
  volume_h2o = H_h2o*lato1*lato2;   //mancherebbe nella formula (*1000) da mm a metri e (/1000) per avere il risultato in litri
  int volume_lcd=volume_h2o; 
 
 //stampa su lcd
  lcd.setCursor(0, 0);
  lcd.print(F("h= "));
  lcd.print(H_h2o_cm);
  lcd.print(F("cm "));
  lcd.print(volume_lcd);
  lcd.print(F(" l"));
  lcd.setCursor(0, 1);
  for(int i=0;i<stampe;i++)   //stampa i caratteri della barra 
  lcd.write(1);

//Serial.print(sensorReading);
//Serial.print(F(" misura: "));
//Serial.println(H_sonda);

   if (H_h2o<80){
   lcd.setCursor(0, 1);
   lcd.print(F("ricarica h=")); 
   lcd.print(H_h2o);
   for(int i=0;i<10;i++){
   lcd.noDisplay();
   delay (500);
   lcd.display();
   delay (500);
  }
 } 
if (H_h2o>=troppo_pieno){
   lcd.setCursor(0, 1);
   lcd.print(F("Spegni")); 
   for(int i=0;i<10;i++)  {
   lcd.noDisplay();
   delay (500);
   lcd.display();
   delay (500);
      }
   } 
ritardo=ritardo*1000;
delay(ritardo);
lcd.clear();
}
int calcola_misura ()   {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("sto calcolando..."));
  int n;
  unsigned long valore=0;
  unsigned long Somma=0;
  //int prova;
  for(n=0;n<10;n++){
  //prova=analogRead(0);
  //Serial.print(prova);
  //Serial.print("\t");
  valore=analogRead(0);
  Somma=Somma+valore;
  delay(500);
  lcd.setCursor(0, 1);
  lcd.print(n+1);
  lcd.print(F(" di 10")); 
  }
  //Serial.print(somma);
  //Serial.print("\t");
  valore=Somma/10;
  lcd.clear();
  return valore;  
}

— vecchio thread di riferimento … QUESTO - gpb01

ma dopo qualche giorno che il programma è in esecuzione si blocca e compaiono caratteri incomprensibili sullo schermo lcd.

Problemi sull' alimentazione
o qualche disturbo che arriva da un qualcosa nelle vicinanze, ad esempio una pompa.

Ora, visto che si tratta solo di visualizzare dei valori di un sensore e dato che capita di rado, la soluzione più semplice è quella di resettare la scheda con il WatchDog. Sempre che si tratti di un blocco della scheda e non solo un problema di visualizzazione

dopo qualche giorno di prove, comincio a credere che sia un problema di collegamenti tra arduino e lo schermo LCD. Infatti il problema si manifesta durante la fase di aggiornamento dell'LCD.

ho provato a rifare le connessioni, cmq non credo che si un problema del codice.

grazie per la risposta, ho visto il "watchdog" cmq non è semplice da usare (per me).

un saluto

Ma Arduino e l'LCD sono molto distanti tra loro? E l'LCD ha l'interfaccia I2C (che consiglio sempre caldamente!) o usi tutti i pin "normali"? In ogni caso o è difettoso il chip dell'LCD o, più probabilmente è un problema di cablaggio.
Al posto tuo proverei a rifare bene tutta la connessione cambiando magari anche i cavi.