Olá boa noite a todos....

Gostaria de saber como faço para interromper um delay no seguinte contexto:

* Estou fazendo um projeto simples no qual quero acionar um led por 10 segundos, o comando para acionamento desse led vem via IR de um controle remoto, bom até aí blza o programa já funciona hj da seguinte maneira...

#define ledliga 12


#include <IRremote.h>

int RECV_PIN = 9;

IRrecv irrecv(RECV_PIN);
decode_results results;

int armazenaValor;

void setup()
{
irrecv.enableIRIn();
pinMode(ledliga, OUTPUT);
}

void loop()
{
if (irrecv.decode(&results))
{
armazenaValor = (results.value);
setorIR();
}
}

void setorIR()
{
switch (armazenaValor)
{
case 0xFF30CF:
digitalWrite(ledliga, HIGH);
delay(10000);

break;

case 0xFF18E7:
digitalWrite(ledliga, LOW);
break;

}
armazenaValor = 0;
irrecv.resume(); //Le o próximo valor
}

porém quando eu ligo o led o programa não consegue mais receber comandos IR até os 10 segundos do delay acabar...Mas preciso que eu possa apagar o led antes dos 10 segundos.... poderia simplesmente retirar o delay(10000), mais não posso retirar os 10 segundos porque o código continua e é grande... só coloquei essa parte de exemplo para simplificar....

Valeu pessoal... Obrigado mais uma vez.....

Exibições: 1984

Responder esta

Respostas a este tópico

uma soluçao seria vc usar a funçao millis visto q o delay para a programaçao ate completar o seu tempo

Olá, boa noite obrigado por sua resposta,,,, Eu estava lendo sobre isso, mas como eu faria isso.... porque a ação está dentro de um "void"? pode me ajudar ?

long tempodeterminado = 10000;

long tempoanterior;

unsigned long tempoatual = millis();

if (tempo atual - tempoanterior > tempodeterminado)

{

digitalWrite(ledliga, LOW);

tempoatual = tempo anterior;

}

é isso...???

valeu obrigado....

antes do setup:

unsigned long tempo = 0;

dentro do case:

{
switch (armazenaValor)
{
case 0xFF30CF:

digitalWrite(ledliga,HIGH);
tempo = millis();

if(millis() - tempo > 10000)

{

tempo = millis();

digitalWrite(ledliga,LOW);

}

break;

Valeu muito obrigado.. no código pequeno funcionou muito bem... vou adaptar no novo código... tão simples e eu não conseguia perceber... acho que to com sono... 

obrigado.

Tente usar

void setup() {
 

  pinMode(3,OUTPUT); // LED QUE VC DEFINIU SAIDO

pinMode(12, INPUT);// botão que vc definiu para ligar o led 3

digitalWrite(12,1); // Bite para ficar acionado em nível lógico alto 5v


  pinMode(13, INPUT);// pino relacionado ao botão porta de entrada escolhi a porta numero 13 PARA INTERROMPER O LED QUE VC QUER
  digitalWrite(13, 1);
 pinMode(8, OUTPUT);// led que vc quer interomper

no void loop tente usar

int leitura = digitalRead(13); //porta acionada
  if(leitura == 0) {// se a operação ocorrer certo acione os seguintes pinos

// depois que acionar o pino numero 13 IRÁ RODAR OS SEGUINTES CÓDIGOS QUE ESTÃO A BAIXO.

digitalWrite(3,0);// O led que vc interromper vai apagar por 1 segundo

delay(10000;

caso use o código tente revisar pois pode ter letra maiúscula e tal, minúscula no lugar errado

fique a vontade de perguntar

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço