Go Down

Topic: fazer pausa ate que determinada entrada passe a LOW (Read 1 time) 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

hugo007

#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.
This... is a hobby.

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.
This... is a hobby.

Go Up