Hola de nuevo.
Por fin el trabajo me deja unos días, y he vuelto a ponerme con la programación del arduino.
Ya casi tengo todo listo y funcionando, sólo me queda reordenar el código y pelearme con la pantalla LCD para que haga lo que quiero.
Tengo un LCD de 20x4 conectado mediante I2C en la dirección 0x38.
En el proceso normal del código tengo 5 estados de avería que quisiera se reflejaran en el LCD a medida que se van produciendo y sistemáticamente,que vayan desapareciendo cuando se van resolviendo.
En caso de no tener ningún estado de avería, que la pantalla ponga un mensaje de espera.
El problema es que hago todo por separado, pero en el momento que provoco dos estados de avería distitntos, al reflejarlo en el LCD, uno borra a el otro y así sistematícamente con los 5, de forma que nunca veo el total de los estados al completo.
siempre empiezo por "lcd.clear();" y lógicamente borra todo el LCD, pero no se como hacer para pasar del estado del LCD en espera a una avería sin borrar el LCD, ya que si no lo hago, este no es legible. Se pisan los caracteres
Cuando los borro me pasa lo mismo.
Borro un estado de avería y este me borra los otros estados que había provocado antes.
Os paso el código.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x38, 20, 4); // Direccion del LCD a 0x20 o 0x38 depende del fabricante
//Definimos variables
int cerrojo=0; // Contador para los SMS del deposito
int contador_1=0; // Contador para los SMS Averia 1
int contador_2=0; //Contador para los SMS Averia 2
int reset_Averia=A2;
int Led_1=3;
int Led_2=4;
int Led_3=5;
int Lleno=8;
int Nivel_Medio=7;
int Nivel_Bajo=6;
int Averia_1=10;
int Averia_2=11;
/* -------------------------------------------------
CICLO DE INICIO
------------------------------------------------*/
void setup()
{
Serial.begin(19200); //Velocidad de transmisión puertos RX-0 y TX-1
/* ------------------------------------------------------------------------
Definimos las entradas y salidas de las variables Digitales
----------------------------------------------------------------------*/
pinMode(Nivel_Bajo,INPUT); //Segundo Nivel Aviso ALARMA Nivel
pinMode(Nivel_Medio,INPUT); // Primer Nivel de aviso de ALARMA Nivel
pinMode(Lleno,INPUT);
pinMode(reset_Averia,INPUT); // Reset para los contadores de Averia
pinMode(Led_1,OUTPUT); //
pinMode(Led_2,OUTPUT);
pinMode(Led_3,OUTPUT);
pinMode(Averia_1,INPUT); //Entrada alarma Averia 1
pinMode(Averia_2,INPUT); //Entrada alarma Averia 2
/* ----inicializamos los contadores a cero-----*/
cerrojo=0;
contador_1=0;
contador_2=0;
lcd.init(); // inicializamos el LCD
lcd.clear(); //Borramos el LCD
lcd.backlight(); //Enciende la luz del LCD
}
/*----------------------------------------------
EMPEZAMOS EL LOOP
------------------------------------------------- */
void loop()
{
/*----------------------------------------------
PRIMERA ALARMA NIVEL
------------------------------------------------- */
if((digitalRead(Nivel_Medio)==HIGH&&((cerrojo)==(0))))
{
delay(100);
cerrojo=1;
delay(100);
digitalWrite(Led_1,HIGH);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("NIVEL:");
lcd.setCursor(10,1);
lcd.print("ALARMA 1");
delay(100);
}
/*----------------------------------------------
SEGUNDA ALARMA NIVEL
------------------------------------------------- */
if((digitalRead(Nivel_Bajo)==HIGH&&((cerrojo)==(1))))
{
delay(100);
cerrojo=2;
delay(100);
digitalWrite(Led_2,HIGH);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("NIVEL:");
lcd.setCursor(10,1);
lcd.print("ALARMA 2");
delay(100);
}
/*----------------------------------------------
NIVEL LLENO
------------------------------------------------- */
if (digitalRead(Lleno)==HIGH)
{
cerrojo=0;
digitalWrite(Led_1,LOW);
digitalWrite(Led_2,LOW);
lcd.setCursor(1,1);
lcd.print(" ");
delay(100);
}
/*----------------------------------------------
ALARMA AVERIA 1
------------------------------------------------- */
if ((digitalRead(Averia_1)==HIGH&&((contador_1)==(0))))
{
delay(100);
contador_1=1;
digitalWrite(Led_3,HIGH);
lcd.clear();
lcd.setCursor(0,2);
lcd.print("AVERIA 1 BLOQUEADO");
delay(100);
}
/*----------------------------------------------
ALARMA AVERIA 2
------------------------------------------------- */
if ((digitalRead(Averia_2)==HIGH&&((contador_2)==(0))))
{
delay(100);
contador_2=1;
digitalWrite(Led_3,HIGH);
lcd.clear();
lcd.setCursor(0,3);
lcd.print("AVERIA 2 BLOQUEADO");
delay(100);
}
/*----------------------------------------------
RESET CONTADOR AVERIAS
------------------------------------------------- */
if (digitalRead(reset_Averia)==HIGH)
{
delay(100);
contador_1=0;
contador_2=0;
digitalWrite(Led_3,LOW);
delay(100);
lcd.clear(); //Borramos el LCD
lcd.setCursor(1,1);
lcd.print("OK CONTADORES=0");
delay(3000); //Esperamos 3 segundos para ver el mensaje
}
/*----------------------------------------------
ESTADO INICIAL LCD
------------------------------------------------- */
if (((cerrojo)==(0))&&((contador_1)==(0))&&((contador_2)==(0)))
{
lcd.clear(); //Borramos el LCD
lcd.setCursor(2,0);
lcd.print("PANTALLA INICIO");
lcd.setCursor(2,2);
lcd.print("CENTRAL CONTROL");
lcd.setCursor(8,3);
lcd.print ("GSM");
delay(1000);
}
Se que tiene que existir una forma de gestionar esto sin ser llenando el código con If.
Llevo dos días pensando en ello y no caigo con la solución.
Gracias por vuestra ayuda