LCD keypad 16x2: 2 botones con mismo resultado

Hola a todos.

Estoy jugueteando con un display LCD 16x2 y utilizando el sketch que muesta en pantalla el botón que está presionado así como los valores de dicho botón.

Éste es el display

El problema es que el display, me detecta los botones UP y DOWN como DOWN a pesar de darme valores diferentes.

El botón UP me dá un valor de 982 pero en la pantalla me pone DOWN
El botón DONW me dá un valor de 254 y en la pantalla me pone DOWN (esto último es correcto :slight_smile: )

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int lcd_key     = 0;
int key  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

void setup()
{
 lcd.begin(16, 2);              // Inicializar el LCD
 lcd.setCursor(0,0);
 lcd.print("Prometec.net");     // print a simple message
}
 
void loop()
{
   lcd.setCursor(9,1);            // Cursor a linea 2, posicion 9
   lcd.print(millis()/1000);      // Imprime segundos
   lcd.setCursor(13, 0);          // Cursor a linea 1, posicion 13
   lcd.print(key);                // Imprime el valor leido en la puerta A0
   lcd.setCursor(0,1);            // Cursor a linea 2, posicion 1
 
   lcd_key = read_LCD_buttons();  
  
   if( lcd_key == btnRIGHT)
       lcd.print("RIGHT ");
   else if ( lcd_key == btnLEFT )
       lcd.print("LEFT   ");
   else if ( lcd_key == btnUP)
       lcd.print("UP    ");
   else if ( lcd_key == btnDOWN)
       lcd.print("DOWN  ");
   else if ( lcd_key == btnSELECT)
       lcd.print("SELECT");
   else if ( lcd_key == btnNONE)
       lcd.print("NONE  ");
}

int read_LCD_buttons()  // Lee los botones y devuelve le valor pulsado
{
 key = analogRead(0);      // Leemos la puerta A0 
 // Mis botones dan:  0, 145, 329,507,743 ; Comprueba que tu shield devuelve valores parecidos
 // Y ahora los comparamos con un margen comodo

 if (key > 1000) return btnNONE; //Si no se pulsa nada salimos (el 99% de las veces) 
 if (key < 50)   return btnRIGHT;  
 if (key < 260)  return btnDOWN; 
 if (key < 450)  return btnLEFT; 
 if (key < 650)  return btnSELECT; 
 if (key < 990)  return btnUP;  

 return btnNONE;  // when all others fail, return this...
}

EDIT: Se me ha ocurrido que a lo mejor el display me está mostrando mal el valor del sensor pensando que el valor pudiese ser 82, y no 982 como es mostrado, así que he modificado el código para el btnUP de la siguiente manera.

if (key < 100) return btnUP

Ahora sí que todos los botones funcionan correctamente pero el valor de lectura del pin analógico al pulsar el botón UP me sigue dando 982. ¿Alguien me lo puede explicar?

Revisa conexiones, pon llamados al monitor serie para confirmar que funciona como crees.
O tienes un cable cruzado, o una soldadura fria.

int read_LCD_buttons()  // Lee los botones y devuelve le valor pulsado
{
 key = analogRead(0);      // Leemos la puerta A0 
 // Mis botones dan:  0, 145, 329,507,743 ; Comprueba que tu shield devuelve valores parecidos
 // Y ahora los comparamos con un margen comodo

 if (key > 1000) return btnNONE; //Si no se pulsa nada salimos (el 99% de las veces) 
 if (key < 50)  return btnRIGHT;  
 if (key < 260)  {
      Serial.print("DOWN: ");
      Serial.println(key);
      return btnDOWN; 
 }
 if (key < 450)  return btnLEFT; 
 if (key < 650)  return btnSELECT; 
 if (key < 990)  {
      Serial.print("DOWN: ");
      Serial.println(key);
      return btnUP;  
  }
 return btnNONE;  // when all others fail, return this...
}

Solo para revisar las dos teclas

Gracias por la sugerencia.

El resultado que me da el serial al presionar la tecla UP es 98, por lo tanto el displau me está mostrando el dato mal.

Al sobreescribir el dato que ya hay en pantalla en la primera linea (102), no sobreescribe por completo la cifra. En lugar de utilizar un cero para completar las centenas y cubrir totalmente la cifra anterior (098) muestra solamente 98 con lo cual no cubre la otra cifra y muestra el último dígito de la misma (98-2). Sin embargo al pulsar el boton RIGHT sí que muestra correctamente el valor de dicho botón (002) ¿?

EDIT: Corrijo. Tampoco me lo muestra correctamente. XD. El valor del boton RIGHT por serial me da 0. Por lo que me muestra 0-02.

Qué desastre! Me pasa por no comprobar bien las cosas. Disculpaz las molestias

copie el mismo código y me equivoqué.
Revisa esto

  if (key < 990)  {
      Serial.print("DOWN: ");
      Serial.println(key);
      return btnUP;  
  }