Manejar teclado, LCD, sensor LM35, y reles con arduino MEGA.

Hola, hace un tiempito que vengo con esto y no encuentro soluciones a mis problemas.

Con esos materiales quiero hacer un termometro de ambientes automatico.

-Con el teclado le ingreso valores numericos max y min como rangos de temperatura a respetar.
-Con el LCD muestro 5 pantallas a mostrarse segun se controle con el teclado (teclas A, B, C y D).
-Con el sensor LM35 mido todo el tiempo la temperatura y la muestro en el LCD variando esta cada 500ms.
-Y con esa temperatura ambiente y los rangos max y min controlar unos reles segun se alcanzen.

Mi proyecto lo pense a funcionar asi:

1-Se enciende todo el proyecto y se muestra en LCD pantalla de "BIENVENIDA..." por 10seg.
2-Luego aparece 2° pantalla "SIN VALORES LIMITES", que señala que no existen los rangos max y min a respetar. En esa misma pantalla mostrar la temperatura ambiente actual, variando cada 500ms. La pantalla queda fija hasta accionar el teclado.
3-Al pulsar del teclado tecla A, mostrar nueva pantalla "NUEVO VALOR MAX...", teclear valor numerico, mostrarlo tambien y con tecla D ingresarlo, guardarlo en una variable y luego mostrarlo en otra pantalla "EN FUNCIONAMIENTO..." junto al valor min y la temperatura ambiente actual.
4-Al pulsar del teclado tecla B, mostrar nueva pantalla "NUEVO VALOR MIN...", teclear valor numerico, mostrarlo tambien y con tecla D ingresarlo, guardarlo en una variable y luego mostrarlo en otra pantalla "EN FUNCIONAMIENTO..." junto al valor max y la temperatura ambiente actual.
5-Con la tecla C poder borrar los numeros equivocados al marcar los rangos max y min. (2 espacios del LCD por solo ser unidad y decena).
6-Una vez hecho los 5 pasos, si la temperatura ambiente llega a un valor max accionar un rele y si se llega a un valor min accionar el otro rele.

Todo esto acompañado de transistores NPN para los reles y para el backlight del LCD, LEDS de valor max, valor min y funcionamiento normal, y tambien un buzzer a sonar en encendido y tecleo de teclado.

Mis problemas de funcionamiento son:
-Cuando paso de pantalla "SIN VALORES LIMITES..." a pantalla de "NUEVO VALOR MAX O MIN..." se mezclan las 2 pantallas, pareciendo una pavada pero que no puedo resolver.
-Al pulsar los numeros no me aparecen los que presiono si no otros que no se de donde salen si hice bien la conversion ASCII a numeros.
-Al ingresar el valor min por ejemplo y darle enter con tecla D el valor me aparece en el lugar del valor max en la pantalla "EN FUNCIONAMIENTO...".
-Al borrar los numeros equivocados en pantallas de valor max y min con la tecla C, se me borran los mismos espacios en la pantalla "EN FUNCIONAMIENTO...".
-Y por ultimo no se logran accionar los reles a traves de la activacion de los transistores NPN que andan bien. Al igual que todos los demas componentes porque los probe a todos y ademas hasta llegar a este paso habia experimentado el funcionamiento de cada componente.

Tengo fe que con algun problema me van a ayudar, asi que les doy las gracias por adelantado. Espero haber sido claro.

Les dejo para descargar el codigo porque era un poco largo y necesitaba explicar mucho por aca, pido disculpas. Pero lo coloco en una respuesta tambien.

TECLADO_LCD_SENSOR_POTENCIA_Y_TESTIGOS.ino (11.7 KB)

Primero les dejo hasta el VOID SETUP

#include <Keypad.h>          //libreria para controlar el teclado matricial
#include <LiquidCrystal.h>   //libreria para controlar el LCD

//Configuración del teclado matricial

const byte filas = 4;                            // numero de filas a usar
const byte columnas = 4;                          // numero de columnas a usar
byte pinsFilas[filas] = {22, 23, 24, 25};          // orden de conexion de filas: Fila 1, Fila 2, Fila 3 y Fila 4
byte pinsColumnas[columnas] = {26, 27, 28, 29};    // orden de conexion de columnas: Columna 1, Columna 2, Columna 3 y Columna 4

char teclas[filas][columnas] = {  //matriz teclas para definir orden de caracteres tal cual en el teclado
  {'7', '8', '9', 'A'},
  {'4', '5', '6', 'B'},
  {'1', '2', '3', 'C'},
  {'0', 'F', 'E', 'D'},
};
Keypad keypad = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);  //se mapean teclas


// Configuración para el LCD

// Puertos LCD -> RS  E   D4  D5  D6  D7
LiquidCrystal lcd(32, 33, 34, 35, 36, 37);

const int sensor = 0; // entrada del sensor LM35
const int backlight = 38;   // pin digital LED del LCD
const int ledAzul = 42;     // pin digital LED azul
const int ledVerde = 43;    // pin digital LED verde
const int ledRojo = 44;     // pin digital LED rojo
const int buzzer = 45;      // pin digital buzzer
const int transistor1 = 52; // pin digital transistor 1
const int transistor2 = 53; // pin digital transistor 2


char numero;             //variable "char numero" de tipo caracteres
int  valorA;             //variables para mostrar numeros en LCD
int  valorB;

int contador;            //variables "contador" para separar procesos
int contador2 = 0;
int contador3;

int decenaA;     //variables "decena" para definir decenas
int decenaB;
int unidadA;     //variables "unidad" para definir unidades
int unidadB;

int cicloA;      //variables "ciclo" que comienzan procesos
int cicloB;


float centigrados()                    //se calcula como variable decimal "coma flotante"
{
  int sensor;                          //de acuerdo a la variable del sensor
  float celsius;                        //se crea una variable resultado decimal
  sensor = analogRead(A0);              //se lee el estado de la entrada analogica A0 donde esta el sensor
  celsius = (500.0 * sensor) / 1023;    //se realiza el calculo
  return (celsius);                    //se devuelve el resultado a la variable decimal "celsius"
}


void setup() {                  //se definen como salidas las conexiones a pines digitales
  pinMode(backlight, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRojo, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(transistor1, OUTPUT);
  pinMode(transistor2, OUTPUT);

  delay(500);                        //pausa antes del encendido
  digitalWrite(backlight, HIGH);    //encender backlight
  delay(500);                       //pausa antes de primera pantalla para que se muestre prolijamente
  digitalWrite(ledVerde, HIGH);
  lcd.begin(20, 4);                 //inicio de uso de LCD de 20x4
  lcd.setCursor(3, 1);              //posicionar cursor en columna 3 y fila 1
  lcd.print("BIENVENIDO/A A");      //escribir texto en LCD
  lcd.setCursor(1, 2);
  lcd.print("TECMATEMP LCDMR 35");
  digitalWrite(buzzer, HIGH);       //encender buzzer
  delay(1000);                      //pausa de 1 seg encendido
  digitalWrite(buzzer, LOW);        //apagar buzzer
  delay(9000);                      //esperar 9 seg antes del void loop
  lcd.clear();                      //limpiar pantalla
  delay(100);                        //pausa para pasar a otra pantalla prolijamente
}

Hasta el VOID LOOP quize decir, ahora el resto:

void loop() {
  float temperatura = centigrados();      //se iguala variable temperatura a variable centigrados
  lcd.setCursor(0, 0);
  lcd.print("SIN VALORES LIMITES!");
  lcd.setCursor(0, 2);                    //posicionar texto en columna 0 y fila 2
  lcd.print("TEMP.ACT.....     ^C");       //escribir texto en LCD
  lcd.setCursor(13, 2);
  lcd.print(temperatura);                  //mostrar resultado de temperatura mas arriba
  delay(500);

  char teclas = keypad.getKey();  //Guarda en la variable "teclas" el valor pulsado del teclado

  if (teclas != NO_KEY) {             //Si se ha pulsado una tecla
    numero = teclas - 48;            //conversión de caracteres ASCII a valores numericos
    digitalWrite(buzzer, HIGH);
    delay(50);
    digitalWrite(buzzer, LOW);

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON A (INSERTAR VALOR MAX) (TECLA F6)
    if (numero == 17) {                      //Si se pulsa la tecla A entonces (valor ascii A es en valor numerico 17)
      lcd.clear();                        //Se limpia la pantalla del LCD
      delay(100);                          //pausa para pasar a otra pantalla
      lcd.setCursor(3, 0);                   //se ajusta el cursor del LCD
      lcd.print("INGRESE NUEVO!");           //se muestra texto en LCD
      lcd.setCursor(4, 1);
      lcd.print("VALOR MAXIMO");
      lcd.setCursor(5, 2);
      lcd.print("(0.....99)");
      lcd.setCursor(8, 3);
      lcd.print("  ^C");
      cicloA = 1;                         //El "cicloA" será igual a 1
      numero = -1;                    //la variable "numero" comienza en -1
      contador = 0;                       //Se iguala la variable "contador" a 0
      digitalWrite(ledAzul, LOW);      //apagar led azul
      digitalWrite(ledVerde, LOW);    //apagar LED verde
      digitalWrite(ledRojo, LOW);      //apagar led rojo
    }

    if (cicloA == 1) {                       //Si el "cicloA = 1", indica que se presiono la tecla A o F6

      if (numero >= 0 && contador == 1) {          //Si se presiona una digito y contador=1 entonces
        unidadA = numero;                       //Se iguala el valor tecleado a la variable "unidadA"
        contador++;                           //Se incrementa al valor del contador a 2
        numero = -1;                          //la variable numero comienza en -1
        delay(500);
      }
      if (numero >= 0 && contador == 0) {       //Si se presiona un boton del teclado y si el "contador = 0" entonces
        decenaA = numero;                   //Se iguala el valor tecleado a la variable "decenaA"
        contador++;                       //Se incrementa el valor del "contador" a 1
        numero = -1;                    //la variable "numero" comienza en -1
        delay(500);

        valorA = (decenaA * 10) + unidadA;
        delay(100);
        lcd.setCursor(8, 3);                  //posicionar cursor del LCD
        lcd.print(valorA);                    //mostrar en LCD valores de temperatura
      }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON B (INSERTAR VALOR MIN) (TECLA F5)
    if (numero == 18) {             //Si se pulsa la tecla B entonces
      lcd.clear();                  //Se limpia la pantalla
      delay(100);                    //pausa para pasar a otra pantalla
      lcd.setCursor(3, 0);               //se ajusta el cursor
      lcd.print("INGRESE NUEVO!");
      lcd.setCursor(4, 1);            //Se ajusta el cursor a una determinada posición
      lcd.print("VALOR MINIMO");        //mostrar texto en LCD
      lcd.setCursor(5, 2);
      lcd.print("(0.....99)");
      lcd.setCursor(8, 3);                //posicionar cursor del LCD
      lcd.print("  ^C");                   //escribir textos
      cicloB = 1;                       //El cicloB será igual a 1
      numero = -1;                      //variable char numero se iguala a -1
      contador = 0;                   //Se iguala la variable "contador" a cero
      digitalWrite(ledAzul, LOW);      //apagar led azul
      digitalWrite(ledVerde, LOW);    //apagar LED verde
      digitalWrite(ledRojo, LOW);      //apagar led rojo
    }

    if (cicloB == 1) { //Si cicloB = 1, indica que se presiono la tecla B

      if (numero >= 0 && contador == 0) {            //Si se presiona una digito y contador=0 entonces
        decenaB = numero;                           //Se iguala el valor tecleado a la variable "decenaB"
        contador++;                                  //Se incrementa al valor del contador a 1
        numero = -1;                                //variable char numero se iguala a -1
        delay(500);
      }

      if (numero >= 0 && contador == 1) {        //Si se presiona una digito y contador=1 entonces
        unidadB = numero;                       //Se iguala el valor tecleado a la variable "unidadB"
        contador++;                            //Se incrementa al valor del contador a 2
        numero = -1;                            //variable char numero se iguala a -1
        delay(500);

        valorB = (decenaB * 10) + unidadB;
        delay(100);
        lcd.setCursor(8, 3);                          //Se ajusta el cursor a una determinada posición
        lcd.print(valorB);                         //Se imprime en el LCD el numero obtenido en la variable "valorB"
      }
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON C (BORRAR NUMEROS EQUIVOCADOS) (TECLA F4)
    if (numero == 19) {                       //Si se pulsa la tecla C entonces
      delay(100);                          //pausa antes del borrado de numeros
      lcd.setCursor(8, 3);                      //Se ajusta el cursor del LCD
      lcd.print("");                           //mostrar texto vacio en LCD
      digitalWrite(ledAzul, LOW);                //apagar led azul
      digitalWrite(ledVerde, LOW);              //apagar LED verde
      digitalWrite(ledRojo, LOW);              //apagar led rojo
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR EL BOTON D (ENTER) (F3)
    if (numero == 20) {                           //si se pulsa la tecla D entonces
      digitalWrite(ledVerde, HIGH);                  //encender led verde
      lcd.clear();                                //limpiar pantalla
      delay(100);
      lcd.setCursor(0, 0);                      //posicionar cursor en columna 0 y fila 0
      lcd.print("EN FUNCIONAMIENTO...");        //escribir texto en LCD
      lcd.setCursor(0, 1);                      //posicionar cursor en columna 0 y fila 1
      lcd.print("TEMP.MAX........  ^C");       //escribir texto en LCD
      lcd.setCursor(16, 1);
      lcd.print(valorA);                        //mostrar valorA maximo en LCD
      lcd.setCursor(0, 2);                      //posicionar texto en columna 0 y fila 2
      lcd.print("TEMP.ACT.....     ^C");       //escribir texto en LCD
      lcd.setCursor(0, 3);                    //posicionar texto en columna 0 y fila 3
      lcd.print("TEMP.MIN........  ^C");       //escribir texto en LCD
      lcd.setCursor(16, 3);
      lcd.print(valorB);                        //mostrar valorB maximo en LCD
    }
  }

  if (temperatura >= (valorA)) {                //si el valor de temperatura es mayor o igual al valorA
    digitalWrite(ledAzul, LOW);                //apagar led azul
    digitalWrite(ledRojo, HIGH);                //encender led rojo
    digitalWrite(transistor2, HIGH);              //encender transistor 2
  }
  else {
    digitalWrite(ledRojo, LOW);              //apagar led rojo
    digitalWrite(transistor2, LOW);          //apagar transistor 2
  }

  if (temperatura <= (valorB)) {            //si el valor de temperatura es mayor o igual al valorB
    digitalWrite(ledRojo, LOW);              //apagar led rojo
    digitalWrite(ledAzul, HIGH);            //encender led azul
    digitalWrite(transistor1, HIGH);        //encender transistor 1
  }
  else {
    digitalWrite(ledAzul, LOW);              //apagar led azul
    digitalWrite(transistor1, LOW);           //apagar transistor 1
  }
}

No piensen que quiero que me resuelvan todo, yo mientras voy probando aca en mi casa...fui completo al explicar para que entiendan lo mayor posible. Con alguna pequeña ayudita estare agradecido.