Arduino LCD-Keypad

Hola amigos, he estado tratando de realizar la programación en Arduino para controlar una pantalla LCD de 20x4 junto con un teclado numérico de 5x4. Lo que debo de realizar es algo así como un indicador de varias variables, primero que nada despliego un mensaje de bienvenida, después al presionar cualquier tecla se despliega un menú con tres opciones: Temperatura, Peso y Humedad, y añado junto a cada una de las variables un numero para hacer referencia de la tecla que deben de pulsar para acceder al monitoreo de cada variable, pero sucede que a la hora de probarlo con Proteus no hace lo que pensaba, en cambio creo que el problema que existe es que la mayor parte del tiempo no se pulsa ninguna tecla en el teclado, lo que hace que se cumplan muchas condiciones, no sé si exista alguna manera para controlar adecuadamente el teclado numérico.

De antemano muchas gracias por tomarse el tiempo para revisar esto.


Código:
#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int screenWidth = 20;
int screenHeight = 4;
// the two lines
// line1 = scrolling
String line1 ="      Bienvenido    ";
// line2 = static
String line2 ="        Usuario     ";
String line3= "                    ";
String line4="info@escuela.com           ";
String line21=" Monitoreo de Datos ";
String line22="Temperatura  =  1   ";
String line23="Masa = 2            ";
String line24="Humedad = 3         ";
String line31="    Temperatura     ";
String line32="Temperatura 1=";
String line33="Temperatura 2=";
String line34="Temperatura 3=";
String line41="        Peso        ";
String line42="Peso 1=";
String line43="Peso 2=";
String line44="Peso 3=";
String line51="      Humedad       ";
String line52="Humedad 1=";
String line53="Humedad 2=";
String line54="Humedad 3=";
// just some reference flags
int stringStart,stringStop =0;
int scrollCursor = 20;
// keypad type definition
const byte ROWS = 5; //four rows
const byte COLS = 4; //three columns
int lin=0;
int count=0;
int pantalla=0;
int condicion=0;
int siguiente=0;
int atras=0;


  char keys[ROWS][COLS] =
{ {\'F1\',\'F2\',\'F3\',\'F4\'},
 {\'7\',\'8\',\'9\',\'A\'}, 
 {\'4\',\'5\',\'6\',\'B\'},  
 {\'1\',\'2\',\'3\',\'C\'},
 {\'*\',\'0\',\'#\',\'D\'}};
 
byte rowPins[ROWS] = {
 A4,A5,A6,A7,A8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {
 A0,A1,A2,A3}; // connect to the column pinouts of the keypad
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

  void setup()
{
  lcd.begin(20, 4);
  
}

void loop()
{
    char key = keypad.getKey();
    if (key != NO_KEY)
     {pantalla=1;}
     
  if (pantalla==0) 
{
  lcd.setCursor(0, 0);
  lcd.print(line1);
  lcd.setCursor(0, 1);
  lcd.print(line2);
  lcd.setCursor(0, 2);
  lcd.print(line3);
  lcd.setCursor(scrollCursor, 3);
  lcd.print(line4.substring(stringStart,stringStop));
    if(stringStart == 0 && scrollCursor > 0){
    scrollCursor--;
    stringStop++;
    } else if (stringStart == stringStop){
    stringStart = stringStop = 0;
    scrollCursor = screenWidth;
    } else if (stringStop == line4.length() && scrollCursor == 0) {
    stringStart++;
    } 
    else {
    stringStart++;
    stringStop++;
    }}     
    if (pantalla==1 && key != NO_KEY  ) {
       if(condicion==0) {
    condicion=1;
    lcd.clear();
    }
    stringStart,stringStop=0;   
    lcd.setCursor(0,0);
    lcd.print(line21);
    lcd.setCursor(0,1);
    lcd.print(line22);
    lcd.setCursor(0,2);
    lcd.print(line23);
    lcd.setCursor(0,3);
    lcd.print(line24);
          if (key==\'1\')//reemplazar con F1 y F2
     {
        pantalla=2; //para temperatura
     }
         if (key==\'2\')//reemplazar con F1 y F2
     {
       pantalla=3;
     }
         if (key==\'3\')//reemplazar con F1 y F2
     {
       pantalla=4;   
     }
   if (pantalla==2) //despliega pantalla temperatura
  { 
  lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(line31);
    lcd.setCursor(0,1);
    lcd.print(line32);
    lcd.setCursor(0,2);
    lcd.print(line33);
    lcd.setCursor(0,3);
    lcd.print(line34);
    
    if (key==\'F2\')
    {
    pantalla=3;
    delay(300);
    }
    if (key==\'F3\')
    {
    pantalla=4;
    delay(300);  
    }
    }
  if (pantalla==3) //despliega pantalla peso
  { 
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(line41);
    lcd.setCursor(0,1);
    lcd.print(line42);
    lcd.setCursor(0,2);
    lcd.print(line43);
    lcd.setCursor(0,3);
    lcd.print(line44);  
     if (key==\'F2\')
    {
    pantalla=4;
    delay(300);
    }
    if (key==\'F3\')
    {
    pantalla=2;  
    delay(300);
    }
  }
   if (pantalla==4) //despliega pantalla humedad
  { 
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(line51);
    lcd.setCursor(0,1);
    lcd.print(line52);
    lcd.setCursor(0,2);
    lcd.print(line53);
    lcd.setCursor(0,3);
    lcd.print(line54);   
 if (key==\'F2\')
    {
    pantalla=2;
    delay(300);
    }
    if (key==\'F3\')
    {
    pantalla=3;  
    delay(300);
    }  
 }
  if (key==\'F1\')
  {
    lcd.setCursor(0,0);
    lcd.print(line21);
    lcd.setCursor(0,1);
    lcd.print(line22);
    lcd.setCursor(0,2);
    lcd.print(line23);
    lcd.setCursor(0,3);
    lcd.print(line24);
  
  }
  }
  }
...
 
Hola ViCtorA, gracias por responder, al parecer el problema está en que cambian las condiciones muy rápidamente, por ejemplo al simularlo en Proteus cuando el estado de la tecla cambia, debería mostrar un menú, pero debido (creo yo) a que el estado de la tecla dura solamente unos instantes no muestra el menú, y en cambio el cursor se vuelve loco.

Estoy intentando hacer uso de Switch, ¿crees que sea más conveniente?

Creo que realmente el problema es mi programación.

Gracias de antemano.
 
Gracias de nuevo ViCtorA, con la página que me pasaste cambié casi todo el código, parece que funciona mucho mejor, pero aún me quedan algunas dudas, en caso de que quisiera tener una seguna línea corrediza dentro de los CASE, ¿cómo lo haría? He intentado algunas cosas, pero parece ser que nada funciona jaja.

Saludos

Código:
#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int screenWidth = 20;
int screenHeight = 4;
// the two lines
// line1 = scrolling
String line1 ="      Bienvenido    ";
// line2 = static
String line2 ="        Usuario     ";
String line3= "                    ";
String line4="info@escuela.com    ";
String line21=" Seleccione la Variable a Monitorear ";
String line22="     Temperatura    ";
String line23="         Peso       ";
String line24="        Humedad     ";
String line31="     Temperatura    ";
String line32="Temp #1=";
String line33="Temp #2=";
String line34="Temp #3=";
String line41="         Peso       ";
String line42="Peso #1=";
String line43="Peso #2=";
String line44="Peso #3=";
String line51="        Humedad     ";
String line52="Hume #1=";
String line53="Hume #2=";
String line54="Hume #3=";
String line60="         MENU       ";
String line61="Monitoreo de Datos";
String line62="Modo Manual";
// just some reference flags
int stringStart,stringStop =0;
int scrollCursor = 20;
// Se define el tamaño del teclado
const byte ROWS = 5; //four rows
const byte COLS = 4; //three columns
//se declaran algunas variables
boolean inicio=true;
int pantalla=0;
int cuenta=0;
boolean teclapresionada=false;
int enter=0;
int count=0;
int lin=0;
char datos;
//se definen los caracteres que formaran parte del teclado
  char keys[ROWS][COLS] =
{ {'W','X','Y','Z'},
 {'7','8','9','A'}, 
 {'4','5','6','B'},  
 {'1','2','3','C'},
 {'*','0','#','D'}};
//se definen entradas para la matriz del teclado 
byte rowPins[ROWS] = {
 A4,A5,A6,A7,A8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {
 A0,A1,A2,A3}; // connect to the column pinouts of the keypad
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


  void setup()
{
  lcd.begin(20, 4);//se define el tamaño de la pantalla LCD
           
}

void loop() {
    
   if (inicio==true)
   {
     pantallas(0);
      lcd.setCursor(scrollCursor, 3);
      lcd.print(line4.substring(stringStart,stringStop));
      if(stringStart == 0 && scrollCursor > 0){
      scrollCursor--;
      stringStop++;
      } else if (stringStart == stringStop){
      stringStart = stringStop = 0;
      scrollCursor = screenWidth;
      } else if (stringStop == line4.length() && scrollCursor == 0) {
      stringStart++;
      } 
      else {
      stringStart++;
      stringStop++;
      }}
      pantalla=0;      
     char key = keypad.getKey(); 
     
     switch (key) { 
    case 'Z': //temperatura
      inicio=false;
      pantalla=2;
      pantallas(2);    
      break; 
      
    case 'A'://peso
      inicio=false;
      pantalla=3;
      pantallas(3);
      break; 
      
    case 'B'://humedad  
      inicio=false;
      pantalla=4;
      pantallas(4);
      break;
    
    case 'W'://menu monitoreo
      inicio=false; 
      pantalla=1; 
      pantallas(1);   
      do{
      lcd.setCursor(scrollCursor, 0);
      lcd.print(line21.substring(stringStart,stringStop));
      if(stringStart == 0 && scrollCursor > 0){
      scrollCursor--;
      stringStop++;
      } else if (stringStart == stringStop){
      stringStart = stringStop = 0;
      scrollCursor = screenWidth;
      } else if (stringStop == line21.length() && scrollCursor == 0) {
      stringStart++;
      } 
      else if (key=='Z')//temperatura
      {  
      break;
      pantallas(2);
      pantalla=2;
      }
      else if (key=='A')//peso
      {
      break;
      pantallas(3);
      pantalla=3;
      }
      else if (key=='B')//humedad
      {
      break;
      pantallas(4);
      pantalla=4;
      }
      else {
      stringStart++;
      stringStop++;
      }
      delay (5);
    }while (pantalla==1);
       break;
    
    case 'X'://siguiente
       inicio=false;
       pantalla++;
       pantallas(pantalla);
       if (pantalla==4)
       {
       pantalla=2;
       }
       break;
    case 'Y'://anterior  
       inicio=false;
       pantalla--;
       pantallas(pantalla);
       if (pantalla==1)
       {
       pantalla=5;
       }
       break;
       default:  
       break;
    }}
   
   //metodo que elige la pantalla a mostrar
    void pantallas (int pantalla)
    {
    
    switch (pantalla)
    {
    case 0://bienvenida
             lcd.setCursor(0, 0);
             lcd.print(line1);
             lcd.setCursor(0, 1);
             lcd.print(line2);
             lcd.setCursor(0, 2);
             lcd.print(line3);
             break;
     case 1: //menu
            lcd.clear();   
            lcd.setCursor(0,1);
            lcd.print(line22);
            lcd.setCursor(0,2);
            lcd.print(line23);
            lcd.setCursor(0,3);
            lcd.print(line24);   
            break;
     case 2://menu temperatura
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print(line31);
             lcd.setCursor(0,1);
             lcd.print(line32);
             lcd.setCursor(0,2);
             lcd.print(line33);
             lcd.setCursor(0,3);
             lcd.print(line34); 
             break;
     case 3://menu peso
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print(line41);
             lcd.setCursor(0,1);
             lcd.print(line42);
             lcd.setCursor(0,2);
             lcd.print(line43);
             lcd.setCursor(0,3);
             lcd.print(line44); 
             break;
     case 4://menu humedad
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print(line51);
             lcd.setCursor(0,1);
             lcd.print(line52);
             lcd.setCursor(0,2);
             lcd.print(line53);
             lcd.setCursor(0,3);
             lcd.print(line54);              
             break;
     default: 
     break;
     
    }   
    }
 
Haber, no se bien a que te refieres, si es por el código que adjuntas, en el
Código:
case 'W'://menu monitoreo
y dentro del
Código:
do{
, no se ejecuta ninguno de los
Código:
if (key=='__')
, en todos hay un
Código:
break
al entrar al 'if' y deberia estar al final. No se si es eso, lo que querías hacer.
 
hola a todos, una consulta, como puedo ingresar un numero decimal en una lcd a traves de un teclado, existe alguna libreria o ejemplo al respecto.

Espero me puedan orientar

Juan Carlos
 
ninjagaiden2, como te ha ido con tu problema, yo estoy intentando que al presionar * debe posicionarse en la segunda linea columna 1 y permitir ingresar un numero de dos digitos, luego de ingresado estos dos numeros se debe posicionar en la linea 1 comunna 11 y permitir ingresar dos numeros pero ahy estoy con muchos problemas, si solucionas el tuyo me podrias ayudar

Gracias

Juan Carlos
 
Atrás
Arriba