Go Down

Topic: Acionamento de dois botões retardo de 0.5s  (Read 716 times) previous topic - next topic

DiogoFarias

Boa noite

Preciso de uma dica, Necessito de um código que só permita o inicio de uma rotina se dois botoes forem acionados com untervalos de acionamento entre os dois de 0.5s em atendimento a NR12, alguem sabe como fazer ?ou dar uma dica

giova014

Quote
Preciso de uma dica
Poste aqui a sua tentativa (código), nos diga o que faz de diferente do esperado e lhe daremos dicas.
Arduino!!

bubulindo

O que é NR12??

Porquê meio segundo? A maior parte das pessoas não consegue medir esse tempo logo não seria mais simples veres se os dois botões alguma vez foram pressionados ao mesmo tempo?
This... is a hobby.

tecdiego

bubulindo Aqui no link tem uma breve descrição sobre NR12

DiogoFarias usa a função millis() e só deixa rodar a rotina do botão 2 depois que se passar 0,5s do acionamento do botão 1!

bubulindo

#4
Feb 16, 2018, 07:16 am Last Edit: Feb 16, 2018, 07:23 am by bubulindo
bubulindo Aqui no link tem uma breve descrição sobre NR12

DiogoFarias usa a função millis() e só deixa rodar a rotina do botão 2 depois que se passar 0,5s do acionamento do botão 1!
Ahhh, pensava que NR12 seria um chip ou algo assim. Afinal é a directiva máquina do Brasil. eh eh

Essa é a maneira mais fácil e diria até mais segura se a aplicação permitir a espera de meio segundo sem responder.
No entanto ficam aqui as minhas tentativas:

Code: [Select]

unsigned char but1 =0, but2 = 0, prev_but1 =0, prev_but2 = 0;
unsigned long trig1 = 0, trig2 =0;
unsigned char valid = 0;
unsigned char waiting1 = 0, waiting2 = 0;

but1 = digitalRead(pino1);
but2 = digitalRead(pino2);

//ambos os botões mudaram ao mesmo tempo... assume que o estado do botão quando pressionado é alto.
if ((but1 != prev_but1) && (but2 != prev_but2) && but1 = HIGH && but2 == HIGH) {
  valid = 1;
}
if (but1 != prev_but1 && but1 == HIGH ) {
   trig1 = millis();
   waiting1 =1 ;
}

if (but2 != prev_but2 && but2 == HIGH ) {
   trig2 = millis();
   waiting2 =1 ;
}

if (waiting1 == 1) {
  if (but2 != prev_but2 && but2 == HIGH ) valid = 1;
  if (millis() - trig1>=500) {
    waiting1 = 0;
    waiting2 = 0;
  }

}

if (waiting2 == 1) {
  if (but1 != prev_but1 && but1 == HIGH ) valid = 1;
  if (millis() - trig2>=500) {
    waiting1 = 0;
    waiting2 = 0;
  }

}



if (valid == 1) {
  //chama função
  valid = 0;

}
prev_but1 = but1;
prev_but2 = but2;


Assim de repente, parece-me que apanhei todas as hipóteses... mas não compilei sequer, logo terás de testar.

Outra maneira seria

Code: [Select]


unsigned char but1 =0, but2 = 0, prev_but1 =0, prev_but2 = 0;
unsigned long trig1 = 1, trig2 = 1;
long diff = 0;
unsigned char valid = 0;
unsigned char waiting1 = 0, waiting2 = 0;

but1 = digitalRead(pino1);
but2 = digitalRead(pino2);

if (but1 != prev_but1 && but1 == HIGH ) {
   trig1 = millis();
   waiting1 = 1;
}
if (but2 != prev_but2 && but2 == HIGH ) {
   trig2 = millis();
   waiting2 = 1;
}


if (waiting1 == 1 && waiting2 == 1) { //ambas as condições foram encontradas
  diff = trig1 - trig2;
  if (diff<0) diff = diff * -1;//torna isto positivo... pode não ser o mais eficaz.
  if (diff < 500) {
      //activa função.
  }
  trig1 = 0;
  trig2 = 0;
  waiting1 = 0;
  waiting2 = 0;
}
//se apenas um botão foi pressionado, faz reset da temporização ao fim de meio segundo.
if ((millis()-trig1 >= 500 && waiting1 == 1) || (millis()-trig2 >=500 && waiting2 == 1)) {
  trig1 = 0;
  trig2 = 0;
  waiting1 = 0;
  waiting2 = 0;
}



prev_but1 = but1;
prev_but2 = but2;


Não testei esta ultima solução e apesar de me parecer correcta e mais elegante, a condição de reset pode ser optimizada removendo o cálculo da temporização para apenas quando uma das variáveis waiting está a 1 e a outra não.

Eu colocaria isto numa função e se precisas de detectar mais do que um conjunto de botões, meteria como parametro de entrada uma estrutura e por cada um dos pares de botões tinha tudo lá dentro.

Dito isto, e sem saber a legislação brasileira, diria que não vale a pena estares a fazer algo assim com um Arduino. Se vais controlar um processo que necessita que ser conforme com essa regulação em especifico, coloca equipamento industrial a fazer esta parte do processo já que mesmo que a tua aplicação em teoria faça o que a lei diz, em caso de acidente a lei não vai levar o teu dispositivo para um laboratório e testar. Eles vão ver que a máquina tinha um dispositivo de segurança sem certificação e irão atrás da pessoa que lá o colocou.

Eu sei que equipamento industrial é extremamente caro, mas não é apenas porque vem numa caixa bonita, é porque houve imenso trabalho em testes e custos em certificações.
This... is a hobby.

tecdiego

Boa colocação bubulindo, só uso o Arduino em processo onde não a risco de acidentes, no caso do nosso amigo, ele poderia até usar contactoras mesmo!

bubulindo

No que toca a segurança, eu preferiria meter algo de acordo com as normas e existe já bastantes empresas no mercado a fazer isso logo não vale a pena o risco e dores de cabeça.
This... is a hobby.

Go Up