O Shield Key Pad LCD 16×2 é um módulo ideal para projetos onde necessita-se de um painel com display e alguns botões para manuseio de informações.

Ele possui um display LCD 16×2 com luz de fundo azul, 5 botões customizáveis e um botão de reset para o Arduino. O display ainda conta com um potenciômetro para regulagem do brilho. A placa base do shield possuí furos reservados para soldagem de barras de pinos para utilização das portas não utilizadas do arduino.

Para o funcionamento do Display utilizamos a biblioteca LiquidCrystal.h .

O teclado é composto de 5 botões – SELECT, ESQUERDA, PARA CIMA, PARA BAIXO e DIREITA, mais um botão de RESET.
Para economizar os recursos de IO digitais, a interface do teclado utiliza apenas um canal de ADC.
O valor da tecla é lido através de um divisor de tensão de 5 estágios. Quando a tecla é pressionada, o ADC lê o valor da tensão através do divisor de tensão e, depois, comparado para a realização da ação definida no sketch. Segue a faixa de leitura:

600 ~ 700 – Select
400 ~ 500 – Esquerda
0 ~ 10 – Direita
90 ~ 100 – Cima
200 ~ 300 – Baixo

O sketch de exemplo tem por finalidade controlar 3 Leds Difusos e 1 Led RGB através da navegação por um menu. O exemplo pode ser adaptado para outras finalidades conforme a criatividade e necessidade de cada um.

Esquema de ligação

Sketch do exemplo

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

//################################################################################################//
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN            2
#define NUMPIXELS      1
#define BRIGHTNESS 255
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//################################################################################################// 

int botao;  
int led1 = 12;
int led2 = 11;
int led3 = 3;
int ledSelecionado = led1;
int contSelect = 0;
int contPosicao = 1;
int R = 0;
int G = 0;
int B = 0;
  
void setup(){  
  Serial.begin(9600);
  lcd.begin(16, 2);  
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  pixels.setBrightness(BRIGHTNESS);
  pixels.begin();
  pixels.show();
  pixels.setPixelColor(0, pixels.Color(0,0,0));     
  pixels.show();
}  
  
void loop(){
  if(contSelect == 0){
    lcd.setCursor(0,0);  
    lcd.print("CONTROLE DE LEDS"); 
    lcd.setCursor(0,1);  
    lcd.print("  OZIRIS  BLOG  "); 
  }    

  botao = analogRead (0);

  //##BOTAO SELECT#################################################################################//
  if((botao > 600)and(botao < 700)){  
    if(contSelect == 0){
      contSelect = 1;
      lcd.setCursor(0,0);
      lcd.print(">LED1 LED2 LED3 "); 
      lcd.setCursor(0,1);
      lcd.print("                ");
      statusLeds();
      delay(300); 
    }else{
      contSelect = 0;
      contPosicao = 1;
      ledSelecionado = led1;
      delay(300); 
    }
  } 
  //##BOTAO SELECT - FIM###########################################################################//

  //##BOTAO ESQUERDA##//
  if((botao > 400)and(botao < 500)){  
    if(contSelect == 1){
      contPosicao = contPosicao - 1;
      if(contPosicao == 0){
        contPosicao = 6;
      }
      delay(300);
      switch(contPosicao){
       case 1:
          //Serial.println("1");
          ledSelecionado = led1;
          lcd.setCursor(0,0);
          lcd.print(">LED1 LED2 LED3 ");
          statusLeds();
       break;
       case 2:
          ledSelecionado = led2;
          lcd.setCursor(0,0);
          lcd.print(" LED1>LED2 LED3 ");
          statusLeds();                      
       break;
       case 3:
          ledSelecionado = led3;            
          lcd.setCursor(0,0);
          lcd.print(" LED1 LED2>LED3 ");
          statusLeds();                      
       break;
         case 4:
            lcd.setCursor(0,0);
            lcd.print (" >R    G    B   ");
            rgbLeds();
         break;
         case 5:
            lcd.setCursor(0,0);
            lcd.print ("  R   >G    B   ");
            rgbLeds();
         break;  
         case 6:
            lcd.setCursor(0,0);
            lcd.print ("  R    G   >B   ");
            rgbLeds();
         break;        
      }
    } 
  } 
  //##BOTAO ESQUERDA - FIM####################################################################################// 
   
  //##BOTAO DIREITA##########################################################################################//
  if((botao >= 0)and(botao < 10)){
    if(contSelect == 1){
      contPosicao = contPosicao + 1;
      if(contPosicao == 7){
        contPosicao = 1;
      }
      delay(300);
      switch(contPosicao){
         case 1:
            //Serial.println("1");
            ledSelecionado = led1;
            lcd.setCursor(0,0);
            lcd.print(">LED1 LED2 LED3 ");
            statusLeds();            
         break;
         case 2:
            ledSelecionado = led2;
            lcd.setCursor(0,0);
            lcd.print(" LED1>LED2 LED3 ");
            statusLeds();                                     
         break;
         case 3:
            ledSelecionado = led3;
            lcd.setCursor(0,0);
            lcd.print(" LED1 LED2>LED3 ");
            statusLeds();                                     
         break;
         case 4:
            Serial.println("4");
            lcd.setCursor(0,0);
            lcd.print (" >R    G    B   ");
            rgbLeds();
         break;
         case 5:
            Serial.println("5");
            lcd.setCursor(0,0);
            lcd.print ("  R   >G    B   ");
            rgbLeds();
         break;  
         case 6:
            Serial.println("6");
            lcd.setCursor(0,0);
            lcd.print ("  R    G   >B   ");
            rgbLeds();
         break;                           
      }
    }
  } 
  //##BOTAO DIREITA - FIM################################################################################//  
  
  //##BOTAO CIMA#########################################################################################//
  if((botao > 90)and(botao < 100)) {  
    if(contSelect == 1){
      if(contPosicao <= 3){
        Serial.println(contPosicao);
        statusLeds();
        digitalWrite(ledSelecionado, HIGH);
     }else if(contPosicao == 4){
            Serial.println(contPosicao);
            R = R + 1;
            if(R == 256){
              R = 0;
            }
            rgbLeds();  
    }else if(contPosicao == 5){
            Serial.println(contPosicao);
            G = G + 1;
            if(G == 256){
              G = 0;
            }            
            rgbLeds();
    }else if(contPosicao == 6){
            Serial.println(contPosicao);
            B = B + 1;
            if(B == 256){
              B = 0;
            }            
            rgbLeds();
    }
    delay(50);
   }
  }
  //##BOTAO CIMA - FIM###################################################################################//
  
  //##BOTAO BAIXO########################################################################################//   
  if((botao > 200)and(botao < 300)){  
    if(contSelect == 1){
      if(contPosicao <= 3){
        Serial.println(contPosicao);
        digitalWrite(ledSelecionado, LOW);
        statusLeds();
        //Serial.println("ligou");
    
    }else if(contPosicao == 4){
            Serial.println(contPosicao);
            R = R - 1;
            if(R == -1){
              R = 255;
            }
            rgbLeds();  
    }else if(contPosicao == 5){
            Serial.println(contPosicao);
            G = G - 1;
            if(G == -1){
              G = 255;
            }            
            rgbLeds();
    }else if(contPosicao == 6){
            Serial.println(contPosicao);
            B = B - 1;
            if(B == -1){
              B = 255;
            }            
            rgbLeds();
    }
    delay(150);
   }
  }
  //##BOTAO BAIXO - FIM##################################################################################//  

}

void statusLeds(){
  //##CONTROLE DE LIGA / DESLIGA LEDS########################################################################//
  if(digitalRead(led1) == 1){
    lcd.setCursor(1,1);
    lcd.print("ON ");
  }else{
    lcd.setCursor(1,1);
    lcd.print("OFF");  
  }
  if(digitalRead(led2) == 1){
    lcd.setCursor(6,1);
    lcd.print("ON ");
  }else{
    lcd.setCursor(6,1);
    lcd.print("OFF");  
  }
  if(digitalRead(led3) == 1){
    lcd.setCursor(11,1);
    lcd.print("ON ");
  }else{
    lcd.setCursor(11,1);
    lcd.print("OFF");  
  }
  //##CONTROLE DE LIGA / DESLIGA LEDS - FIM####################################################################// 
}

void rgbLeds(){
  //##CONTROLE COR LED RGB########################################################################//
    pixels.setPixelColor(0, pixels.Color(R,G,B));     
    pixels.show();
    lcd.setCursor(1,1);
    lcd.print("   ");
    lcd.setCursor(1,1);
    lcd.print(R);

    lcd.setCursor(6,1);
    lcd.print("   ");
    lcd.setCursor(6,1);
    lcd.print(G);

    lcd.setCursor(11,1);
    lcd.print("   ");
    lcd.setCursor(11,1);
    lcd.print(B);    

  //##CONTROLE DE LIGA / DESLIGA LEDS - FIM####################################################################// 
}

Vídeo do exemplo em funcionamento

Abraços e até a próxima.