IR: Ricevo codice,memorizzo codice, trasmetto

Salve ragazzi!

Oggi preso dalla noia e stufo del fatto che sono a corto di idee, ho deciso di tornare sulla mitica libreria IRremote.
Ho imparato a mandare i codici in raw in modo da avere una compatibilità universale sbirciando qui. Fra le ultime righe dice che basta creare un arrai di raw nel quale va eliminato il primo codice ottenuto e portati positivi tutti i codici negativi. Funziona!

Ora però volevo fare qualcosa che riceve, memorizza e manda in continuazione. Quindi ho modificato il codice di IRrecvDump (commento la parte modificata):

#include <IRremote.h>

int RECV_PIN = 11;
IRsend led;         //mio led

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
}


void dump(decode_results *results) {
  
  int count = results->rawlen; 
  
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): {");
  
  unsigned int code[count];     //vettore per i raw 
  
  for (int i = 1; i < count; i++) {     //parto da 1 per eliminare il primo codice
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
      code[i]=results->rawbuf[i]*USECPERTICK;     //carico
      
    } 
    else {
      Serial.print((int)results->rawbuf[i]*USECPERTICK, DEC); //ho tolto il "-"
      code[i]=(int)results->rawbuf[i]*USECPERTICK; //carico
      
      
    }
    Serial.print(",");
  }
  Serial.println("};");
  
  
  delay(5000);
  Serial.print(count);  //stampo per sicurezza la lunghezza
  Serial.print("  ");
  
  for (int x = 1; x < count; x++) {  //stampo ad uno ad uno i codici per sicurezza
    Serial.print(code[x]);
    Serial.print(",");
  }
  Serial.println("");
  
  while(1){                         //invio continuo di..
  for (int c = 0; c < 3; c++) {
      led.sendRaw(code, count,38);  //vettore di codici lungo count e con frequenza 38
      delay(40);
  }
  delay(5000);            
  }
  
  
}


void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    
    irrecv.resume(); // Receive the next value
  }
}

ES:

Raw (68): {4500,4350,650,1600,650,1600,600,1600,650,500,600,500,600,500,650,500,600,500,650,1600,600,1600,650,1600,600,500,650,500,600,500,650,450,650,500,600,500,650,1600,600,500,650,500,600,1600,650,500,600,500,650,450,650,1600,650,450,650,1600,650,1600,600,500,600,1650,650,1550,650,1600,600,};
68 4500,4350,650,1600,650,1600,600,1600,650,500,600,500,600,500,650,500,600,500,650,1600,600,1600,650,1600,600,500,650,500,600,500,650,450,650,500,600,500,650,1600,600,500,650,500,600,1600,650,500,600,500,650,450,650,1600,650,450,650,1600,650,1600,600,500,600,1650,650,1550,650,1600,600,

Come vedete non fa altro che salvare il vettore per poi iniviarlo… nel confronto sul seriale sembra coincidere tutto, non ci sono errori, però effettivamente il televisore non riceve niente!

La cosa assurda è che se in un codice a parte invio il raw preso dal codice precedente il televisore riceve!

#include <IRremote.h>

IRsend led;
unsigned int code[68] = {4500,4350,650,1600,650,1600,600,1600,650,500,600,500,600,500,650,500,600,500,650,1600,600,1600,650,1600,600,500,650,500,600,500,650,450,650,500,600,500,650,1600,600,500,650,500,600,1600,650,500,600,500,650,450,650,1600,650,450,650,1600,650,1600,600,500,600,1650,650,1550,650,1600,600};

void setup()
{
  Serial.begin(9600);
}

void loop() {

    for (int i = 0; i < 3; i++) {
      led.sendRaw(code, 68,38); 
      delay(40);
    }
    
    delay(5000);
 
}

Dovete scusarmi ma la faccenda si fa sempre più strana…
Oggi a scuola ho pensato che il problema potesse essere negli indici del vettore che creo. Quando lo carico infatti esso parte dalla cella 1, solo che se lo faccio partire dalla cella 0 non cambia niente.

La cosa strana sta nel fatto che, se copio il loop del codice che posto sotto in un qualsiasi punto dello sketch non funziona, mentre se lo metto in un altro sketch che fa solo questo, funziona maledettamente ]:slight_smile:

#include <IRremote.h>

IRsend led;

void setup()
{
  Serial.begin(9600);
}

void loop() {

  delay(1000);
  unsigned int cd[24] = {900,850,950,800,1800,850,900,850,950,800,950,800,950,1700,1800,850,900,850,950,800,950,800,1000};
                       
  for (int c = 0; c < 3; c++) {
      led.sendRaw(cd, 24,38);  
      delay(40);
  }
  Serial.println("invio");
  delay(1000);  
  
}

scusa non ti segui, puoi postare il codice che funziona e quello che non funziona?

lesto:
scusa non ti segui, puoi postare il codice che funziona e quello che non funziona?

Ineffetti ho fatto un po’ di confusione,e capisco che ci voglia tanta buona volonta per capire quello che ho detto ahah.
In definitiva questo non funziona:

#include <IRremote.h>

int RECV_PIN = 11;
IRsend led;         //mio led

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
}


void dump(decode_results *results) {
  
  int count = results->rawlen; 
  
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): {");
  
  unsigned int code[count];     //vettore per i raw 
  
  for (int i = 1; i < count; i++) {     //parto da 1 per eliminare il primo codice
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
      code[i-1]=results->rawbuf[i]*USECPERTICK;     //carico
      
    } 
    else {
      Serial.print((int)results->rawbuf[i]*USECPERTICK, DEC); //ho tolto il "-"
      code[i-1]=(int)results->rawbuf[i]*USECPERTICK; //carico
      
      
    }
    Serial.print(",");
  }
  Serial.println("};");
  
  delay(5000);
  
  while(1){                         //invio continuo di..
  for (int c = 0; c < 3; c++) {
      led.sendRaw(code, count,38);  //vettore di codici lungo count e con frequenza 38
      delay(40);
  }
  Serial.println("invio");
  delay(1000);            
  }
  
}


void loop() {

  if (irrecv.decode(&results)) {
    dump(&results);
    
    irrecv.resume(); // Receive the next value
  }
}

Mentre questo, chiamiamolo ad-hoc, che contiene il codice raw, funziona:

#include <IRremote.h>

IRsend led;

void setup()
{
  Serial.begin(9600);
}

void loop() {

  delay(1000);
  unsigned int cd[68] = {4550,4350,650,1600,600,1600,650,1600,600,500,650,500,600,500,600,500,650,500,600,1600,650,1600,600,1600,650,500,600,500,650,500,600,500,650,500,600,500,600,1650,600,500,600,500,650,1600,600,500,650,500,600,500,650,1600,600,500,650,1600,600,1600,650,500,600,1600,650,1600,600,1600,650};
                       
  for (int c = 0; c < 3; c++) {
      led.sendRaw(cd, 68,38);  
      delay(40);
  }
  Serial.println("invio");
  delay(1000);  
  
}

La cosa strana, come ho detto sopra, sta nel fatto che se quel codice nel loop qui sopra lo metto in un qualsiasi punto del primo codice, non funziona.

Quindi non capisco quale potrebbe essere il problema!

if ((i % 2) == 1) {

vuol dire "se i è pari"... sicuro che sia giusto?

i valori contenuti nell'array ti risultano giusti?

lesto:

if ((i % 2) == 1) {

vuol dire “se i è pari”… sicuro che sia giusto?

i valori contenuti nell’array ti risultano giusti?

Guarda il codice è tratto dall’esempio IRrecvDump, quindi quel blocco di controllo l’ho lasciato così com’è.
Io ho solo modificato o aggiunto le parti che ho commentato ma solo allo scopo di aggiungere i valori nell’array. Ma funziona il programma in se, perchè i codici me li da giusti e già puliti (convertiti in positivi i negativi e eliminato il primo valore)per essere caricati in un vettore.

Ho ristampato i dati dell’array ad uno ad uno e sono identici. Per sicurezza ho posto l’array grande quanto count-1 (visto che il primo valore va eliminato) per evitare di avere valori aggiuntivi, visto che le celle vuote sono riempite con numeri probabilmente casuali.

Boh, sempre più confuso. Mi sono accorto che c’è un esempio di recording nella libreria, e per mia felicità mi sono accorto di aver seguito la stessa logica:

codeLen = results->rawlen - 1;
    // To store raw codes:
    // Drop first value (gap)
    // Convert from ticks to microseconds
    // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
    for (int i = 1; i <= codeLen; i++) {
      if (i % 2) {
        // Mark
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
        Serial.print(" m");
      } 
      else {
        // Space
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
        Serial.print(" s");
      }
      Serial.print(rawCodes[i - 1], DEC);
    }

Ma stessa cosa anche qui, non invia correttamente e se prendo i codici (tra l’altro diversi perchè c’è il “MARK_ECCESS”) e li metto in uno sketch a parte funzionano!

La parte di sending nell’esempio è semplicemente:

else if (codeType == UNKNOWN /* i.e. raw */) {
    // Assume 38 KHz
    irsend.sendRaw(rawCodes, codeLen, 38);
    Serial.println("Sent raw");
  }

Ma cose, cose… :stuck_out_tongue: