Strobo + IR - Ajuda aos feras!

Coloquei um rele numa porta do arduino, um refletor de led, e fiz uma luz estroboscópica com o código do led blink:

void loop() {
digitalWrite(rele, HIGH);
delay(100);
digitalWrite(rele, LOW);}

Até aí, perfeito! Mas resolvi colocar um controle remoto para ligar e desligar. O problema está na parte vermelha do código abaixo. Eu preciso que ele seja repetido até eu pressionar a outra tecla, e do jeito está ele só liga e desliga o refletor uma vez.

#include <IRremote.h>// incluindo a biblioteca do infravermelho
const int RECEBE_PINO = 7; // IR no pino 7 no arduino
int rele = 10;// rele no pino 10
IRrecv ir_recebe(RECEBE_PINO); // declarando a variável do sensor
decode_results codigo_recebido; // resultado

void setup()
{
Serial.begin(9600); //mostra o resultado no computador
ir_recebe.enableIRIn(); // inicia a recepção
pinMode(rele, OUTPUT); //defini led como saída
}

void loop() {
if (ir_recebe.decode(&codigo_recebido)) {//verifica se um codigo foi recebido
if (codigo_recebido.value != 0 ){
Serial.println(codigo_recebido.value, HEX); //mostra no serial o resultado
}

if ((codigo_recebido.value == 0x39C618E7) {// verifica se foi pressionado o numero 1 do controle
digitalWrite(rele, HIGH);
delay(100);
digitalWrite(rele, LOW);
}

if ((codigo_recebido.value == 0x39C658A7) {// verifica se foi pressionado o numero 2 do controle
digitalWrite(rele, LOW);
}

ir_recebe.resume(); // recebe o próximo código
delay(200);
}
}

Como sou iniciante, não sei como resolver. Já tentei com while, mas não deu certo. Peço ajuda!
Obrigado"

Eu faria qualquer coisa assim:

#include <IRremote.h>// incluindo a biblioteca do infravermelho   

const int RECEBE_PINO = 7; // IR no pino 7 no arduino   
int rele = 10;// rele no pino 10   
IRrecv ir_recebe(RECEBE_PINO); // declarando a variável do sensor   
decode_results codigo_recebido; // resultado   

int estado = 0;

void setup()   
{   
  Serial.begin(9600); //mostra o resultado no computador   
  ir_recebe.enableIRIn(); // inicia a recepção   
  pinMode(rele, OUTPUT); //defini led como saída   
}


void loop() {   
  if (ir_recebe.decode(&codigo_recebido)) {//verifica se um codigo foi recebido   
    if (codigo_recebido.value != 0 ){   
      Serial.println(codigo_recebido.value, HEX); //mostra no serial o resultado   
    }   

    if (codigo_recebido.value == 0x39C618E7) {// verifica se foi pressionado o numero 1 do controle   
      estado = 1;
    }

    if (codigo_recebido.value == 0x39C658A7) {// verifica se foi pressionado o numero 2 do controle   
      estado = 0;
    }   

    if (estado == 1) {
      digitalWrite(rele, HIGH);   
      delay(100);
      digitalWrite(rele, LOW);   
    }
    else {
      digitalWrite(rele, LOW);
    }

    ir_recebe.resume(); // recebe o próximo código   
    delay(200);   
  }   
}

CHARLESARDUINO: Do jeito que esta aí ele fica ligado apos receber o comando do CR, passan-se 100 milisegundos e desliga como low. Acho que deveria receber o comando e não ter low. ai voce faz ele receber outro comando do controle, ou seja ---0x39C618E7 para o low.

if ((codigo_recebido.value == 0x39C618E7) {// verifica se foi pressionado o numero 1 do controle digitalWrite(rele, HIGH); if ((codigo_recebido.value == 0x39C618E7 digitalWrite(rele, LOW); }

Então ele vai ter que estar constantemente a carregar no botões do comando para criar o efeito blink (e isto admitindo que ele consegue carregar nos botões com velocidade suficiente - 100ms). Não me parece que esta seja uma solução viável.

Correto, luis. A solução do charles me obrigaria a ficar apertando as teclas do controle para fazer o efeito blink, e esta não é a intenção.

Não tenho forma de testar o código que escrevi anteriormente, mas depois de olhar para ele mais uma vez, chamou-me a atenção uma coisa que talvez não estivesse correcta. Talvez da forma seguinte seja melhor:

#include <IRremote.h>// incluindo a biblioteca do infravermelho   

const int RECEBE_PINO = 7; // IR no pino 7 no arduino   
int rele = 10;// rele no pino 10   
IRrecv ir_recebe(RECEBE_PINO); // declarando a variável do sensor   
decode_results codigo_recebido; // resultado   

int estado = 0;

void setup()   
{   
  Serial.begin(9600); //mostra o resultado no computador   
  ir_recebe.enableIRIn(); // inicia a recepção   
  pinMode(rele, OUTPUT); //defini led como saída   
}


void loop() {   
  if (ir_recebe.decode(&codigo_recebido)) {//verifica se um codigo foi recebido   
    if (codigo_recebido.value != 0 ){   
      Serial.println(codigo_recebido.value, HEX); //mostra no serial o resultado   
    }   

    if (codigo_recebido.value == 0x39C618E7) {// verifica se foi pressionado o numero 1 do controle   
      estado = 1;
    }

    if (codigo_recebido.value == 0x39C658A7) {// verifica se foi pressionado o numero 2 do controle   
      estado = 0;
    }   

    ir_recebe.resume(); // recebe o próximo código   
    delay(200);   
  }

  if (estado == 1) {
    digitalWrite(rele, HIGH);   
    delay(100);
    digitalWrite(rele, LOW);   
  }
  else {
    digitalWrite(rele, LOW);
  }
}

CHARLESARDUINO: }

Acho que uma variável aqui para ir diminuindo ate um valor para desligar a repetição ( talvez essa seria a função do delay que voce pos ali)

if (estado == 1) { digitalWrite(rele, HIGH); digitalWrite(rele, LOW); delay(100);

} else { digitalWrite(rele, LOW); } }

Não percebi como é que isso que diz resolve o problema. Recordo que o problema é:

aecen: (...) Eu preciso que ele seja repetido até eu pressionar a outra tecla, e do jeito está ele só liga e desliga o refletor uma vez. (...)

Obrigado a todos. A solução do luisilva funcionou. Apenas tive que colocar o trecho abaixo fora do loop:

ir_recebe.resume(); // recebe o próximo código
delay(200);