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;
}
}
Tags:
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!!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por