Olá,
Venho aqui apresentar um exemplo de menu criado num LCD Nokia 3310 com o arduino.
Uso um potenciómetro para navegar no menu e um botão para seleccionar.
Ainda estou a comentar e organizar o código para ficar perceptível a todos :)
Depois posso também postar as ligações embora já estejam indicadas aqui: http://lusorobotica.com/index.php/topic,431.0.html (http://lusorobotica.com/index.php/topic,431.0.html)
Aqui o que ando a fazer:
Arduino + Controlar Leds usando um menu no LCD (http://www.youtube.com/watch?v=mZuJA2eEjVs#)
Fiz um esquema no Fritzing, foi a primeira vez que o testei mas não fiquei muito convencido parece-me que há coisas básicas que já deviam estar implementadas...
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh6.ggpht.com%2F_i2teYMYP9C0%2FSbz3emHbxqI%2FAAAAAAAAAQ4%2FCfrf6WAZi6Y%2Fs400%2Flcdarduinoleds.jpg&hash=5d77c47e87ac42e3546ed6bce9ca235f8715a738) (http://picasaweb.google.com/josescxavier/DropBox#5313393765390206626)
Eu não indiquei na imagem mas parece óbvio onde se liga o LCD :)
Agora acrescento o código, todas as linhas estão comentadas e de uma maneira que me parece perceptível a todos.
Aqui fica um excerto, o resto está em anexo!
//Criação das variaveis a usar.
byte pontos[8]={0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00}; //Este vector é o simbolo que coloco antes dos nomes, é aquela bolinha.
int ledsPinos[6]={8,9,10,11,12,13}; //Pinos onde estão os Leds
boolean ledsEstado[6]={false,false,false,false,false,false}; //Estado de cada Led! false para desligado, true para ligado!
char ledsNomes[6][6]={"Led 1","Led 2","Led 3","Led 4","Led 5","Led 6"}; //O nome dos leds que aparece no menu!
int pot=0; //pino do potenciometro
int botao=2; //pino do botao
int i=0; //variavel auxiliar que vai servir para alocar a linha
void loop(){
cursorxy(0,0); //Posiciona o cursor no inicio do LCD.
pot=analogRead(0); // Le o valor do potenciometro na entrada 0;
i=map(pot,0,950,0,5); //Mapeia o valor lido de 0 a 1023 num valor de 0 a 5 que é o numero de linhas. - Coloquei 950 em vez de 1023 porque quando carregava no botão havia um queda de tensão suficiente para passar o valor de 5 para 4.
//Ligar o LED selecionado!
if(digitalRead(2)==1){ //Se o botão estiver pressionado...
ledsEstado[i]=!ledsEstado[i]; //Altera-se o estado do led correspondente a linha selecionada com o potenciometro, isto é, se está "false"(falso) passa a "true"(verdade) e vice-versa...
digitalWrite(ledsPinos[i],ledsEstado[i]); //Escreve-se no led o seu estado, "false"(falso) ou "true"(verdade), desligado ou ligado!
delay(250); //Evitar que durante o tempo em que se está a carregar no butão o código faço um ciclo, o que desligaria de novo o led!
}
//Escrever no LCD
for(int k=0;k<6;k++){ //Vamos correr as 6 linhas - de 0 a 5
cursorxy(0,k); //Colocamos o cursor na posição 0 em x e na linha k
for(int j=0;j<8;j++){ //Vamos colocar o simbolo na linha.
if(k==i){ //Se a linha que em que estámos a colocar o simbolo for a mesma onde está o potenciometro vamos inverter a cor. Para isso
writedata(pontos[j]^0xff); //fazemos um XOR, isto é onde estava um pixel a 1 passa a 0 e onde estava a 0 passa a 1.
}
else{
writedata(pontos[j]); //Os outros são os simbolos normais.
}
}
putstr(" "); //Colocamos um espaço.
if(ledsEstado[k]){ //Se o estado do led da linha k estiver a true vamos colocar o nome com as cores inversas
putstrInv(ledsNomes[k]); //para isso acrescentei a função putstrInv que coloca uma string mas com as cores inversas.
}else{
putstr(ledsNomes[k]); //caso contrário coloca o nome normalmente.
}
}
delay(10);
}
Abraços :)