Display HD44780 4x20 spariscono le scritte

Ciao a tutti, ho recentemente realizzato un controller per il mio acquario con arduino uno, un display HD44780 4x20 green, un sensore di temperatura DS18B20 e una pcb con relè 5v autocostruita. Il controller, controlla la temperatura della vasca, accende le luci in base all'orario e accende riscaldatore e ventola in base alla temperatura.
Momentaneamente ho caricato il programma e lo sto testando a vuoto senza pcb a relè collegata e funziona tutto a meraviglia.
Ho però un piccolo problema. durante il funzionamento del programma, a volte spariscono i caratteri dal display e si presenta solamente con la retroilluminazione. Se tolgo l'alimentazione alla scheda arduino e la reinserisco tutto riprende a funzionare e i caratteri vengono visualizzati.
Questo problema succede random cioè: a volte capita dopo 2 ore, a volte dopo 10 e altre dopo anche 20 ore.
Secondo voi a cosa può essere dovuto? Al software o all'hardware?
Preciso che arduino è alimentato solamente con un alimentatore esterno a 5v dedicato.
Potrebbe essere che il programma vada in palla quando attiva le uscite digitali che io ho collegato ma ho lasciato per il momento senza relè e cioè senza carico??
Grazie a tutti quelli che cercheranno di aiutarmi :slight_smile:

Riguardo al problema software, potrebbe aiutarti questa:

Una sfera di cristallo per favore. :wink:

simonfe come pensi che Ti potremmo aiutare se non ci dai ne il circuito ne lo sketch del Tuo progetto?

Dalle informazioni che ho a disposizione non posso valutare se é piú probabile che il problema sia SW o HW.

Ciao Uwe

Ha ragione uwefed, però se come tu dici, alimenti l' arduino con solo 5v, allora sono troppo pochi.
Arduino deve essere alimentato con una tensione da 7 a 12. Questo per varie ragioni... poi dipende anche come alimenti tutto il resto... relè compresi.
Quindi se posti uno schema e maggiori dettagli, anche noi potremo essere più precisi.

Ciao a tutti. Grazie per le risposte. Avete ragione. Senza schema e sketch non è sicuramente possibile aiutarmi.
Purtroppo sono alle prime armi con la programmazione e non so se tutto quello che ho scritto va bene o può creare dei conflitti.
Provo a postarvelo: :cold_sweat:
Per lo schema devo buttarlo giu ma ho collegato tutto diretto ad arduino (nessuna seriale)

#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 2
#define Luce1 10                               
#define Luce2 11                           
#define Risc 12                             
#define Vent 13                                    


const int Luce1oraacc = 13  ;
const int Luce1minutiacc = 30 ;
const int Luce2oraacc = 13  ;
const int Luce2minutiacc = 50 ;
const int Luce1oraspe = 23  ;
const int Luce1minutispe = 50 ;
const int Luce2oraspe = 23  ;
const int Luce2minutispe = 30 ;
const int Temprisc = 26 ;
const int Tempvent = 28 ;

//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperatura;
char buffer[10];
RTC_DS1307 RTC;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte oldSecond =0;                  
byte richiestaTemperatura=0;        
long oldMillis;                   

void setup () {
  sensors.begin();
  Wire.begin();
  RTC.begin();
  lcd.begin(20, 4);
  
digitalWrite( Luce1,LOW );                    
digitalWrite( Luce2,LOW );                     
digitalWrite( Risc,LOW );
digitalWrite( Vent,LOW );



  if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  sensors.setWaitForConversion(false);  

}

void loop () {

  DateTime now = RTC.now();
  if (oldSecond != now.second()) { 
          
      if ((now.hour() >= Luce1oraacc) && (now.minute() >=Luce1minutiacc) || (now.hour() > Luce1oraacc) && (now.minute() < Luce1minutiacc)){
      lcd.setCursor(0, 2); 
      lcd.print F("Luce1:");
      lcd.print F("[");
      lcd.print F("X");
      lcd.print F("]");
      digitalWrite(Luce1, HIGH);}
else
 {
      lcd.setCursor(0, 2); 
      lcd.print F("Luce1:");
      lcd.print F("[");
      lcd.print F(" ");
      lcd.print F("]");
      digitalWrite(Luce1, LOW);}

      if ((now.hour() >= Luce1oraspe) && (now.minute() >=Luce1minutispe) || (now.hour() > Luce1oraspe) && (now.minute() < Luce1minutispe)){
      lcd.setCursor(0, 2); 
      lcd.print F("Luce1:");
      lcd.print F("[");
      lcd.print F(" ");
      lcd.print F("]");
      digitalWrite(Luce1, LOW);}

          
      if ((now.hour() >= Luce2oraacc) && (now.minute() >=Luce2minutiacc) || (now.hour() > Luce2oraacc) && (now.minute() < Luce2minutiacc)){
      lcd.setCursor(0, 3); 
      lcd.print F("Luce2:");
      lcd.print F("[");
      lcd.print F("X");
      lcd.print F("]");
      digitalWrite(Luce2, HIGH);}
else
 {
      lcd.setCursor(0, 3); 
      lcd.print F("Luce2:");
      lcd.print F("[");
      lcd.print F(" ");
      lcd.print F("]");
      digitalWrite(Luce2, LOW);}

      if ((now.hour() >= Luce2oraspe) && (now.minute() >=Luce2minutispe) || (now.hour() > Luce2oraspe) && (now.minute() < Luce2minutispe)){
      lcd.setCursor(0, 3); 
      lcd.print F("Luce2:");
      lcd.print F("[");
      lcd.print F(" ");
      lcd.print F("]");
      digitalWrite(Luce2, LOW);}
      
if (sensors.getTempCByIndex(0)<=Temprisc){
       lcd.setCursor(11, 2); 
      lcd.print F("Risc.:");
      lcd.print F("[");
      lcd.print F("X");
      lcd.print F("]");
  digitalWrite(Risc, HIGH);}
 else {
        lcd.setCursor(11, 2); 
      lcd.print F("Risc.:");
      lcd.print F("[");
      lcd.print F(" ");
      lcd.print F("]");
  digitalWrite(Risc, LOW);
}

if (sensors.getTempCByIndex(0)>=Tempvent){
       lcd.setCursor(11, 3); 
      lcd.print F("Vent.:");
      lcd.print F("[");
      lcd.print F("X");
      lcd.print F("]");
  digitalWrite(Vent, HIGH);}
 else {
        lcd.setCursor(11, 3); 
      lcd.print F("Vent.:");
      lcd.print F("[");
      lcd.print F(" ");
      lcd.print F("]");
  digitalWrite(Vent, LOW);
}

    if (richiestaTemperatura == 0) {
      sensors.requestTemperatures();
      richiestaTemperatura = 1;   
      oldMillis = millis();
    }
  }  

  long ciccio = millis();
  if (richiestaTemperatura == 1) 
  {
    if (ciccio-oldMillis > 750) {
      {
        richiestaTemperatura = 0;
        lcd.setCursor(0, 1); 
        lcd.print F("Temp. H2o:  ");
        lcd.print (sensors.getTempCByIndex(0));
        lcd.write (0b11011111);
        lcd.print F("C");
      }

  

    //stampa data ed ora
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0, 0);
    lcd.print( buffer );
    char buffer[10] = "";
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(12, 0);
    lcd.print( buffer );


    }
      }

    }

edit by mod: per favore includi il codice negli appositi tag, grazie

Devi trasformare tutti i print da così:

 lcd.print F("Luce1:");

a così

 lcd.print(F("Luce1:"));

Hai dimenticato una coppia le parentesi.

Scusatemi per non aver incluso il codice negli appositi tag. Sto imparando.
Grazie infinite a tutti per gli aiuti.
Grazie anche a te PaoloP. Cambierò le stringhe come da te suggerito.
Per voi il resto del codice è accettabile o esiste una maniera per renderlo più leggero? :blush:

Ciao a tutti, sono di nuovo qui a rompre.
Ho corretto il codice come suggerito da PaoloP ma purtroppo niente.
il sistema non è stabile. dopo un ora che avevo caricato lo sketch è sparito tutto dal display.
E rimasta solo la retroilluminazione.

simonfe:
Ciao a tutti, sono di nuovo qui a rompre.
Ho corretto il codice come suggerito da PaoloP ma purtroppo niente.
il sistema non è stabile. dopo un ora che avevo caricato lo sketch è sparito tutto dal display.
E rimasta solo la retroilluminazione.

Fai un po’ di debug sulla seriale. Metti cioè dei Serial.print e spedisci un po’ di messaggi al PC per vedere se il codice continua a girare regolarmente oppure se si pianta tutto l’Arduino.