• Welcome to LusoRobótica - Robótica em Português.
 

fazer pausa ate que determinada entrada passe a LOW

Started by xxscorpioxx, 10 de August de 2012, 10:35

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

xxscorpioxx

Boas sou iniciante no arduino e na programaçao, estou a desenvolver um mecanismo e tenho um microswitch ligado.

o código está assim:

if (digitalRead(switchPin2) == LOW)
  {
  digitalWrite(motortubo, HIGH); // liga o motor
  delay(6000);                  // fica ligado 6segundos
  digitalWrite(motortubo, LOW); // desliga o motor do tubo
  }
  else
{
    digitalWrite(motortubo, LOW); // Aqui é que a porca torce o rabo

  }

preciso que se o switchPin2 estiver HIGH ele fique á espera sem avançar mais o programa até que fique LOW

desde ja agradeço alguma ajuda

rsoares


Se esse bocado de código estiver no loop, o motor vai estar sempre desligado ^^

Antes de mais vê o exemplo do arduino "Blinky without delay" vai-te permitir criar um timer sem teres de parar o micro.


Depois crias uma função fora do loop para fazer a verificação do estado.


se o estado for HIGH não fazer nada se for LOW fazer qualquer coisa.


ou então troca o else por outro if.

xxscorpioxx

vou dar uma vista no "Blinky without delay" mas o meu problema é mesmo esse "se o estado for HIGH não fazer nada se for LOW fazer qualquer coisa."

nao sei que codigo escrever para se o estado for HIGH parar e esperar por tempo indeterminado que fique LOW para continuar a ler o resto do codigo e executar as funçoes seguintes.

xxscorpioxx

Sim esta parte esta no LOOP e o motor nao liga, mas passa á frente e continua a executar o codigo

O que posso por em ELSE para quando o microswitch estiver a dar ordem de HIGH para parar de ler o codigo e esperar que passe a LOW para continuar a a ler o void loop()

esta parte é que está mal

else
{
    digitalWrite(motortubo, LOW);
  }


rsoares


Pedrock

Como já disseram acima podes tirar o else.
Se queres mesmo que fique parado, caso tenhas mais código abaixo, podes usar isto, embora não seja a melhor solução, é fácil:
while(digitalRead(switchPin2) == HIGH) { } //Podes fazer alguma coisa ou deixar em branco. Enquanto for HIGH repete sempre, não saindo do loop até que fique LOW.

xxscorpioxx

Resolvido, funciona na perfeição ;D

Ficou assim

while(digitalRead(switchPin2) == HIGH) { }
  if (digitalRead(switchPin2) == LOW)
  {
  digitalWrite(motortubo, HIGH); // liga o motor do tubo
  delay(6000);                  // fica ligado 6segundos
  digitalWrite(motortubo, LOW); // desliga o motor do tubo
  }

resumindo adicionei a linha que o Pedrock postou, e apaguei o ELSE como o rsoares disse.

obrigado a todos

Pedrock

Quote from: xxscorpioxx on 10 de August de 2012, 12:52
while(digitalRead(switchPin2) == HIGH) { }
  if (digitalRead(switchPin2) == LOW)
  {
  digitalWrite(motortubo, HIGH); // liga o motor do tubo
  delay(6000);                  // fica ligado 6segundos
  digitalWrite(motortubo, LOW); // desliga o motor do tubo
  }

Tira o while que funciona na mesma, se só tens esse código.

rsoares

podes apagar o while tambem.

  o if so é activo quando o pino esta em LOW, sempre que estiver HIGH não faz nada.

xxscorpioxx

Tenho mais codigo, é esse while, que faz parar e ficar á espera que o pin mude de estado para continuar a ler o resto do programa.

Aproveitando o topico, tenho outra situaçao que ainda nao sei bem como resolver, passo a explicar:

tenho outro motor que vai trabalhar e empurrar uma coisa ate bater num micro switch, quando bater no micro o motor vai parar e passar para a instruçao seguinte, mas o que preciso é que se o motor demorar mais de 10 segundos a activar o microswitch inverta a posiçao e trabalhe dois segundos invertido e depois desses 2 segundos volte a trabalhar normalmente ate bater no micro, na parte eletronica está tudo a funcionar, usei um L293D.

o codigo que tenho escrito é este:

digitalWrite(enablePin, HIGH); // Vai ligar o motor
  if (digitalRead(switchPin) == HIGH) {
    digitalWrite(motor1Pin1, LOW);   // set pin 2 on L293D low
    digitalWrite(motor1Pin2, HIGH);  // set pin 7 on L293D high
  }
  // if the switch is low, motor will turn in the opposite direction:
  else //caso contrário:
{
    digitalWrite(motor1Pin1, HIGH);  // set pin 2 on L293D high
    digitalWrite(motor1Pin2, LOW);   // set pin 7 on L293D low
    delay(10000); // espera 10 segundos antes de desligar o motor
    digitalWrite(enablePin, LOW); // Vai desligar o motor

esta parte "if (digitalRead(switchPin) == HIGH)" é para testes, para poder inverter a rotaçao do motor manualmente, mas é para substituir por codigo que o faça automaticamente caso um microswitch nao seja activado no espaço de 10 seguntos, se nao activar o micro inverte o motor 2 sec, inverte novamente e tenta mais 10 segundos ou até activar o micro para continuar com o codigo.

obrigado

rsoares

usa outro while ^^

int timer1 = 0;
int timer2 = 0;

while(micro == off)
{
timer++;

if(timer1 >= 10000)
{
andar para tras;
timer2++;
if(timer2 >= 2000)
{
andar para frente
}
}
}


pseudo codigo.
atenção que o timer1 e timer2 não vai reflectir em segundos, ou seja 10000 não são 10segundos, para fazer isso tinhas de usar a função milis() para cria timers

Pedrock

Quote from: rsoares on 10 de August de 2012, 13:35
usa outro while ^^

int timer1 = 0;
int timer2 = 0;

while(micro == off)
{
timer++;

if(timer1 >= 10000)
{
andar para tras;
timer2++;
if(timer2 >= 2000)
{
andar para frente
}
}
}


pseudo codigo.
atenção que o timer1 e timer2 não vai reflectir em segundos, ou seja 10000 não são 10segundos, para fazer isso tinhas de usar a função milis() para cria timers
Se adicionares "delay(1);" no fim os timers já contam milisegundos.

rsoares

ou isso, como evito sempre usar os delay´s nem pensei nisso ^^

Pedrock

Quote from: rsoares on 10 de August de 2012, 13:43
ou isso, como evito sempre usar os delay´s nem pensei nisso ^^
É verdade, os delays não são a melhor solução. Mas numa coisa simples, em que não tenhas que fazer várias coisas ao mesmo tempo, é mais fácil.

xxscorpioxx

Tenho estado ocupado e so agora pude olhar com olhos de ver para isto, mas nao vejo muito hehehe, sou cego na materia, estive a fazer umas esperiencias e ainda nao consegui que o arduino fizesse a verificaçao sem dar erro, tambem deve ser do sono, ja lá vao 26h sem dormir e a vista começa a pesar e os neuronios tambem ja nao funcionam direito  :P

o microswitch que vai parar o processo de andar para traz e para a frente é ( int switchPin)

ok ok, agora a ler o codigo para escrever aqui acho que percebi melhor a situação, nao vou alongar a conversa, amanha tento que é a tentar que se aprende, depois deixo o feedback.

Mais uma vez obrigado pela vossa ajuda