[ Resolvido ] Menu na LCD Shield.

Preciso de ajuda, criei o código abaixo que reconhece as teclas e a LCD Shield em si, preciso fazer que as teclas naveguem entre menu, e quando apertar selcionar ele entre no menu e consiga ligar e desligar um relé.
Por Favor me ajudem, quando eu entro na VOID SALA01() por exemplo tem q aparecer uma tela escrita Relé: HIGH dai se a pessoa aperta pra baixo, ou pra cima aparece Relé: LOW e se apertar enter ele volta pro menu inicial com a variável definida, se você deixou selecionado HIGH ele fica HIGH...

Estou a procura de algum dispositivo remoto também, para acionar ao invés das teclas da LCD, eu havia tentado usar um Infra Vermelho, mas não achei aqui na minha cidade pra comprar o receptor...
Se alguém tiver uma idéia...

Outra coisa, tem como salvar no arduino a posição dos relés mesmo q eu desligue ele?

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //use a pinagem de seu arduino
int up;
int down;
int nothing;
int right;
int left;
int enter;
int sel;
int x;
int y;
void setup() {  
lcd.begin(16, 2);
sel = 1;
x = 0;
y = 0;
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 0;


}

  
void loop(){
 

int tecla_valor = analogRead(0);
if (tecla_valor == 1023){
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 1;
}
if (tecla_valor == 0)
{
  right = 1;
}
if ((tecla_valor >= 120) & (tecla_valor <= 146))
{
  up = 1;
}
if ((tecla_valor >= 300) & (tecla_valor <= 350))
{
  down = 1;
}
if ((tecla_valor >= 500) & (tecla_valor <= 530))
{
  left = 1;
}
if ((tecla_valor >= 700) & (tecla_valor <= 790))
{
  enter = 1;
}
delay(250);

if (right == 1){
sel++;
 }
if (left == 1){
sel--;
 }

if (sel<=1){
  sel=1;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Setor:");
  lcd.setCursor(0,1);
  lcd.print("   Sala01 >> ");
       if (enter == 1){
          sala01();
       }
}
if (sel==2){
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Setor:");
  lcd.setCursor(0,1);
  lcd.print(" << Sala02 >> ");
       if (enter == 1){
          sala02();
       }
}
if (sel==3){

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Setor:");
  lcd.setCursor(0,1);
  lcd.print(" << Sala03  ");
       if (enter == 1){
          sala03();
       }
}
}

void sala01(){
  lcd.clear();
  lcd.print("Sala ON");
  delay(3000);
  loop;  
}
void sala02(){
  lcd.clear();
  lcd.print("Sala ON");
  delay(3000);
  loop;  
}
void sala03(){
  lcd.clear();
  lcd.print("Sala ON");
  delay(3000);
  loop;  
}

=========================================================

Amigo... seu código está muito difícil de ler. Por favor, edite seu post e utilize a tag "code"(é o ícone # acima) no seu código.

Tem como gravar coisas persistentes no arduino sim, utilizando a library EEPROM.

Por exemplo:

#include <EEPROM.h>

byte relayState[1];

void setup() {
  relayState[0] = EEPROM.read(0); // Aqui você lê do endereço 0 da EEPROM e joga na variável relayState[0]
}

void loop() {
  // Quando seu botão for apertado e você quiser gravar
  relayState[0] = 1;
  EEPROM.write(0, relayState[0]);
}

quero saber a questão das saidas digitais, como faço pra ligar elas,...
e também como salvo as configurações só quando quiser, tipo acho q da pra fazer uma entrada no menu Salvar Configs, e outra Limpar Configs ambas com voids separadas....

vou tentar...

Não sei se entendi direito o que vc quer dizer com ligar saídas digitais. Se for o que eu entendi, simplesmente coloque um pinMode(2, OUTPUT) no setup() e depois digitalWrite(2, HIGH) ou LOW para liga-la ou desliga-la. A porta 2 do seu arduino vai ser uma porta de saída que vai ligar e desligar apenas.

o salvar e limpar é simples também. faça uma função que vai salvar todas suas variáveis globais(as que são definidas fora de qualquer função) para o EEPROM. Você só vai precisar tomar cuidado com os endereços delas(recomendo utilizar um #define para cada variável com o endereço onde ela vai ser gravada).

tipo tem um menu que você seleciona no meu programa que entra na void, tipo void sala_01, sala_02... dai se eu apertar para os lados ele tem q trocar HIGH/LOW da entrada do relé, depois q eu selecionei ele deve ativar um temporizador e esperar 3s e voltar para o inicial...

mais ou menos assim...
void_sala(){

lcd.printf("Lampada:");
lcd.printf(estado_rele);
if (tecla_cima==1){
if (estado_rele==1){
estado_rele=0;
}
if (estado_rele==0){
estado_rele=0;
}
}
if (tecla_baixo==1){
if (estado_rele==1){
estado_rele=0;
}
if (estado_rele==0){
estado_rele=0;
}
}
if (estado_rele==1){

digitalWrite(RELE,HIGH);
}
if (estado_rele==0){

digitalWrite(RELE,LOW);
}

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //pinagem LCD no Arduino Mega

int up;
int down;
int nothing;
int right;
int left;
int enter;

int sel;
int x;
int y;
int tecla_valor;

boolean rele_sala01;
boolean rele_sala02;
boolean rele_sala03;
void setup() {
lcd.begin(16, 2);
sel = 1;
x = 0;
y = 0;
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 0;
rele_sala01=0;
rele_sala02=0;
rele_sala03=0;

pinMode(31, OUTPUT);
pinMode(32, OUTPUT);
pinMode(33, OUTPUT);

lcd.print(" DHM 0.2 BETA");
delay(3000);
lcd.clear();
lcd.print("Desenvolvido por");
lcd.setCursor(0,1);
lcd.print(" Marcelo Boeira");
delay(3000);
}

void loop(){

int tecla_valor = analogRead(0);
if (tecla_valor == 1023){
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 1;
}
if (tecla_valor == 0)
{
right = 1;
}
if ((tecla_valor >= 120) & (tecla_valor <= 146))
{
up = 1;
}
if ((tecla_valor >= 300) & (tecla_valor <= 350))
{
down = 1;
}
if ((tecla_valor >= 500) & (tecla_valor <= 530))
{
left = 1;
}
if ((tecla_valor >= 700) & (tecla_valor <= 790))
{
enter = 1;
}
delay(250);

if (right == 1){
sel++;
}
if (left == 1){
sel--;
}

if (sel <= 0){
sel=1;
}

if (sel<=1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Sala01 >> ");
lcd.setCursor(0,1);
lcd.print("Estado:");
if (rele_sala01==1)
lcd.print("Ligado");
else
lcd.print("Desligado");
if (enter == 1){
rele_sala01 = !rele_sala01;
delay(100);
}
}
if (sel==2){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" << Sala02 >> ");
lcd.setCursor(0,1);
lcd.print("Estado:");
if (rele_sala02==1)
lcd.print("Ligado");
else
lcd.print("Desligado");

if (enter == 1){
rele_sala02 = !rele_sala02;
delay(100);
}
}

if (sel==3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" << Sala03 ");
lcd.setCursor(0,1);
lcd.print("Estado:");
if (rele_sala03==1)
lcd.print("Ligado");
else
lcd.print("Desligado");

if (enter == 1){
rele_sala03 = !rele_sala03;
delay(100);
}
}

if (rele_sala01==1){
digitalWrite(31, HIGH);
}
if (rele_sala01==0){
digitalWrite(31, LOW);
}
if (rele_sala02==1){
digitalWrite(32, HIGH);
}
if (rele_sala02==0){
digitalWrite(32, LOW);
}
if (rele_sala03==1){
digitalWrite(33, HIGH);
}
if (rele_sala03==0){
digitalWrite(33, LOW);
}
}

Olha seu codigo está muito confuso realmente, acho que você está usando coisa d+ para pouco assunto.
Uma parte que posso te ajudar, são algumas funções que vc pode adaptar e economizar codigo.
Para receber pela serial:

// Recebe sinal serial do Modulo-02 Bluetooth e Rede para controle dos Canais
   if (entradaSerial.available())
   {
     Serial.print((char)entradaSerial.read());
   }
   if (entradaSerial.available())
   {
      recepSerial =(char)entradaSerial.read();
      switch (recepSerial)
      {
         case '1':
           Serial.println();
           Serial.print(recepSerial); 
           alteraEstado(canal1);
           break;
        
      }
   }

FunÇão do Controle Remoto (Você encontra esse receptor em qualquer eletronica, so pedir para TV CCE ou Sony)

// Função que recebe um valor do Controle de IR
   if (irrecv.decode(&results))
   {
     switch(results.value)
     {
         case 16728765:
            CANAL=canal1;
            op=16728765;
            imprimeSerial(1);
            break;
         case 16761405:
            CANAL=canal2;
            op=16761405;
            break;
         case 16773135:
            CANAL=canal3;
            op=16773135;
            break;
         case 16742535:
            CANAL=canal4;
            op=16742535;
            break;
         case 16716015:
            if(tempo!=0)
            {
              tempo=0;
            }else
            {
              tempo=1;
            }            
            op=16716015;
            break;
         default:
            op=0;
            break;
     }
     if(results.value==op)
     {
       alteraEstado(CANAL);  
     }
     irrecv.resume(); // Receive the next value

Função que muda o estado de uma pino/canal

void alteraEstado(int canal)
{
       // Recebe qual canal será alterado
       CANAL=canal;
       if(digitalRead(CANAL)==LOW)
       {
         digitalWrite(CANAL,HIGH);
       }else
       {
         digitalWrite(CANAL,LOW);
       } 
}
/*
##########################################
########### Projeto DHM v0.4 #############
#### Beta RLS000100(Versão Funcional) ####
#### Desenvolvido Por Marcelo Boeira  ####
#### Baseado nas Licenças GLP         #### 
#### OpenSource Livre de Cópias       ####
#### N?o Retire os Créditos           ####
#### Mais Info: mboeira.blogspot.com  ####
##########################################
##########################################
########  Status do Projeto:  ############
#### Acionamento Por Bluetooth:    0% ####
#### Acionamento Por InfraVermelho:0% ####
#### Acionamento Por Radio:      100% ####
#### Leitura Digital das Teclas: 100% ####
#### Menus LCD Shield:           100% ####
#### Controle de Relés:          100% ####
########################################## 
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //pinagem LCD no Arduino Mega
int up;
int down;
int nothing;
int right;
int left;
int enter;
int sel; 
int x;
int y; 
int tecla_valor;
boolean rele_sala01;
boolean rele_sala02;
boolean rele_sala03;
boolean rele_sala04;
boolean rele_sala05;
boolean rele_sala06;


void setup() {  
  lcd.begin(16, 2); 
  sel = 1; 
  x = 0; 
  y = 0; 
  up = 0;
  down = 0;
  right = 0;
  left = 0;  
  enter = 0;
  nothing = 0;
  rele_sala01=0;
  rele_sala02=0;
  rele_sala03=0;  
  rele_sala04=0;
  rele_sala05=0;
  rele_sala06=0;
  pinMode(22, INPUT);
  pinMode(23, INPUT);
  pinMode(31, OUTPUT);
  pinMode(32, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(34, OUTPUT);
  pinMode(35, OUTPUT);
  pinMode(36, OUTPUT);
  //~Inicia Apresentação do Projeto
  lcd.print("  DHM 0.4 BETA");
  delay(3000);
  lcd.clear();
  lcd.print("Desenvolvido por");
  lcd.setCursor(0,1);
  lcd.print(" Marcelo Boeira");
  delay(3000);
}  
void loop(){
  int tecla_valor = analogRead(0);
  if (tecla_valor == 1023){
     up = 0;
     down = 0;
     right = 0;
     left = 0;
     enter = 0;
     nothing = 1;
  }
  enter = digitalRead(23);
  right = digitalRead(22);


  if (tecla_valor == 0){
     right = 1;
   }
  if ((tecla_valor >= 120) & (tecla_valor <= 146)){
     up = 1;
  }
  if ((tecla_valor >= 300) & (tecla_valor <= 350)){
     down = 1;
  }
  if ((tecla_valor >= 500) & (tecla_valor <= 530)){
     left = 1;
  }
  if ((tecla_valor >= 700) & (tecla_valor <= 790))
  {
     enter = 1;
  }
  delay(250);
  if (right == 1){
     sel++;
  }
  if (left == 1){
     sel--;
  }
  if (sel <= 0){
     sel=1;
  }   
  if (sel==7){
    sel=1;
  }
  if (sel<=1){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("     Sala01 >> ");
    lcd.setCursor(0,1);
    lcd.print("Estado:");
    if (rele_sala01==1)
       lcd.print("Ligado");
    else
       lcd.print("Desligado");
    if (enter == 1){
       rele_sala01 = !rele_sala01;
       delay(100);
    }        
  }
  if (sel==2){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("     Sala02 >> ");
     lcd.setCursor(0,1);
     lcd.print("Estado:");
     if (rele_sala02==1)
        lcd.print("Ligado");
     else
        lcd.print("Desligado");
     if (enter == 1){
         rele_sala02 = !rele_sala02;
         delay(100);
      }        
 }
  if (sel==3){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("     Sala03 >> ");
     lcd.setCursor(0,1);
     lcd.print("Estado:");
     if (rele_sala03==1)
        lcd.print("Ligado");
     else
        lcd.print("Desligado");
     if (enter == 1){
         rele_sala03 = !rele_sala03;
         delay(100);
      }
  }
  if (sel==4){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("     Sala04 >> ");
     lcd.setCursor(0,1);
     lcd.print("Estado:");
     if (rele_sala04==1)
        lcd.print("Ligado");
     else
        lcd.print("Desligado");
      if (enter == 1){
         rele_sala04 = !rele_sala04;
         delay(100);
      }
  }
  if (sel==5){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("     Sala05 >> ");
     lcd.setCursor(0,1);
     lcd.print("Estado:");
     if (rele_sala05==1)
        lcd.print("Ligado");
     else
        lcd.print("Desligado");
     if (enter == 1){
         rele_sala05 = !rele_sala05;
         delay(100);
      }
  }

   if (sel==6){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("     Sala06 >> ");
     lcd.setCursor(0,1);
     lcd.print("Estado:");
     if (rele_sala06==1)
        lcd.print("Ligado");
     else
        lcd.print("Desligado");
     if (enter == 1){
         rele_sala06 = !rele_sala06;
         delay(100);
      }
    }
  if (rele_sala01==1){
     digitalWrite(31, HIGH);
  }
  if (rele_sala01==0){
     digitalWrite(31, LOW);
  }
  if (rele_sala02==1){
     digitalWrite(32, HIGH);
  }
  if (rele_sala02==0){
     digitalWrite(32, LOW);
  }
  if (rele_sala03==1){
     digitalWrite(33, HIGH);
  }
  if (rele_sala03==0){
     digitalWrite(33, LOW);
  }
  if (rele_sala04==1){
     digitalWrite(34, HIGH);
  }
  if (rele_sala04==0){
     digitalWrite(34, LOW);
  }
  if (rele_sala05==1){
     digitalWrite(35, HIGH);
  }
  if (rele_sala05==0){
     digitalWrite(35, LOW);
  }
  if (rele_sala06==1){
     digitalWrite(36, HIGH);
  }
  if (rele_sala06==0){
     digitalWrite(36, LOW);
  }
}