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