Acionamento de dois botões retardo de 0.5s

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

Preciso de uma dica

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

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?

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!

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!

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:

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

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.

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!

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.