1
\$\begingroup\$

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 16x2 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);
}
\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

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)

\$\endgroup\$
3
  • \$\begingroup\$ This is always good advice for decoupling capacitors - and it is seldom a cost saving to omit them \$\endgroup\$
    – Andrew
    Nov 5, 2012 at 12:48
  • \$\begingroup\$ Is the purpose of the capacitor to stabilize the 5v power source to avoid peaks? Or the purpose is to avoid noise? Just to be sure, the capacitor should be connected one side to the pin and the other to ground? What capacity could be a good choice? Thanks \$\endgroup\$
    – piertoni
    Nov 5, 2012 at 13:34
  • \$\begingroup\$ @piertoni, the main idea is to stabilize the power source, but it'll help with noise too. When a digital device switches bits it requires very small but very quick rushes of current. A local capacitor (usually called de-coupling capacitor) helps provide those rushes very quickly. Place it between positive and ground. Typical values start around 0.1uF, but larger values won't hurt :) \$\endgroup\$ Nov 7, 2012 at 13:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.