Voltar a tela inicial LCD + Menu

Bom Dia a todos!

Estou com uma duvida no meu sketch, meu projeto é de uma estufa automática(para acelerar o desenvolvimento das plantas), na tela “IDLE” ficará apresentando

-------ESTUFA-------
HH:MM DD/MM
TEMP INT TEMP EXT
SOLO: Umido

ao entrar no menu será apresentado as seguintes opções:

ILUMUNACAO
TEMPERATURA
UMIDADE
AJUSTE RELOGIO

Os sub-menus desse menu será o tempo que a iluminação ficará acesa ex: >ILUMINAÇÃO > 24h / 12-12 / 18-6 / 14-10… vários foto períodos pré-defindos.

A TEMPERATURA / UMIDADE será exibido uma tela com mais detalhes que a “IDLE”

A AJUSTE RELÓGIO entra no menu de ajuste… !

Eu consegui fazer o processo de entrar nos menus mas nao consigo sair e voltar a tela “IDLE”, quando consegui ficou a escrita do menu de ILUMINAÇÃO na frente.

Postei metade do cogido pois ele inteiro estava dando “maximum carateres”

Segue o codigo:

/ — Bibliotecas Auxiliares —
#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 butEsquerda 10 //Botão de ajuste mais no digital 10
#define butDireita 9 //Botão de ajuste menos no digital 9
#define select 8 //Botão de seleção no digital 8

// — 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 dispIdle();

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();
void subMenu4_4(); //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_butEsquerda, t_butDireita, 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(20,4); //Inicializa LCD 20 x 4

for(char i=8; i<13; i++) pinMode(i, INPUT_PULLUP); //Entrada para os botões (digitais 8 a 12) com pull-ups internos

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

} //end setup

// — Loop Infinito —
void loop()
{
dispIdle();

} //Final do loop

// — Desenvolvimento das Funções Auxiliares —
void dispIdle()
{
disp.setCursor(0,0);
disp.print("------Plantario-----");
disp.setCursor(0,1);
disp.print(“HH:MM DD/MM”);
disp.setCursor(0,2);
disp.print(“Temp EXT: Temp INT:”);
disp.setCursor(0,3);
disp.print("Umidade Solo: Umido ");

if(!digitalRead(select))   t_select   = 0x01;          //Botão Up pressionado? Seta flag
if(digitalRead(select) && t_select)                    //Botão Up solto e flag setada?
  {                                                    //Sim...
  t_select = 0x00;                                   //Limpa flag
  disp.clear();
  while(1)
  {
  changeMenu();
  dispMenu();
  }
  }

}

void changeMenu() //Modifica o menu atual
{
if(!digitalRead(butUp)) t_butUp = 0x01; //Botão Up 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--;                                           //Decrementa menu
  
  if(menu < 0x01) menu = 0x04;                      //Se menu maior que 1, volta a ser 4

} //end butUp

if(!digitalRead(butDown)) t_butDown = 0x01; //Botão Down pressionado? Seta flag
if(digitalRead(butDown) && t_butDown) //Botão Down solto e flag setada?
{ //Sim…
t_butDown = 0x00; //Limpa flag

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

} //end butDown

} //end changeMenu

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
disp.clear();

    switch(option)
    {
       case 0x01: subMenu4_1(); break;
       
       case 0x02: subMenu4_2(); break;
       
       case 0x03: subMenu4_3(); break;

       case 0x04: subMenu4_4(); break;
    
    } //end switch option

} //end if
}

void dispMenu() //Mostra o menu atual
{
switch(menu) //Controle da variável menu
{
case 0x01: //Caso 1
disp.setCursor(1,0); //Posiciona cursor na coluna 2, linha 2
disp.print(">ILUMINACAO");
disp.setCursor(1,1); //Posiciona cursor na coluna 2, linha 2
disp.print(" TEMPERATURA");
disp.setCursor(1,2); //Posiciona cursor na coluna 2, linha 2
disp.print(" UMIDADE");
disp.setCursor(1,3); //Posiciona cursor na coluna 2, linha 2
disp.print(" AJUSTE RELOGIO");
readSelect(1); //Lê botão select com parâmetro 1

         break;                                     //break

} //end switch menu

} //end dispMenu

void subMenu4_1()
{
while(1)
{
disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
disp.print(“ILUMINACAO”); //Imprime mensagem
disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
disp.print("< 24 HORAS >"); //Mostrador (apenas ilustrativo…)

if(!digitalRead(butEsquerda)) t_butEsquerda = 0x01; //Botão Up pressionado? Seta flag
if(digitalRead(butEsquerda) && t_butEsquerda) //Botão Up solto e flag setada?
{ //Sim…
t_butEsquerda = 0x00;//Limpa flag
disp.clear();
disp.setCursor(0,3);
disp.print(“botao”);

} //end butEsquerda*/
}
} //end subMenu4_1