IRremote só responde uma vez

Caros,

Estou usando o código abaixo para enviar comandos para uma TV Samsung através de um controle genérico. Quando aperto um botão o comando funciona, mas pára de funcionar não respondendo mais a nenhum comando, apenas se eu fizer upload de novo. Alguem pode ajudar? Obrigado!

#include <IRremote.h> // Include the library

int RECV_PIN= 2; //Pin of the receiver
IRrecv irrecv(RECV_PIN); // Start the reciever

decode_results results;
IRsend irsend;

int incomingByte=0;

// just added my own array for the raw signal
unsigned int VolUp[68] = {4600,4350,650,1550,700,1500,700,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,450,700,400,700,400,700,400,700,450,650,450,650,450,650,1550,700,1500,700,1550,700,1500,700,1550,650};
unsigned int VolDown[68] = {4600,4350,700,1550,650,1550,700,1500,700,450,650,450,700,400,700,400,700,400,700,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,650,450,650,1550,700,1500,700,450,650,1550,700,400,700,400,700,450,700,400,700,400,700,400,700,1550,700,400,700,1500,700,1500,700,1550,700,1500,700};
unsigned long last = millis();
void setup(){
Serial.begin(9600);
irrecv.enableIRIn(); // enables the reciver
pinMode (13, OUTPUT);
}

void loop (){

if(irrecv.decode(&results)){
Serial.println(results.value,HEX); // decodes results

//if (Serial.available() > 0){
//incomingByte= Serial.read(); // if i send 1, start isend

//if(incomingByte=‘8054A75C’){
// isend();
if (irrecv.decode(&results)) {
if (millis() - last > 250) {
switch (results.value) {
case 0xFF30CF:

digitalWrite (13, HIGH);
delay (1000);
digitalWrite (13, LOW);
//delay (1000);
isend();
break;
}
}
}
last = millis();
irrecv.resume();
}
// }
// }
}

void isend(){
//delay(100);
//for (int i = 0; i < 3; i++) {
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolUp,68,38);
delay(400);
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolUp,68,38);
delay(400);
irsend.sendRaw(VolUp,68,38);
delay(400);

// }

}

void isend(){
  //delay(100);
  //for (int i = 0; i < 3; i++) {
   irsend.sendRaw(VolDown,68,38);
        delay(400);
   irsend.sendRaw(VolUp,68,38);
        delay(400); 
     irsend.sendRaw(VolDown,68,38);
        delay(400);
     irsend.sendRaw(VolDown,68,38);
        delay(400);
     irsend.sendRaw(VolDown,68,38);
        delay(400);   
        irsend.sendRaw(VolUp,68,38);
        delay(400); 
        irsend.sendRaw(VolUp,68,38);
        delay(400); 
     irrecv.resume();//<<<<<<<<<<<<<<<<<<<<<<<===================================================
               // }
 
}

Thank you AnalysIR, but is still not working. Obrigado, AnalysIR, mas continua não funcionando.

unsigned int VolUp[68] = {4600,4350,650,155...... unsigned int VolUp[67] = {4600,4350,650,155....

irsend.sendRaw(VolDown,68,38); irsend.sendRaw(VolDown,67,38);

Não olhei em detalhes o teu código, mas não percebi o "enableIRIn".

você já executa o comando parra continuar a receber

irrecv.resume(); // Receive the next value

Mas falta após o envio (edit: as AnalysIR said):

irrecv.enableIRIn(); // Re-enable receiver

Sempre que você envia um comando a recepção é interrompida, por isso, após o envio é necessário reativá-la.

+1

irrecv.enableIRIn(); // Re-enable receiver

..that's what I meant in my first post - sorry :cold_sweat:

Então ficaria assim?

void isend(){
//delay(100);
//for (int i = 0; i < 3; i++) {
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolUp,68,38);
delay(400);
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolDown,68,38);
delay(400);
irsend.sendRaw(VolUp,68,38);
delay(400);
irsend.sendRaw(VolUp,68,38);
delay(400);
irrecv.enableIRIn();
// }

}

Sim (yes)

Vamos à algumas dicas:
Quando você já declara o conteúdo de um array você não precisa dizer o tamanho, o compilador cuida disso, portanto você pode escrever VolUp. Como citado pelo AnalysIR, o teu array possui 67 elementos e não 68 (apenas array de char precisa de uma posição adicional para o \0).

você tem esse pedaço duas vezes:if(irrecv.decode(&results)){ por qual motivo?

lendo o teu código não encontrei motivos para a condição:
if (millis() - last > 250) e ela impede que o switch seja executado, sendo esta parte do problema.

revisando o código, me diz se o abaixo funciona (incluindo as dicas do AnalysIR)

#include <IRremote.h> // Include the library

int RECV_PIN= 2; //Pin of the receiver
IRrecv irrecv(RECV_PIN); // Start the reciever

decode_results results; 
IRsend irsend;

int incomingByte=0; 

// just added my own array for the raw signal
unsigned int VolUp[] = {4600,4350,650,1550,700,1500,700,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,450,700,400,700,400,700,400,700,450,650,450,650,450,650,1550,700,1500,700,1550,700,1500,700,1550,650};
unsigned int VolDown[] = {4600,4350,700,1550,650,1550,700,1500,700,450,650,450,700,400,700,400,700,400,700,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,650,450,650,1550,700,1500,700,450,650,1550,700,400,700,400,700,450,700,400,700,400,700,400,700,1550,700,400,700,1500,700,1500,700,1550,700,1500,700};
// unsigned long last = millis();

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn(); // enables the reciver
  pinMode (13, OUTPUT);
}

void loop (){
  if(irrecv.decode(&results)){
    Serial.println(results.value,HEX); // decodes results
    
    //if (Serial.available() > 0){
    //incomingByte= Serial.read(); // if i send 1, start isend
    
    //if(incomingByte='8054A75C'){
    // isend();
    
    //if (irrecv.decode(&results)) { <-- ### por que requisita duas vezes? ###
    //if (millis() - last > 250) { <-- ### Só vai verificar o resultado se tiver passado 250 millis? ###
      switch (results.value) {
        case 0xFF30CF:
        digitalWrite (13, HIGH);
        delay (1000);
        digitalWrite (13, LOW); 
        //delay (1000);
        Serial.println("Firing"); // to help debug
        isend();
        break; 
      }
    //}
    //}
    //last = millis();
    irrecv.resume();
    //}
    //}
  }
}

void isend(){
  //delay(100);
  //for (int i = 0; i < 3; i++) {
    irsend.sendRaw(VolDown,67,38);
    delay(400);
    irsend.sendRaw(VolUp,67,38);
    delay(400);
    irsend.sendRaw(VolDown,67,38);
    delay(400);
    irsend.sendRaw(VolDown,67,38);
    delay(400);
    irsend.sendRaw(VolDown,67,38);
    delay(400);
    irsend.sendRaw(VolUp,67,38);
    delay(400);
    irsend.sendRaw(VolUp,67,38);
    delay(400);
    
    Serial.println("IR Sent"); // to help debug
    
    irrecv.enableIRIn(); // enables the reciver
    
    Serial.println("Receiver enable");
  //}
}

Mortis e AnalysIR,

Funcionou perfeitamente com as dicas de vocês. Como eu sou iniciante e sinceramente não entendo muito de linguagem C, me enrolei um pouco. Mortis, com relação ao " if (millis() - last > 250)" é para evitar comandos repetidos em pouco tempo...

It is fully working with your suggestions. As I am beginner and honestly do not know much about C language, I have some difficulties. Mortis, regarding to "if (millis () - last> 250)" is to avoid repeated commands in a short time ...

Obrigado!

bom saber que funcionou.

Mas você percebeu onde estavam os problemas, certo?. Em relação ao if, ele não estava no lugar certo para o que pretendias. É só pensar no programa como uma lista de passos, e é exatamente esses passos, nessa ordem, que o arduino irá executar.

É normal ser iniciante, com um pouco de estudo e prática tudo fica fácil ;)

Mortis,

Obrigado pelas dicas!