Ola galera, estou com um problema que há semanas não consigo resolver, por favor se alguem puder me ajudar, gostaria de colocar um botão para voltar ao menu principal dentro das funções          void subMenu4_1(), void subMenu4_2(), void subMenu4_3(), mas aparenta que a função while(1) não permite, tentei de tudo, agradeço muito a ajuda, segue abaixo o codigo.

#include <LiquidCrystal.h> //Biblioteca para o display LCD

// --- Mapeamento de Hardware ---
#define butUp 12 //Botão para selecionar tela acima no digital 12
#define butDown 11 //Botão para selecionar tela abaixo no digital 11
#define butP 13 //Botão de ajuste mais no digital 10
#define butM 9 //Botão de ajuste menos no digital 9
#define select 8 //Botão de seleção no digital 8
#define Lamp1 A0 //Saída para lâmpada 1 no A0 (será usado como digital)
#define Lamp2 A1 //Saída para lâmpada 2 no A1 (será usado como digital)

// --- Protótipo das Funções Auxiliares ---

void changeMenu(); //Função para modificar o menu atual

void dispMenu(); //Função para mostrar o menu atual
void data_hora(); //Função do menu1, data e hora
void temperatura(); //Função do menu2, temperatura
void lights(); //Função do menu3, acionamento de lampadas
void menu4(); //Função do menu4

void dispSubMenu4(); //Função do sub menu4
void readSelect(char option); //Função de Leitura do botão select para seleção de subMenus
void subMenu4_1(); //Função para subMenu4_1
void subMenu4_2(); //Função para subMenu4_2
void subMenu4_3(); //Função para subMenu4_3


// --- Variáveis Globais ---
char menu = 0x01; //Variável para selecionar o menu
char subMenu4 = 0x01; //Variável para selecionar subMenu no menu4
char set1 = 0x00, set2 = 0x00; //Controle das lâmpadas
boolean t_butUp, t_butDown, t_butP, t_butM, t_select; //Flags para armazenar o estado dos botões

// --- Hardware do LCD ---
LiquidCrystal disp(7, //RS no digital 7
                                                    6, //EN no digital 6
                                                    5, //D4 no digital 5
                                                    4, //D5 no digital 4
                                                    3, //D6 no digital 3
                                                    2); //D7 no digital 2

// --- Configurações Iniciais ---
void setup()

        {
 

            disp.begin(16,2); //Inicializa LCD 16 x 2

//Entrada para os botões (digitais 8 a 12) com pull-ups internos

      pinMode(butUp, INPUT_PULLUP);
      pinMode(butDown, INPUT_PULLUP);
      pinMode(butP, INPUT_PULLUP);
      pinMode(butM, INPUT_PULLUP);
      pinMode(select, INPUT_PULLUP);

        pinMode(Lamp1, OUTPUT); //Configura saída para lâmpada 1
        pinMode(Lamp2, OUTPUT); //Configura saída para lâmpara 2

    t_butUp = 0x00; //limpa flag do botão Up
    t_butDown = 0x00; //limpa flag do botão Down
    t_butP = 0x00; //limpa flag do botão P
    t_butM = 0x00; //limpa flag do botão M
    t_select = 0x00; //limpa flag do botão select

       digitalWrite(Lamp1, LOW); //Lâmpada 1 inicia apagada
       digitalWrite(Lamp2, LOW); //Lâmpada 2 inicia apagada


   

      } //end setup

// --- Loop Infinito ---
void loop()
   

        {


           changeMenu();
           dispMenu();

   

   } //end loop

// --- Desenvolvimento das Funções Auxiliares ---
void changeMenu() //Modifica o menu atual
     

           {

                     if(!digitalRead(butUp)) t_butUp = 0x01; //Botão Up pressionado? Seta flag
                     if(!digitalRead(butDown)) t_butDown = 0x01; //Botão Down pressionado? Seta flag

                     if(digitalRead(butUp) && t_butUp) //Botão Up solto e flag setada?
 

        { //Sim...

                    t_butUp = 0x00; //Limpa flag

                    disp.clear(); //Limpa display
                    menu++; //Incrementa menu

                   if(menu > 0x04) menu = 0x01; //Se menu maior que 4, volta a ser 1

   

   } //end butUp

     

                    if(digitalRead(butDown) && t_butDown) //Botão Down solto e flag setada?
 

    { //Sim...

                    t_butDown = 0x00; //Limpa flag

                   disp.clear(); //Limpa display
                   menu--; //Decrementa menu

                   if(menu < 0x01) menu = 0x04; //Se menu menor que 1, volta a ser 4

   

         } //end butDown

 

   } //end changeMenu

void dispMenu() //Mostra o menu atual

     {

                    switch(menu) //Controle da variável menu
   {

                 case 0x01: //Caso 1
                   

                       data_hora(); //Chama a função de relógio

                              break; //break
                 

                 case 0x02: //Caso 2
                   

                       temperatura(); //Chama a função do termômetro

                              break; //break
                 

                 case 0x03: //Caso 3
                     

                      lights(); //Chama função para acionamento de lâmpadas

                              break; //break
                 

                  case 0x04: //Caso 4

                      menu4(); //Chama função para o menu4

                              break; //break

          } //end switch menu

  } //end dispMenu

void data_hora() //Data e Hora (menu1)
     

     {

              disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
           

              disp.print("Data e Hora"); //Imprime mensagem
   

              disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2

// Desenvolver uma função de data e hora...

                disp.print("27/08/15 15:14"); //Mostrador (apenas ilustrativo......)

    } //end data_hora

void temperatura() //Temperatura (menu2)
{
                 disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
               

                 disp.print("Temperatura"); //Imprime mensagem

     

                 disp.setCursor(1,1); //Posiciona cursor na coluna 2, linha 2

                 disp.print("25 Celsius"); //Mostrador (apenas ilustrativo......)

     } //end temperatura()

void lights() //Acionamento de lâmpadas (menu3)

   

      {

                  disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1

 

                  disp.print("Acionar Lampadas"); //Imprime mensagem do menu 3


                  if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag

                  if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag

                     if(digitalRead(butP) && t_butP) //Botão P solto e flag setada?
     { //Sim...

                    t_butP = 0x00; //Limpa flag

                    set1++; //Incrementa set1

                    if(set1 > 2) set1 = 0x01; //Se maior que 2, volta a ser 1

        switch(set1) //Controle do set1
   {

                 case 0x01: //Caso 1

                            disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2

                         

                            disp.print("L1 on "); //Imprime mensagem

         

                            digitalWrite(Lamp1, HIGH); //Liga lâmpada 1
                         

                                             break; //Break

                  case 0x02: //Caso 2

                          disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2

                          disp.print("L1 off"); //Imprime mensagem

                          digitalWrite(Lamp1, LOW); //Desliga lâmpada 1
       

                                              break; //Break

             } //end switch set1

     } //end butP

                             if(digitalRead(butM) && t_butM) //Botão D solto e flag setada?

          { //Sim...

                                   t_butM = 0x00; //Limpa flag

                                   set2++; //Incrementa set2

                             if(set2 > 2) set2 = 0x01; //Se maior que 2, volta a ser 1

                      switch(set2) //Controle do set2
   

          {

                  case 0x01: //Caso 1

                                     disp.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2

                                      disp.print("L2 on "); //Imprime mensagem

                                       digitalWrite(Lamp2, HIGH); //Liga lâmpada 2
 

                                                        break; //Break

                  case 0x02: //Caso 2

                                       disp.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2

                                       disp.print("L2 off"); //Imprime mensagem

                                      digitalWrite(Lamp2, LOW); //Liga lâmpada 1

                                                         break; //Break

                 } //end switch set1

           } //end butM


     } //end lights

void menu4() //Função genérica para um quarto menu...

          {

                                         disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1

                                          disp.print("Menu 4"); //Imprime mensagem

                                          dispSubMenu4();

 

             } //end menu4

void dispSubMenu4() //Mostra o sub menu atual para o menu 4

          {

                                           if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag
     

                                           if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag

                                           if(digitalRead(butP) && t_butP) //Botão P solto e flag setada?

       { //Sim...

                                            t_butP = 0x00; //Limpa flag

                                            subMenu4++; //incrementa subMenu4

                                           if(subMenu4 > 3) subMenu4 = 0x01; //se maior que 3, volta a ser 1


    } //end butP

                                             if(digitalRead(butM) && t_butM) //Botão D solto e flag setada?
   

       { //Sim...

                                            t_butM = 0x00; //Limpa flag

                                            subMenu4--; //decrementa subMenu4

                                            if(subMenu4 < 1) subMenu4 = 0x03; //se menor que 1, volta a ser 3



     } //end butM



                                           switch(subMenu4) //Controle da variável subMenu

             {

                           case 0x01: //Caso 1

                                            disp.setCursor(1,1); //Posiciona cursor na coluna 2, linha 2

                                            disp.print("Sub Menu 01");
                                            readSelect(1); //Lê botão select com parâmetro 1

                                                                  break; //break
   

                        case 0x02: //Caso 2

                                           disp.setCursor(1,1); //Posiciona cursor na coluna 2, linha 2

                                           disp.print("Sub Menu 02");

                                            readSelect(2); //Lê botão select com parâmetro 2

                                                                  break; //break

                          case 0x03: //Caso 2

                                           disp.setCursor(1,1); //Posiciona cursor na coluna 2, linha 2

                                          disp.print("Sub Menu 03");

                                           readSelect(3); //Lê botão select com parâmetro 3

                                                                   break; //break


             } //end switch menu

   

     } //end dispMenu


void readSelect(char option) //Leitura do botão select para seleção de subMenus

            {

                                   if(!digitalRead(select)) t_select = 0x01; //Botão select pressionado? Seta flag


                                   if(digitalRead(select) && t_select) //Botão select solto e flag setada?

        { //Sim...

                                    t_select = 0x00; //Limpa flag

                                   switch(option)
     {

                           case 0x01: subMenu4_1(); break;

                           case 0x02: subMenu4_2(); break;

                           case 0x03: subMenu4_3(); break;

                 } //end switch option

           } //end if


    } //end readSelect


void subMenu4_1()

   {

                 while(1)

     {

                                disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1

                                disp.print("Tarefa 1"); //Imprime mensagem

                                disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2

                                disp.print("Em funcionamento"); //Mostrador (apenas ilustrativo......)

                  }

        } //end subMenu4_1


void subMenu4_2()

            {

                        while(1)

            {

                                          disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1

                                          disp.print("Tarefa 2"); //Imprime mensagem

                                          disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2

                                          disp.print("Em funcionamento"); //Mostrador (apenas ilustrativo......)

                   }

       } //end subMenu4_2


void subMenu4_3()

         {

                                   while(1)

           {

                                          disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1

                                         disp.print("Tarefa 3"); //Imprime mensagem

                                          disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2

                                          disp.print("Em funcionamento"); //Mostrador (apenas ilustrativo......)
     

                 }

   

  } //end subMenu4_3

Exibições: 663

Responder esta

Respostas a este tópico

Muito obrigado Teodoro, estou pesquisando não encontrei muitas coisas sobre maquina de estados, gostaria muito se existisse um modo de manter a logica dos menus e submenus do código, ajudaria muito, muito, muito.

Olá Ricardo, seu código ficou uma bagunça aqui, coloque ele num bloco de notas, seila... em fim, voce esta usando dois botoes para selecionar os menus correto? Tem como adicionar outro botão? o terceiro voltaria ao menu principal que eu não entendi qual fução ele faz parte, talvez fique assim:

if(!digitalRead(butUp)) t_butUp = 0x01; //Botao para mudar os menus

if(!digitalRead(butDown)) t_butDown = 0x01; //Botão para mudar os menus

if(!digitalRead(butprincipal)) t_butPrincipal = 0x01;// Botão principal que retorna ao menu principal

if(digitalRead(butUp) && t_butUp) //Botão butPrincipal solto e flag setada?

        { //Sim...

                   t_butPrincipal = 0x00; //Limpa flag

                    disp.clear(); //Limpa display
                    menu = 0x05; //Incrementa menu
                   if(menu > 0x05) menu = 0x01; //Se menu maior que 4, volta a ser 1  

   } //end butPrincipal

Ai vem o switch(menu) --> Então quando menu for igual a 0x05 entra na sua função principal e quando voce apertar para incrementar Menu volta a ser 0x01 e decrementar retorna a 0x04.

Estuda isso ai e ve  se da certo, e se é isso mesmo que voce queria hehe 

Ola Yuri, eu tentei mas não funciona para voltar do void subMenu4_1( ) para a tela inicial, ta o maior desafio para mim, nao consigui, estou noites sem dormir, vou colocar o codigo pra vc ver melhor pq eu postei bagunçado, se vc conseguir dar uma olhadinha e puder dizer onde erro, por favor.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço