Boa Noite!

Gostaria de uma força para resolver um problema que estou tendo.

Estou fazendo um programa que quando é apertado um botão chama uma interrupção externa, mas dentro dessa interrupção estou pedido para ligar um led na saída e apos um tempo ele desliga e liga outro led em outra porta.

A questão é como faço um tempo dentro da interrupção?

Já fiz por millis() não consegui já tentei fazer por delay mas não fica bom, alguém tem alguma solução para essas situações?

Muito obrigado pela atenção!

Exibições: 313

Responder esta

Respostas a este tópico

Chefe tente usar duas variáveis de controle, uma para guardar o valor atual da função millis() e a outra para informar que está ativa a checagem.

Tipo assim, quando disparar o evento da interrupção, você guardar o valor atual da função millis() na váriavel:

value_millis = millis();

Depois seta a variável de controle para verdade:

ativo = 1;

Dai dentro método loop você testa se a variável ativo está setado para 1, e se estiver você testa se o valor atual de millis() menos o valor guardado na variável value_millis é maior ou igual ao valor que deseja para desligar o led. Caso seja verdade você desliga o led e seta a variável de control ativo para 0;

void loop(){

  ...

  if ( ativo ){

      if ( millis() - value_millis >= 2000 ){

          digital_write(porta_led, LOW);

          ativo = 0;

      }

  }

}

Pode ter algum erro ai pois escrevi direto aqui sem testar, mais com algumas adequações deve funcionar para o seu caso.

Amigo esse if fica no loop ou dentro da interrupção?

Loop.

Na interrupção você vai apenas guardar o valor atual de millis() e ativar a checagem setando a variavel ativo para 1.

Agora é só a uma ideia, talvez tenha de adequar a sua realidade ai.

Implemente e estude este exemplo, acho que vai a ajudar a entender o conceito.

Abs.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço