Go Down

Topic: fazer pausa ate que determinada entrada passe a LOW (Read 828 times) previous topic - next 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

HugoPT

#1
Aug 10, 2012, 12:48 pm Last Edit: Aug 10, 2012, 12:54 pm by HugoPT Reason: 1
Podes usar um while(switchPin2){};
Quando o pino estiver alto a avaliaçao que o while fará sera verdadeira e entrara dentro do while e so saira ate que seja falso.Desta forma penso que fara o que queres
Code: [Select]

while(switchPin2){};//Nao faz nada se entrar neste loop
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

 }
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Já agora... e desculpa se o tom não for o mais adequado...

Tira esse delay() daí. Isso é uma má prática. (pensando nisso, acho que talvez valha a pena fazer um tutorial sobre porque não usar um delay. :\

Se quiseres atingir o mesmo resultado, faz assim:

Code: [Select]

unsigned long now=0, then=0;

while(digitalRead(switchPin2) == HIGH);//Nao faz nada se entrar neste loop
if (digitalRead(switchPin2) == LOW)
  {
  digitalWrite(motortubo, HIGH); // liga o motor
  then = millis();
  }
now = millis();
if ((now - then) > 6000) {
  digitalWrite(motortubo, LOW); // desliga o motor do tubo
  }



Assim o teu código não fica "preso" naquele delay.
Reparei que tens outro problema com a porca... mas não percebi o que era. No entanto, isso pode ser resolvido na nova condicão que coloquei.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

xxscorpioxx

tentei o que o HugoPT disse e nao resultou, ficava parado nessa parte, mesmo que o switchPin2 passase a LOW, nao andava mais, faltava á frente o == HIGH.

De momento 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 while(digitalRead(switchPin2) == HIGH) { }, e apaguei o ELSE .

Bubulindo, mais tarde coloco o codigo como postaste e depois deixo feedback, sou muito novato nisto mas já li por ai que nao se deve usar o DELAY, mas não percebi o porquê,  :smiley-eek:

obrigado a todos

bubulindo

o que o HugoPT falha porque, como vês no meu código, a variável switchpin nunca é actualizada. Ou seja;

Code: [Select]

while(switchPin2){};//mas não tens funcão nenhuma para mudar o estado de switchpin2... para isso terias de fazer while(digitalRead(switchPin2));
if (digitalRead(switchPin2) == LOW) //aqui já alteras o estado da variável, mas nunca entras aqui se a variável não mudar de estado na linha anterior.


Vê o comentário.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up