[Linguagem C] Erro lógico em menu

E aí galera! Estou enfrentando um erro lógico na função menu() onde preciso ler o estado de 2 botões (um aumenta o valor e o outro diminui) para navegação no switch, só que quando chegar num limite, 1 ou 3, ele tem que retornar ao outro extremo tornando-se assim um loop infinito, ou seja: 1, 2, 3, 1, 2… Com 1 botão ativado ele navega legal, mas com os dois ele dá um erro lógico e não navega de jeito nenhum, alguém poderia observar meus “if” pra saber se há algum problema?
P.S.: O “Do While” está assim pra poder trabalhar mais tranquilo no menu (loop infinito).

Segue link: http://pastebin.com/hjkkLqxs

[code]
const int up_bot = 6; //Botão UP (CIMA)
const int down_bot = 5; //Botão DOWN (BAIXO)

int select = 1;

void setup() {
Serial.begin(9600);

pinMode(up_bot,INPUT);
pinMode(down_bot,INPUT);

}

void loop(){

menu();

}

void menu(){

Serial.println(“MENU”);
delay(5000);

do{
if(digitalRead(up_bot) == LOW){
select++;
if(select > 3){
select = 1;
}
}
if(digitalRead(down_bot) == LOW){
select–;
if(select < 1){
select = 3;
}
}

switch (select){
  case 1:
    Serial.println("MAX temp");

  break;
  
  case 2:
    Serial.println("MIN temp");
  
  break;

  case 3:
    Serial.println("Caso 3");

  break;

  default:
    Serial.println("Error");

  break;

}  

Serial.println(select);
delay(1000);

}while(1>0);

}[/code]

Não sei o que há de errado. Olha essa biblioteca se te interessa http://playground.arduino.cc/Code/Button
olha isso aqui tbm pinMode() as INPUT_PULLUP https://www.arduino.cc/en/Tutorial/DigitalPins

1 curtida

Qual erro? O que quer dizer com “dois botões ativados”? Ativados simultâneamente?

while(1>0), ponha só while(1)

1 curtida

Não os dois pressionados simultaneamente, mas quando comento um “if” o do botão “down” por exemplo e deixo apenas um botão liberado no código ele navega entre as opções perfeitamente, com os 2 “if” ativados mesmo que eu pressione apenas 1 botão ele não navega de forma alguma, como se travasse ou não ‘lesse’ o valor do botão, ou desse um conflito com os 2 botões ativados no code manipulando uma variável só…

Já verificou a parte de hardware? Todas as ligações corretas? Digo porque sua lógica interpreta o que está vindo do hardware.

Posta aqui para a galera dá uma olhada.

Abs

Bom, fiz às cegas aqui, mas tenta isso:

const byte up = 6;
const byte down = 5;
byte select = 1;

void setup()
{
	Serial.begin(9600);
	pinMode(up, INPUT);
	pinMode(down, INPUT);
}

void loop()
{
	Serial.println("MENU");
	delay(5000);
	while(1)
	{
		if (digitalRead(up) == HIGH)
			select++;
		else if (digitalRead(down) == HIGH)
			select--;
		switch(select)
		{
			case 1:
				Serial.println("MAX Temp");
				break;
			case 2:
				Serial.println("MIN Temp");
				break;
			case 3:
				Serial.println("Case 3");
				break;
			default:
				Serial.println("Error");
				break;
		}
		if(select > 3)
			select = 1;
		else if(select < 1)
			select = 3;
                delay(1000);
	}	
}
1 curtida

Olá pessoal! Enfim descobri o erro! Não seria bem um erro e sim uma bela de uma mancada (de minha parte é claro), utilizei basicamente o seguinte tutorial: https://www.arduino.cc/en/Tutorial/Button
Com 1 botão pega que é uma beleza, mas com mais de 1 ou todos entram em conflito (parecido com um curto circuito) e assumem o mesmo valor, ou nenhum pega o só pega se desativar o outro, lembrei-me do meu bom e velho (não tão velho) LCD keypad shield, onde quando o estava manipulando vivia à me perguntar o porque que eu tinha que receber os botões pela porta analógica, eis a questão! Lendo pela porta analógica irei economizar portas (só utilizarei uma para N botões) e dezenas de wires (jumpers/conectores), só aumentando assim na quantidade de resistores que nem são tantos, pulou de 1 para 3.
Eis que deu certo seguindo o seguinte tutorial: http://labdegaragem.com/profiles/blogs/tutorial-como-ler-varios-botoes-atraves-de-uma-unica-entrada-anal
estou utilizando o esquema que vai conectado à porta A5, ainda tive a audácia de implementar uma função HOLD no algorítimo e outros frufrus à mais, creio que esta questão está mais que resolvida, possivelmente irei abrir outro tópico (se não encontrar nenhum material) com dúvidas sobre gravação de alteração de variáveis em tempo de execução.

2 curtidas