spariscono cifre su display

ciao a tutti..sto facendo un software per una parabola motorizzata..il software funziona benissimo se non per il display..ogni tanto quando decide lui(come 30 secondi o 5 minuti) le scritte sul display spariscono,tutti i comandi funzionano però non compare niente sul display..spegnendo e riaccendendo oppure premendo il tasto "salva" (che ho impostato un soft reset) sul display compare tutto di nuovo...sapete darmi una delucidazione???
grazie e questo è il codice

// diplay 4x20 con rimappattura potenziometri fine corsa e velocità ridotta



#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS)   // soft reset sistema
#define inCom A0      // pin in pulsanti
#define inPotElev A1  // pin in potenziometro elevazione
#define inPotRot A2   // pin in potenziometro rotazione
#define inMot 13       // pin motore acceso
#define motDa 9      // pin motore orientamento 1
#define motDb 10      // pin motore orientamento 2
#define motEa 11      // pin motore elevazione 1
#define motEb 12      // pin motore elevazione 2


LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //inizializza libreria display
int dirIn = 0; // lettura bussola in gradi
float compass = 0; // valore orientamento (cmps03)
int manButton;     //ingresso comandi manuali
int elevazione;    //ingresso tensione elevazione
int rotazione;     //ingresso tensione rotazione
const byte velRid = 100;     // velocità ridotta motore elevazione
const byte velRotRid = 200;   // velocità ridotta motore rotazione
int dirHB = EEPROM.read(0); // legge direzione HotBird
int elevHB = EEPROM.read(1); // legge elevazione HotBird
byte oldState = LOW;     //imposta stato bistabile
byte dirLock = 0;        // direzione ok
byte elevLock = 0;       // elevazione ok




void setup() {
lcd.begin(20, 4);
pinMode(inPotRot, INPUT);  // ingresso potenziometro rotazione
pinMode(inPotElev, INPUT); // ingresso potenziometro elevazione
pinMode(inCom, INPUT); //ingresso tastiera
pinMode(8, INPUT); // ingresso bussola
pinMode(motEa, OUTPUT); //motore elevazione
pinMode(motEb, OUTPUT);
pinMode(motDa, OUTPUT); //motore orientamento
pinMode(motDb, OUTPUT);

ferma();                      // ferma i motori

// accensione
lcd.setCursor(2,0);
lcd.print("**** HOTBIRD ***");  
lcd.setCursor(1,1);               // mostra direzione impostata
lcd.print("direzione:");
lcd.print(dirHB, DEC);
lcd.setCursor(1,2);
lcd.print("elevazione:");         // mostra elevazione impostata
lcd.print(elevHB, DEC);
lcd.print(" ");
lcd.print(" ");
delay(5000);                      // attesa 5 secondi
lcd.clear();   



}

void loop() {
 int dirHB = EEPROM.read(0); // legge direzione dalla cella 0
 int elevHB = EEPROM.read(1);// legge elevazione dalla cella 1
 compass = pulseIn(8, HIGH); // lettura bussola
 dirIn = (compass/1000-1)*10.15; //trasforma in gradi
 manButton = analogRead(inCom);   // valori comandi manuali immessi su A0
 elevazione = map(analogRead(inPotElev),402,600,0,180);  // valori elevazione immessi su A1
 rotazione = map(analogRead(inPotRot),400,486,0,360);  // valori rotazione immessi su A2
//////  BISTABILE MAN/AUTO///////
if (manButton > 50 && manButton < 150){   // 100 manuale/auto
     if (oldState == LOW) {
      oldState = HIGH;             // attiva comandi automatici
      lcd.setCursor(5,3);
      lcd.print("AUTOMATICO");
      elevLock = 0;
      dirLock = 0;
     }else{
      oldState = LOW;              // attiva comandi manuali
      lcd.setCursor(0,3);
      lcd.print("               ");
      }
     delay(500);             // pausa 1/2 secondo
}
if (oldState == LOW){                                 // COMANDI MANUALI
  if (manButton < 50) ferma();                        // arresta motori
  if (manButton > 180 && manButton < 220) salva();    // 200 salva valori
  if (manButton > 280 && manButton < 320) abbassa();      // 300 abassa antenna
  if (manButton > 380 && manButton < 420) alza();        // 400 alza antenna
  if (manButton > 480 && manButton < 520) antiorario();   // 500 rotazione antioraria
  if (manButton > 580 && manButton < 620) orario();       // 600 rotazione oraria
  }else{orienta();}
 
  if (digitalRead(inMot) == HIGH) chiude();       // chiude a motore acceso

{
lcd.setCursor(0,0);        // prima riga
lcd.print("Bussola ");
lcd.print(dirIn, DEC);
lcd.print(" ");
lcd.setCursor(14,0);        // prima riga
lcd.print("gradi ");
lcd.setCursor(0,1);        // seconda riga
lcd.print("Elevazione ");
lcd.print(elevazione, DEC);
lcd.print(" ");
lcd.setCursor(0,2);        // terza riga
lcd.print("Rotazione ");
lcd.print(rotazione, DEC);
lcd.print(" ");
   }
}

//**********   FUNZIONI MOTORI   **********/
void alza(){
  digitalWrite(motEb, HIGH);
  if (elevazione > 130){
    digitalWrite(motEa, HIGH);
  }else{
        if (elevazione > 90){
          analogWrite(motEa, velRid);
         }else{
  analogWrite(motEa, LOW);
  digitalWrite(motDa, HIGH); 
  digitalWrite(motDb, HIGH);
         }
     }   
  
}
//****************************
void abbassa(){
  digitalWrite(motEa, HIGH);
  if (elevazione < 1){
    digitalWrite(motEb, HIGH);
    }else{
     
  digitalWrite(motEb, LOW);
  digitalWrite(motDa, HIGH); 
  digitalWrite(motDb, HIGH);
    
  }
}  

//****************************
void orario(){
  digitalWrite(motDb, HIGH);
  if (rotazione > 360){
    digitalWrite(motDa, HIGH);
    }else{
      if (dirIn > 130 && dirIn < 190){
      analogWrite(motDa, velRotRid);
    }else{
  digitalWrite(motDa, LOW);
  digitalWrite(motEb, HIGH);        
  digitalWrite(motEa, HIGH);
     }
  }
}  
//****************************
void antiorario(){
  digitalWrite(motDa, HIGH);
  if (rotazione < 1){
    digitalWrite(motDb, HIGH);
    }else{
      if (dirIn > 130 && dirIn < 190){
      analogWrite(motDb, velRotRid);
    }else{
  digitalWrite(motDb, LOW);
  digitalWrite(motEb, HIGH);        
  digitalWrite(motEa, HIGH);
    } 
  }
}  
//****************************
void ferma(){
  digitalWrite(motDa, HIGH); 
  digitalWrite(motDb, HIGH);
  digitalWrite(motEb, HIGH);        
  digitalWrite(motEa, HIGH);
}
//****************************
void salva(){         // salva valori in eprom
EEPROM.write(0, dirIn);
EEPROM.write(1, elevazione);
delay(500);
lcd.setCursor(1,3);
lcd.print("POSIZIONE SALVATA");
delay(3000);
Reset_AVR();
}
//****************************
void chiude(){                   // chiude antenna motore acceso


  
}
//***************************
void orienta(){                                                 // funzione automatico
     if (elevazione < elevHB) alza();                           // alza antenna
     if (elevazione > elevHB) abbassa();                        // abbassa antenna
     if (elevazione == elevHB){
        digitalWrite(motEb, HIGH);                              // ferma motori
        digitalWrite(motEa, HIGH);
        elevLock = 1;                                           // elevazione ok
     }
     if (elevazione == elevHB){
         orario();
         if (dirIn == dirHB - 1){
         digitalWrite(motDa, HIGH); 
         digitalWrite(motDb, HIGH);
         dirLock = 1;                                            // direzione ok
      }
      if ((elevLock == 1) && (dirLock == 1)){
        ferma();
        oldState = LOW;
        lcd.setCursor(0,3);
        lcd.print("                ");
        
      }
     }
     

  
}

Ciao,
essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

Potrebbe essere un disturbo causato dai motori.

Per verificare l'ipotesi, prova a staccare l'alimentazione dei motori e fai girare il programma.

Se il display non si blocca più, hai trovato il problema.

problema trovato..non erano i motori ma l'alimentazione,collegandolo con una batteria funziona perfettamente,anche solo una misurazione con il tester della tensione i caratteri sparivano..ora farò un filtraggio con dei condensatori da 100nf e poi vediamo come va..grazie lo stesso