collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: fazer pausa ate que determinada entrada passe a LOW  (Lida 5258 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline xxscorpioxx

  • Mini Robot
  • *
  • Mensagens: 10
fazer pausa ate que determinada entrada passe a LOW
« em: 10 de Agosto de 2012, 10:35 »
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

Offline rsoares

  • Mini Robot
  • *
  • Mensagens: 64
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #1 em: 10 de Agosto de 2012, 11:25 »

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.

Offline xxscorpioxx

  • Mini Robot
  • *
  • Mensagens: 10
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #2 em: 10 de Agosto de 2012, 11:45 »
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.

Offline xxscorpioxx

  • Mini Robot
  • *
  • Mensagens: 10
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #3 em: 10 de Agosto de 2012, 12:06 »
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);
  }


Offline rsoares

  • Mini Robot
  • *
  • Mensagens: 64
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #4 em: 10 de Agosto de 2012, 12:16 »
apaga o else que fica a funcionar.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #5 em: 10 de Agosto de 2012, 12:24 »
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.

Offline xxscorpioxx

  • Mini Robot
  • *
  • Mensagens: 10
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #6 em: 10 de Agosto de 2012, 12:52 »
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

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #7 em: 10 de Agosto de 2012, 12:54 »
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.

Offline rsoares

  • Mini Robot
  • *
  • Mensagens: 64
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #8 em: 10 de Agosto de 2012, 12:54 »
podes apagar o while tambem.

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

Offline xxscorpioxx

  • Mini Robot
  • *
  • Mensagens: 10
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #9 em: 10 de Agosto de 2012, 13:24 »
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

Offline rsoares

  • Mini Robot
  • *
  • Mensagens: 64
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #10 em: 10 de Agosto 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

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #11 em: 10 de Agosto de 2012, 13:38 »
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.

Offline rsoares

  • Mini Robot
  • *
  • Mensagens: 64
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #12 em: 10 de Agosto de 2012, 13:43 »
ou isso, como evito sempre usar os delay´s nem pensei nisso ^^

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #13 em: 10 de Agosto de 2012, 13:45 »
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.

Offline xxscorpioxx

  • Mini Robot
  • *
  • Mensagens: 10
Re: fazer pausa ate que determinada entrada passe a LOW
« Responder #14 em: 12 de Agosto de 2012, 15:55 »
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