Electronic – Arduino LCD displays weird character after a while

arduinolcd

I having some issues with an LCD.

I have made a climatic control system that controls some relays (output) and receives some input from water pipe sensor and ambient temperature/humidity.
This was done using 2 PT100 (manually calibrate) and 1 DHT11.

All the data is displayed on a 16×2 LCD that works fine, but after a while (I can't say after a specific event) starts to print weird strings.
When I power off and than on the LCD works fine, this thing suggest me that probably is not a matter of bad soldering of LCD pins.

The system is working and I can see it from serial communication, so seems only a problem of LCD.

ALIMENTATION: The LCD alimentation comes from 5V arduino and which is powered by a 12v power source.
The 5v power source is connected also to a DHT11 and two PT100 in series with 1k resistors so the current absorption should be not much (0,01A for both pt100, plus Dht11).
I didn't connected any condenser in parallel to 5V arduino power source, maybe I should put one.

I will appreciate any suggestion.

Explanation of code:

  • dewpoint function: calculus of dewpoint

  • temp_acqua_mand: calculus of PT100 voltage divisor water to terminals

  • temp_acqua_rito: calculus of PT100 voltage divisor water back from
    terminals

  • trevie: object that controls output 1-5V for a three ways valve

  • AvviamentoImpianto: function that starts freezing or warming machines
    and pumps

  • ArrestoImpianto: power off freezing/warming machines and pumps

Thanks

double dewPoint(double celsius, double humidity)
{
    double A0= 373.15/(273.15 + celsius);
    double SUM = -7.90298 * (A0-1);
    SUM += 5.02808 * log10(A0);
    SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
    SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
    SUM += log10(1013.246);
    double VP = pow(10, SUM-3) * humidity;
    double T = log(VP/0.61078);   // temp var
    return (241.88 * T) / (17.558-T);
}

double temp_acqua_mand(int pinInput)
{
  Serial.print("Temp Mandata PIN ");
  float letturaPin=analogRead(pinInput);
  Serial.println(letturaPin);
  return (float)(-0.2083*(19.06-letturaPin));
}
double temp_acqua_rito(int pinInput)
{
  Serial.print("Temp Ritorno PIN ");
  float letturaPin=analogRead(pinInput);
  Serial.println(letturaPin);
  return (float)(-1.258*(92.7-letturaPin));
}


class val_Trevie
{
  private:
    int pinOut;
    int apertura; //0 = Chiuso(completo ricircolo)
                  //100= Aperto (Nessun ricircolo)
  public:
    val_Trevie(int pin) //COSTRUTTORE
    {
      pinOut=pin;
      }
    //~val_Trevie();     //DISTRUTTORE
    int read()
    {
      return apertura;
      }
    void set(int percentuale) //SET
    {
      apertura=percentuale;
      analogWrite(pinOut,  map(apertura,0,100,50,255)); //OUT 1-5V
      Serial.print("Settaggio Trevie al ");Serial.println(apertura);
    }
    void aumenta()
    {
      if (apertura>=90)
          this->set(100);
      else
          {
            apertura+=10;
            this->set(apertura);
          }
     }
    void diminuisci()
    {
      if (apertura<=30)
          this->set(30);
      else
          {
            apertura-=10;
            this->set(apertura);
          }    
     } 

};


#include <dht11.h>
#include <LiquidCrystal.h>


#define DHTLIB_OK 0
#define DHTLIB_ERROR_CHECKSUM -1
#define DHTLIB_ERROR_TIMEOUT -2

//Assegnazione PIN 0-13

#define RELE_PdC 7
#define RELE_Pompe 8
#define RELE_Pompa_Inverno 9
#define TREVIE 10
#define DHT11PIN A5

#define LCD_RS 12
#define LCD_E 11
#define LCD_D4 6
#define LCD_D5 5
#define LCD_D6 4
#define LCD_D7 2


//Assegnazione PIN A0-A5
#define Temp_Mandata A1
#define Temp_Ritorno A0
#define Chiamata_acqua A2
#define Estate_Inverno A4

//SENSORE DHT11
dht11 DHT11;
//LCD
LiquidCrystal lcd(LCD_RS,LCD_E,LCD_D4,LCD_D5,LCD_D6,LCD_D7);
//TREVIE
val_Trevie trevie(TREVIE);
//DEFINIZIONI COSTANTI
#define ESTATE 1            //SUMMER
#define INVERNO 0           //WINTER
#define SET_POINT 35

//DEFINIZIONE VARIABILI
double inFunzione=0;
boolean stagione;            //SEASON

void AvviamentoImpianto()
{
  trevie.set(50); //Apertura Valvola 3 vie

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Start Circuiti");
  lcd.setCursor(0,1);

  delay(10000);

  boolean stagione=analogRead(Estate_Inverno)>500;

  if (stagione)   //ESTATE
        {digitalWrite(RELE_PdC,HIGH); Serial.println("Avviamento Pompa Circuito Estivo");
        lcd.print("Prim EST");}
  else            //INVERNO
        {digitalWrite(RELE_Pompa_Inverno,HIGH);Serial.println("Avviamento Pompa Circuito Invernale");
        lcd.print("Prim INV");}
  delay(4000);

  digitalWrite(RELE_Pompe,HIGH);Serial.println("Avviamento Pompa Circuito Secondario");
  lcd.print(" Second");

  delay(10000);
  inFunzione++;
  }

void ArrestoImpianto()
{
  digitalWrite(RELE_PdC,LOW); 
  digitalWrite(RELE_Pompa_Inverno,LOW);
  digitalWrite(RELE_Pompe,LOW);
  Serial.println("Spegnimento Impianto"); 
  inFunzione=0;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Spegnimento");
  delay (10000);
  }

void setup()
{
  delay (5000);
  Serial.begin(9600);
  Serial.println("CLIMADUINO START ");
  Serial.println();
  //INIZIALIZZAZIONE USCITE
  pinMode (RELE_PdC,OUTPUT);
  pinMode (RELE_Pompe,OUTPUT);
  pinMode (RELE_Pompa_Inverno,OUTPUT);
  //INIZIALIZZAZIONE ENTRATE
  //INIZIALIZZAZIONE LCD
  lcd.begin(16,2);
  lcd.print("CLIMADUINO");
  //ANALISI STAGIONE ESTATE/INVERNO
  boolean stagione=analogRead(Estate_Inverno)>500;
  lcd.setCursor(0,1);
  if (stagione) 
        lcd.print("ESTATE");
  else 
        lcd.print ("INVERNO");
  delay (5000);
}



void loop()
{
//LETTURA VALORI SENSORI

  float t_mandata= temp_acqua_mand(Temp_Mandata); //TEMPERATURA DI MANDATA

  float t_ritorno= temp_acqua_rito(Temp_Ritorno); //TEMPERATURA DI RITORNO
//  String str_out= String("Temp Mand ")+String(t_mandata,2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Tm "); lcd.print(String(t_mandata,1));
  lcd.print(" Tr "); lcd.print(String(t_ritorno,1));
  lcd.setCursor(0,1);
  lcd.print("Trevie ");lcd.print(trevie.read());


delay(6000);

float t_ambiente,h_ambiente,t_rugiada;

if (DHT11.read(DHT11PIN)==DHTLIB_OK)
    {
    t_ambiente=(float) DHT11.temperature+3;
    h_ambiente=(float) DHT11.humidity;
    Serial.println("Umidita' %"); Serial.println(h_ambiente,DEC);
    t_rugiada=dewPoint(t_ambiente, DHT11.humidity);
    Serial.println("Acquisizione Temperatura e Umidità Ambiente");
    Serial.println(t_ambiente);

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("T Amb "); lcd.print(String(t_ambiente,1));
    lcd.setCursor(0,1);
    lcd.print("H% "); lcd.print(String(h_ambiente,0));lcd.print("  Trug ");lcd.print(String(t_rugiada,0));
    }
  else
  {
    t_rugiada=15.0;  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("T amb ERRORE");
    }



  //CONTROLLO CHIAMATA ACQUA

  boolean chiamata_Acqua = analogRead(Chiamata_acqua)<500;
  Serial.println(analogRead(Chiamata_acqua));
  if (chiamata_Acqua)
      {
        Serial.println("Richiesta acqua");
        if (inFunzione==0) AvviamentoImpianto(); //SE L'IMPIANTO E' SPENTO LO AVVIA
      }
  else {
        if (inFunzione==1) ArrestoImpianto(); //SE L'IMPIANTO E' ACCESO LO SPEGNE
        }

//ALGORITMO DI DECISIONE
      if (inFunzione==1)
      {
      //delta = DIFFERENZA DI TEMPERATURA AL SET POINT
      float delta=0;


            if (stagione==INVERNO) 
              {
                delta=SET_POINT-5-t_mandata;
              }  
            else 
              {
              delta=t_mandata-(t_rugiada+2);
              }

            if (delta < -5)
                {
                  trevie.diminuisci();
                  trevie.diminuisci();
                }  
            else if (delta < 0)
                {
                trevie.diminuisci();
                }
            else if (delta > 5)
                {
                 trevie.aumenta();
                } 
      }
  delay(6000);
}

Best Answer

Try with a capacitor as close as you can to the LCD's power source (pins 0 and 1 if you are using a HD44780 relative, which your code points at)