Go Down

Topic: Menus + LCD alguem sabe como fazer? (Read 3 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