Olá pessoal

Estou desenvolvendo um projeto que envolve várias coisas, por exemplo verificação de temperatura, umidade, ligar reles, etc.. Eu queria criar um menu no LCD keypad shield, e quando a pessoa selecionar no menu por exemplo temperatura, fosse chamado o void onde esta sendo chamado o sensor de temperatura.

Fazer o menu até consegui, o problema esta em fazer com que quando eu clicar no botão select ele mostre aquele função desejada..

Alguem tem idéia de como fazer esta seleção?

Exibições: 16178

Responder esta

Respostas a este tópico

Eu recomendaria o uso do comando switch.

Josemar,

O negócio, nesse caso, é construir uma máquina de estados, que é o seguinte:

Primeiro, vc define os estados que o seu programa vai ter, exemplo:

#define stLigarRele 0

#define stVtemp      1

#define stVumid      2

etc...

Depois, define-se uma variável para conter o status corrente, iniciando-a com o estado inicial:

int status = stLigarRele;

Aí, no seu loop(), vc faz algo assim:

void loop()

    status=leStatus(); // Função que obtém o comando do menu, dado pelo usuário

    switch(status)

    {

       case stLigarRele:

            ligaRele();   // rotina que liga o relé, que vc vai implementar

            break;

      case stVTemp:

            verificaTemp();

            break;  

    }

}

É isso. Sacou? Sempre pensei em escrever um post sobre isso no meu blog, acho que agora me animei... vai ser o próximo!

Olá, 

Poderia dar um exemplo da função leStatus()?

Estou com dúvidas

Obrigada pela ajuda

Dá uma olhada no meu menu que é acionado com um botão, então é só colocar o valor que vai para cada menu. Em cada aperto ele aciona um buzzer, mas se deixar ligado vi que ele apitava de vez em quando, mas tá fácil de arrumar, olha o codigo:

// CIRINEU FERNANDES

#include <LiquidCrystal.h>

#define BUTTON1 44  // botao led 1

int val = 0;
int state = 5;                 
int old_val = 0;  
int LUZFUNDO = 7;    //

LiquidCrystal lcd(12, 11, 6, 5, 4, 3);


const int buzzerPin = 10;
bool alt=HIGH;

//temperatura

int maxC=0, minC=100, maxF=0, minF=212;
int scale = 1;


void setup() {
       
        lcd.begin(16, 2); //
        pinMode(LUZFUNDO, OUTPUT);         
        analogWrite(LUZFUNDO, 150);           //controla a luz de fundo intensity 0-254
        pinMode(BUTTON1, INPUT);
        inicio();
        buzzer2();
     
        
}
 
void loop() {
       
  int sensor = analogRead(11);
 
  val = digitalRead(BUTTON1);                              
 
 
 
  if ((val == HIGH) && (old_val == LOW)){
    state = state - 1 ;
  }
  old_val = val;  
     
     if (state == 4) {
       
      led2();
      
         }
        if (state == 3) {
           dimmer();
          
         }
        
       if (state == 2) {
       
       potenciometro1(sensor) ;
      
         }
         if (state == 1) {
       
       potenciometro2() ;
       
         }
         if (state == 0) {
       
       temperatura() ;
       state = 5;
       inicio();
         }
           
  }
 
void inicio() {
       
        lcd.setCursor(0,0);
        lcd.print("=TECNOLOGIA= ");
        lcd.setCursor(0,1); // seta para linha 1, ou seja, a linha de baixo
        lcd.print("  BEM-VINDO ! !");
               
          }
void dimmer() {
       
        lcd.setCursor(0,0);
        lcd.print("  DIMMER 12 V   ");
        lcd.setCursor(0,1); // seta para linha 1, ou seja, a linha de baixo
        lcd.print("  VALOR:        ");
        
               
          }           

void led2() {
         //lcd.clear();
         lcd.setCursor(0,0);
         lcd.print(" ESCOLHA A SUA  ");
         lcd.setCursor(0,1);
         lcd.print("    FUNCAO     ");
         
          }
void potenciometro1(int sensor) {
         /*lcd.clear();
         lcd.setCursor(0,0);
         lcd.print(" potenciometro 1  ");
         lcd.setCursor(0,1);
         lcd.print("    valor:     ");*/
         
         lcd.setCursor(0,0);
        int temp = sensor * 0.09765625; // Convert to C
        lcd.print(temp);
        lcd.write(B11011111); // Degree symbol
        lcd.print("C  ");
        if (temp>maxC) {maxC=temp;}
        if (temp<minC) {minC=temp;}
        lcd.setCursor(0,1);
        lcd.print("H=");
        lcd.print(maxC);
        lcd.write(B11011111);
        lcd.print("C L=");
        lcd.print(minC);
        lcd.write(B11011111);
        lcd.print("C  ");
          
        
      
    }
void potenciometro2() {
         //lcd.clear();
         lcd.setCursor(0,0);
         lcd.print(" potenciometro 2  ");
         lcd.setCursor(0,1);
         lcd.print("    valor:     ");
          }
void temperatura() {
         //lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("Val. Temperatura: ");
         lcd.setCursor(0,1);
         lcd.print("    valor:     ");
          }

void buzzer1(){
          digitalWrite(buzzerPin,alt);           
          tone(45,1500,400);
          //tone(45,2999,400);
         // tone(45,1000,400);
          alt = !alt;
          delay(3000);
 
}

void buzzer2(){
          digitalWrite(buzzerPin,alt);           
          tone(45,2999,400);
          tone(45,1000,400);
          alt = !alt;
          delay(1000);
 
}

É por aí, outro exemplo semelhante. Eu só trocaria os ifs pelo switch, e usarei os #define para nomear os estados, o que melhora a legibilidade.

Obrigado a todos pela ajuda.. 

Meu problema esta sendo que estou utilizando um LCD Keypad Shield e não estou conseguindo fazer a definições dos botões, porque ele utiliza a porta A0 para todos os botões, Up, Down, Left, Rigth e select.. 

Fazer o menu e navegar com os botões eu consegui, o que não estou conseguindo é definir o select para quando pressionado ele busque um void, por exemplo.

char tituloMenu[numeroDeMenus][16] = {
"1 Temperatura",
"2 Umidade Ar",
"3 Menu 3",
"4 Menu 4",
"5 Menu 5" };

//Sub-Menu
byte numeroDeSubmenus[numeroDeMenus] = {4,3,2,1,4};

char tituloSubmenu[numeroDeMenus][numeroMaximoDeSubmenus][16] ={

" Submenu >","1.2 Submenu 2","1.3 Submenu 3","1.4 Submenu 4",
" Submenu >","2.2 Submenu 2","2.3 Submenu 3","",
" Submenu >","3.2 Submenu 2","","",
" Submenu ","","","",
" Submenu >","5.2 Submenu 2","5.3 Submenu 3","5.4 Submenu 4"};

int adc_key_val[5] ={
50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int key_in;
int key=-1;
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
unsigned long time;
int x=0;
int y=0;
// Convertimos el valor leido en analogico en un numero de boton pulsado
int get_key(unsigned int input)
{
int k;

for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}

if (k >= NUM_KEYS)k = -1; // Error en la lectura
return k;
}

para definir quando o botão é pressionado utilizei

key_in = analogRead(0); // Efetuada a leitura da tecla pressionada
key = get_key(key_in); // Obtido o botão que foi pressionado

if (key != oldkey) // Se a tecla foi pressionada

delay(50);
key_in = analogRead(0); // Efetua nova leitura
key = get_key(key_in); // Obtido o botão que foi pressionado
if (key != oldkey);

e para definir qual dos botões:

void CheckButton(){
if (key == 2){ // Aperta para baixo
x++;
if (x>numeroDeMenus-1) x=numeroDeMenus-1;
y=0;
}
if (key == 0) { // Tecla esquerda
y++;
if (y > numeroDeSubmenus[x]-1) y=numeroDeSubmenus[x]-1;

}
if (key == 3) { // Tecla da direita
y--;
if (y < 0) y=0;
}
if (key == 1) { // Tecla de cima
x--;
if (x<0) x=0;
y=0;
}
if (key == 4){ // Selection
}
}

O que eu quero é por exemplo, Menu 1, da temperatura, se eu apertar o botão select ele chame o void onde declarei a temperatura..

 

Tem uma biblioteca chamada Menu.

Ela é direcionada especificamente para LCDs 16x2, então fica fácil a sua utilização.

É uma solução. Já utilizei em testes sem problemas.

http://playground.arduino.cc/Code/Menu

Fala brother... Blz!?

Dá uma olhada no vídeo do Wagner Rambo no link:

https://www.youtube.com/watch?v=Swr2Q1IFiBM&t=932s

Com certeza vc vai gostar do que vai ver!!!

Abraço amigo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço