quarta-feira, 23 de julho de 2014

Shield LCD KeyPad



   A Shield LCD KeyPad, foi desenvolvida para placas Arduino, para oferecer uma interface de fácil utilização que permite aos usuários criarem menus, fazer seleções, etc. Composto por um LCD branco de 16x2 (Caractere x Linha) com luz de fundo azul, e um teclado de cinco teclas: Selecione (select), Acima (up), direita (rigth), abaixo (down), e esquerda (left). Para otimizar o uso dos pinos digitais I/O, a interface do teclado usa apenas uma entrada analógica. Os valores da chave são lidos através de um divisor de tensão de cinco estágios.

 Na imagem abaixo veja quais as entradas e saidas necessárias pra conectar ao arduino.


na tabela abaixo veja as funções de cada pino usado.

Dimensões da placa.





   Todas as informações citadas acima, foram disponibilizadas pelo fabricante da shield.

  Identificando valores dos botões do keypad:


  Como citado acima, os comandos do keypad são recebidos pelo arduino por apenas uma entrada analógica. Isso é possível porque cada botão fornece um nível de tensão que lhe corresponde.

   Como no datasheet do fabricante não contém esses  valores, foi necessário mensurá-los usando a própria entrada analógica do arduino. Para isso é necessário programar o arduino de forma que ele amostre os valores da entrada analógica no monitor serial. veja o código abaixo:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue, DEC);
}

   Depois de carregado o código no arduino, é necessário abrir o monitor serial ( Ctrl + Shift + M ) para poder visualizar os valores.

Abaixo os resultados obtidos no teste.

Nenhum botão pressionado = 1023


Botão select = 640


Botão left = 410


Botão rigth = 0


Down = 258


Up = ficou variando entre 100 e 101



Código teste.




   Este código foi desenvolvido com objetivo didático e para testar o funionamento do display. Na primeira linha ele exibe apenas um texto simples. Na segunda linha à esquerda exibe qual o botão está sendo pressionado. À esquerda da segunda linha, exibe um contador em segundos que mostra a quanto tempo o arduino está ligado.

/*******************************************************

Este teste irá testar o LCD e os botões

********************************************************/

#include <LiquidCrystal.h> // carrega biblioteca do display

// selecionar os pinos utilizados no painel LCD

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// definir alguns valores utilizados pelo painel e botões
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// ler os botões
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // Ler o valor da entrada analógica 0
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // Fazemos esta a opção 1, por razões de velocidade, uma vez que irá ser o resultado mais provável
 if (adc_key_in < 50)   return btnRIGHT;
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;  
 return btnNONE;  // quando todas as outras falham, devolva este ...
}

void setup()
{
 ini ();  // inicia a sub rotina da tela de apresentação

 lcd.begin(16, 2);              // start the library
 lcd.setCursor(0,0);
 lcd.print("  Arduino Mais "); // texto a ser exibido no display

}
void loop()
{
 lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
 lcd.print(millis()/1000);      // Segundos decorridos desde que o display foi ligado


 lcd.setCursor(0,1);            // move to the begining of the second line
 lcd_key = read_LCD_buttons();  // read the buttons

 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT   ");
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
     break;
     }
 }

}
void ini (){  /// tela de apresentação

 lcd.begin(16, 2);             // inicia biblioteca da tela
 lcd.setCursor(0,0);
 lcd.print("  Arduino Mais  ");  // exibe texto na tela na primeira linha
 lcd.setCursor(0,1);
 lcd.print("   Apresenta:   ");// exibe texto na tela na segunda linha
 lcd.setCursor(0,0);
 delay(2000);
 lcd.print("   LCD Keypad   ");  // exibe texto na tela na primeira linha
 lcd.setCursor(0,1);
 lcd.print("      Test      ");// exibe texto na tela na segunda linha
 delay(2000);  // segura informação na tela por 2 segundos
}

Nenhum comentário:

Postar um comentário