La pantalla LCD de Arduino muestra un carácter extraño después de un tiempo

1

Tengo algunos problemas con un LCD.

He fabricado un sistema de control climático que controla algunos relés (salida) y recibe información del sensor de la tubería de agua y de la temperatura / humedad ambiente. Esto se hizo usando 2 PT100 (calibrar manualmente) y 1 DHT11.

Todos los datos se muestran en una pantalla LCD de 16x2 que funciona bien, pero después de un tiempo (no puedo decir después de un evento específico) comienza a imprimir cadenas extrañas. Cuando apago y luego la pantalla LCD funciona bien, esto me sugiere que probablemente no se trata de una mala soldadura de los pines LCD.

El sistema está funcionando y puedo verlo desde la comunicación en serie, por lo que parece ser solo un problema de LCD.

ALIMENTACIÓN: La alimentación de LCD proviene de 5V arduino y está alimentada por una fuente de alimentación de 12v. La fuente de alimentación de 5 V también está conectada a un DHT11 y dos PT100 en serie con resistencias de 1k, por lo que la absorción de corriente no debería ser mucha (0,01A para ambos pt100, más Dht11). No conecté ningún condensador en paralelo a una fuente de alimentación de arduino de 5 V, tal vez debería poner uno.

Apreciaré cualquier sugerencia.

Explicación del código:

  • función de punto de rocío: cálculo del punto de rocío

  • temp_acqua_mand: cálculo del divisor de voltaje PT100 del agua a los terminales

  • temp_acqua_rito: cálculo del agua del divisor de voltaje PT100 desde terminales

  • trevie: objeto que controla la salida 1-5V para una válvula de tres vías

  • AvviamentoImpianto: función que comienza a congelar o calentar máquinas y bombas

  • ArrestoImpianto: apague las máquinas y bombas de congelación / calentamiento

Gracias

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);
}
    
pregunta piertoni

1 respuesta

3

Pruebe con un condensador lo más cerca posible de la fuente de alimentación de la pantalla LCD (pines 0 y 1 si está usando un pariente HD44780, que su código señala)

    
respondido por el Rodrigo Lopez

Lea otras preguntas en las etiquetas