Go Down

Topic: Menus + LCD alguem sabe como fazer? (Read 3555 times) previous topic - next topic

Edson Grandao

Hoje fiquei de cara.... queria fazer um menu de opções no arduino usando um display 16x2 e cheguei a conclusao que nao sei nem como  começa  :o. ai começei a verificar sobre menue acheialguns artigos,mas nada que me fizesse entender. se alguem tiver ai um exemplo de menu, me explica ai.. grato

DanDare

#1
Nov 22, 2010, 02:43 am Last Edit: Nov 22, 2010, 02:47 am by DanDare Reason: 1
Olá,

Também precisei aqui, acabei conseguindo depois de algum custo e acho que o código ainda está grande demais. De qualquer forma uma lógica que pode ser usada é a seguinte: Separar um botão para navegar, outro pra confirmar e outro pra mudar ou entrar dados de acordo com sua necessidade.
Cada vez que aperta o botão de navegação ele adiciona uma unidade (++1), numa variável, chamada digamos "index", aí em estruturas IF.. THEN aninhadas você pode checar o valor de "index" e dependendo do valor ele vai trocando no display as opções. Apertando o botão "selecionar" novamente checa "index" e efetua a ação desejada. Apertando "cancelar" retorna index para 0 (por exemplo), e começa a sequencia novamente.

Exemplos de sketch tenho que pegar um código monstro que tenho aqui e filtrar pra te mostrar. Tem um ano que eu tava parado com Arduino e tenho que inclusive retomar na prática de programação (tô meio crú). Essa semana to até o pescoço até sexta feira, então não prometo os sketches rápido.

Valeu

Edson Grandao

oi amigo, fiquei estudando o final de semana inteiro e cheguei a uma conclusão que até ficou boa, mas como vc disse o codigo ficou grande.

pensei da seguinte forma: usei um do while para fechar um loop particular e um case dento para fazer as funções no display. tenho 3 botoes usei 1 para menu, 1 para + e 1 para -. Quando liga o arduino ele fica mostrando a temperatura, se apertar o menu, entra a linha com a variavel apertando o botão + ou - aumenta ou diminui a variavel. apertndo novamente o botão menu passapara a proxima variavel, e no final salva, nao tendo opção para descartar valores errados.

ficou grande, pois eu nao sei usar  o comando "for", desde clipper q nunca entendi.

depois vou pegar uma parte do codigo e te mando, qm sabe vc nao dá uma ideia....

valeu e até mais

mlapidusas

Boa noite, de repente de aqui pode tirar uma idéia!
http://www.nuelectronics.com/estore/index.php?main_page=product_info&cPath=1&products_id=2

Abs!

Marcio

DanDare

#4
Nov 26, 2010, 08:05 pm Last Edit: Nov 26, 2010, 08:12 pm by DanDare Reason: 1
Fala Edson,

Como tinha prometido algum código, então vai lá:

Foi o que eu consegui, gastando o mínimo de espaço mas tenho certeza que é possível economizar mais:

Code: [Select]
const int cancelapin = 10 ;
const int selecionapin = 9 ;
const int navegapin = 8 ;
int opt = 0;
int subopt = 0;
long previousMillis = 0;
String selecopt = "Rotinas normais";

void setup()

{
Serial.begin(9600);
 pinMode(selecionapin, INPUT);
  pinMode(navegapin, INPUT);
    pinMode(cancelapin, INPUT);  
  }

void loop () {
 if(opt == 0) { selecopt = "Rotinas normais"; }
if(digitalRead(navegapin) == HIGH && opt != 7 ) {opt == opt++; delay(200); }
if(digitalRead(navegapin) == HIGH && opt == 7 ) {subopt == subopt++; delay(200); }

if(opt == 1) {  selecopt = "Menu 1"; if(digitalRead(selecionapin) == HIGH) {opt = 7; subopt = 1; delay(200); }   }
if(subopt == 1) {selecopt = "Opcao 1 - Sub Opcao 1" ; chksele(); }
if(subopt == 2) {selecopt = "Opcao 1 - Sub Opcao 2"; chksele();}
if(subopt == 3) {selecopt = "Opcao 1 - Sub Opcao 3" ; chksele();}
if(subopt == 4) {subopt = 1; }

if(opt == 2) {  selecopt = "Opcao Solteira"; chksele(); }

if(opt == 3) {  selecopt = "Menu 2";  if(digitalRead(selecionapin) == HIGH) {opt = 7; subopt = 5; delay(200); } }
if(subopt == 5) {selecopt = "Opcao 2 - Sub Opcao 1" ; chksele(); }
if(subopt == 6) {selecopt = "Opcao 2 - Sub Opcao 2" ; chksele(); }
if(subopt == 7) {subopt = 5 ;}

if(digitalRead(cancelapin) == HIGH) { opt = 0; subopt = 0; }
if(opt == 4) { opt = 1; subopt = 0 ;}

if ( (millis() - previousMillis > 1000)) { previousMillis = millis(); Serial.println(selecopt);  }
}

void chksele () {
  if(digitalRead(selecionapin) == HIGH) {
if(subopt == 1) { Serial.println("Executa Funcao: Opcao 1 - Sub Opcao 1"); opt = 0; subopt = 0; delay(2000) ; selecopt = "FEITO!"; }
if(subopt == 2) { Serial.println("Executa Funcao: Opcao 1 - Sub Opcao 2"); opt = 0; subopt = 0; delay(2000) ; selecopt = "FEITO!"; }
if(subopt == 3) { Serial.println("Executa Funcao: Opcao 1 - Sub Opcao 3");  opt = 0; subopt = 0; delay(2000) ; selecopt = "FEITO!";}
if(opt == 2) { Serial.println("Executa Funcao: Opcao Solteira"); opt = 0; subopt = 0; delay(2000) ; selecopt = "FEITO!";}
if(subopt == 5) { Serial.println("Executa Funcao: Opcao 2 - Sub Opcao 1");  opt = 0; subopt = 0; delay(2000); selecopt = "FEITO!";}
if(subopt == 6) { Serial.println("Executa Funcao: Opcao 2 - Sub Opcao 2");  opt = 0; subopt = 0;delay(2000); selecopt = "FEITO!"; }

  }
 
}


Tentei evitar muitas estruturas aninhadas então decidi criar um sistema de índices onde a arvore principal ganha um indice e as arvores secundarias ganham outro indice. Sabendo-se os valores dos dois indices podemos dizer qual menu e sub-opcao esta selecionada. A variavel 'opt' quando igual a 7 (mas pode ser qualquer outro numero que nao esteja sendo usado), serve de controle para saber que estamos mudando opcoes dentro de um mesmo menu. Desta forma fica mais limpo o código bem como menor e fácil de adicionar opcoes se quiser.
O código prevê 3 botoes: navegar nas opcoes; selecionar uma opcao e cancelar a operacao. Quando se aperta selecionar e a opcao for a ultima da linha, então ele executa a funcao desejada.

Não sei se é porque tinha muito tempo que não programava, mais achei que ficou muito grande depois de compilado, deu 5.706 bytes, achei alto pelo numero de linhas de codigo.

No programa é melhor usar CASE ao invés de IF na funcao "chksele", eu apenas to com preguica de reaprender o CASE em C++ agora.

Se for usar isso e conseguir que o codigo fique menor, ou se o seu for menor, posta aí !!

Valeu

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy