Interromper o loop e seguir para o seguinte "case" em um "switch"

Bom dia amigos.

Meu Problema é o seguinte. Tenho um servo motor que deve executar alguns movimentos cada vez que um mesmo botão é precionado e solto. Acontece que quando eu crio os "cases" dentro do "switch" o arduino (como é esperado) fica "loopando" o "case" ate que o botão seja pressionado novamente. Preciso de uma solução para que o arduino execute o "case" uma única vez e aguarde um novo toque no botão para executar o case seguinte. Para ficar mais fácil de entender, quero construir uma daquelas caixas teimosas que vi no youtube. Abaixo o código:

#include <Servo.h>
#define Button1 2
Servo motor;
char cont = 0;
boolean flagb1 = 0;

void setup()
{

pinMode(Button1, INPUT);
motor.attach (3);


}//Final setup

void loop()
{
boolean botao1 = digitalRead(Button1);

if( (botao1 == 1) && (flagb1 == 0))
{
flagb1 = 1;
}

if( (botao1 == 0) && (flagb1 == 1))
{
flagb1 = 0;
cont++;
}




rotina(cont);

delay(10);
}//Final loop

void rotina(char rotinaCont)
{
switch(rotinaCont)
{

case 0:

motor.write(0);
delay (500);
motor.write(180);
delay (500);
motor.write(0);       // aqui o arduino deve parar, após
break;                    // o último movimento e aguarda o proximo
                               // clique no botão.
case 1:
motor.write(160);
delay (300);
break;

case 2:
delay (3000);
motor.write(40);
delay(100);
break;

case 3:
motor.write(0);
delay (10);
motor.write(100);
delay (10);
motor.write(0);
delay(300);
break;

case 4:
motor.write(80);
delay(100);
break;

case 5:
motor.write(100);
delay(100);
break;

case 6:
motor.write(120);
delay(100);
cont = 0;
break;
}

}

Exibições: 806

Responder esta

Respostas a este tópico

Cristiano, boa noite.

Ainda etá pendente este caso, ou já resolveu?

Rui

Cristiano, 

testa  este código e dá um feedback.

Rui

#include <Servo.h>
#define Button1 2
Servo motor;
unsigned int cont = 0;
boolean flagb1 = 0;

int flag0 = 0;
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
int flag4 = 0;
int flag5 = 0;
int flag6 = 0;

//--------------------------------------------
void setup()
{
Serial.begin(9600);
pinMode(Button1, INPUT_PULLUP);
motor.attach (3);
}//Final setup
//--------------------------------------------
void loop()
{
boolean botao1 = digitalRead(Button1);
if( (botao1 == 1) && (flagb1 == 0))
{
flagb1 = 1;
}
if( (botao1 == 0) && (flagb1 == 1))
{
flagb1 = 0;
cont++;
}
rotina();
delay(10);
} //Final loop

//--------------------------------
void rotina()
{
Serial.println(cont);
switch(cont)
{
case 0:
if (flag0 == 0)
{
motor.write(0);
delay (500);
motor.write(180);
delay (500);
motor.write(0); // aqui o arduino deve parar, após
flag0 = 1;
}
break; // o último movimento e aguarda o proximo
// clique no botão.
case 1:
if (flag1 == 0)
{
motor.write(160);
delay (300);
flag1 = 1;
}
break;

case 2:
if (flag2 == 0)
{
delay (3000);
motor.write(40);
delay(100);
flag2 = 1;
}
break;

case 3:
if (flag3 == 0)
{
motor.write(0);
delay (10);
motor.write(100);
delay (10);
motor.write(0);
delay(300);
flag3 = 1;
}
break;

case 4:
if (flag4 == 0)
{
motor.write(80);
delay(100);
flag4 = 1;
}
break;

case 5:
if (flag5 == 0)
{
motor.write(100);
delay(100);
flag5 = 1;
}
break;

case 6:
if (flag6 == 0)
{
motor.write(120);
delay(100);
cont = 0;
flag0 = 0;
flag1 = 0;
flag2 = 0;
flag3 = 0;
flag4 = 0;
flag5 = 0;
flag6 = 0;
}
break;
}

}

Rui Viana. Amigo, desculpe a demora no retorno. Acesso pouco a internet.

Funcionou perfeitamente exatamente como eu precisava!!!!

Vou estudar o código que você criou e se eu me perder na lógica vou tornar a perguntar para que eu possa entender seu raciocínio.

Muitíssimo obrigado, de verdade. Sei que para os feras é algo relativamente simples, mas tenho certeza que ao estudar melhor seu código vou conseguir evoluir mais um degrauzinho nos meus conhecimento. Mais uma vez muito obrigado. Forte abraço.

PS.: Em uma corrida rápida de olho já pude perceber que a divisão de cada "case" inicia com o marcador flag em zero e depois seta para um terminando o ciclo. Brilhante. Mesmo se eu tivesse pensado em algo parecido acho que falharia, pois não iria me tocar que o "break" deve ficar fora das chaves da função.

Quando tiver concluído o projeto com a marcenaria e tudo mais eu posto um vídeo. Abraço!! 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço