Fiz um Exemplo rápido de como "Lêr" as teclas da shield LCD, é bem simples, todos os botões são ligados na mesma entrada Analógica, a 0, por isso para diferenciar as teclas são usados resistores, fazendo com que valores diferentes sejam interpretados pelo arduino.
Não sei se é o caso de todas mas na minha as teclas são organizadas dessa forma:
Fotos em Breve...
------------------------------------------------------------------
Tecla - Valor:
Cima - 146
Baixo - 334
Direita - 0
Esquerda - 511
Selecionar - 745
------------------------
Qualquer coisa se não for este valor, ou quiser saber como ligar faça assim:
1) Ache o Datasheet da Sua Shield e confira qual pino Analógico dos botões.
2) Coloque este código em seu arduino substituindo o indicado pelas suas informações.
3) Anote o valor de cada tecla e faça um "coeficiente de cagaço" ou seja a margem de erro, de uns 50 para mais e para menos, mas cuide para que este 50 para mais ou para menos não entre no valor de outra tecla.
#include <LiquidCrystal.h>5) Aqui está o código com os valores da minha Shield, ele lê a tecla e mostra qual é na tela.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //use a pinagem de seu arduino
void setup(){
lcd.begin(16,2);
Serial.begin(9600);
}
void loop(){
delay(1000);
lcd.clear();
int tecla_valor = analogRead(0);// 0 é o pino da sua entrada analógica
lcd.print(tecla_valor);//tecla_valor armazena o valor lido e joga pra tela LCD.
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //use a pinagem de seu arduino
void setup(){
lcd.begin(16,2);
Serial.begin(9600);
}
void loop(){
delay(90);
lcd.clear();
int tecla_valor = analogRead(0);
if (tecla_valor == 0)
{
lcd.print("Direita 0");
delay(100);
}
if ((tecla_valor >= 120) & (tecla_valor <= 146))
{
lcd.print("Cima 146");
delay(100);
}
if ((tecla_valor >= 300) & (tecla_valor <= 350))
{
lcd.print("Baixo 334");
delay(100);
}
if ((tecla_valor >= 500) & (tecla_valor <= 530))
{
lcd.print("Esquerda 511");
delay(100);
}
if ((tecla_valor >= 700) & (tecla_valor <= 790))
{
lcd.print("Selecionar 745");
delay(100);
}
delay(50);
}
Como prometido criei um "menuzinho", percebam que está cheio de bugs ainda, quando você vai pra negativo e volta pra positivo ficam números errados na tela, e várias outras coisas, mas como estou ainda em fase de testes nesse projeto do Relógio vou desenvolver um menu para poder alterar a hora do relógio pelo sistema mesmo e não mais pelo source, então vou aos poucos mudando o código abaixo...
Se alguém conseguir avanços poste ai, OpenSource é isso!
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //use a pinagem de seu arduino
int up;
int down;
int nothing;
int right;
int left;
int enter;
int sel;
int x;
int y;
void setup() {
lcd.begin(16, 2);
lcd.write(0);
sel = 0;
x = 0;
y = 0;
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 0;
}
void loop(){
delay(100);
int tecla_valor = analogRead(0);
if (tecla_valor == 1023){
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 1;
}
if (tecla_valor == 0)
{
right = 1;
}
if ((tecla_valor >= 120) & (tecla_valor <= 146))
{
up = 1;
}
if ((tecla_valor >= 300) & (tecla_valor <= 350))
{
down = 1;
}
if ((tecla_valor >= 500) & (tecla_valor <= 530))
{
left = 1;
}
if ((tecla_valor >= 700) & (tecla_valor <= 790))
{
enter = 1;
}
delay(50);
lcd.setCursor(x,y);
if (down == 1){
sel = sel -1;
}
if (up == 1){
sel = sel + 1;
}
if (enter == 1) {
(x=x+1);
}
lcd.print(sel);
}
Mais um exemplo, mas esse com menus escritos, tem 3 menus mas pode expandir para mais menus e sub-menus....
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //use a pinagem de seu arduino
int up;
int down;
int nothing;
int right;
int left;
int enter;
int sel;
int x;
int y;
void setup() {
lcd.begin(16, 2);
lcd.write(0);
sel = 1;
x = 0;
y = 0;
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 0;
}
void loop(){
int tecla_valor = analogRead(0);
if (tecla_valor == 1023){
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 1;
}
if (tecla_valor == 0)
{
right = 1;
}
if ((tecla_valor >= 120) & (tecla_valor <= 146))
{
up = 1;
}
if ((tecla_valor >= 300) & (tecla_valor <= 350))
{
down = 1;
}
if ((tecla_valor >= 500) & (tecla_valor <= 530))
{
left = 1;
}
if ((tecla_valor >= 700) & (tecla_valor <= 790))
{
enter = 1;
}
delay(120);
if (right == 1){
sel++;
}
if (left == 1){
sel--;
}
if (sel<=1){
sel =1;
lcd.clear();
lcd.print(" MENU 1 >> ");
}
if (sel==2){
lcd.clear();
lcd.print(" < MENU 2 > ");
}
if (sel>=3){
sel=3;
lcd.clear();
lcd.print(" << MENU 3 ");
}
}