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.....
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por