collapse

* Links de Robótica

* Posts Recentes

Sensor de corrente AC - alternativas? por jm_araujo
[Hoje às 12:46]


Exercício com osciloscópio e geradores de sinais por edeweld
[Ontem às 23:24]


Rectificação de meia onda com 555 e BT151 por jm_araujo
[Ontem às 16:41]


Ligar um aparelho a 9V com fonte de bancada improvisada! por edeweld
[Ontem às 15:09]


Bootloader com arduino e nhduino uno por edeweld
[Ontem às 00:04]


Dimensionar mosfet por Njay
[27 de Fevereiro de 2017, 18:49]


Qual estação de soldadura indicam? por blabla
[27 de Fevereiro de 2017, 13:09]


Energia limpa. por LVirtual
[27 de Fevereiro de 2017, 12:00]


Ferro de Solda avariado - VTSS4 por edeweld
[27 de Fevereiro de 2017, 02:10]


Será que este pic está protegido contra leitura? por edeweld
[26 de Fevereiro de 2017, 23:16]

Autor Tópico: fazer pausa ate que determinada entrada passe a LOW  (Lida 2078 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