IR RAW empfangen, auf "if" vergleichen dann IR RAW senden

Hallo zusammen!

Ich dachte es wäre cool wenn meine Soundbar automatisch einschalten würde wenn ich den TV einschalte.
Dazu möchte ich IR RAW empfangen was scho sehr gut funktioniert hiermit:

#define sprint Serial.print 
#define sprintln Serial.println
#include <IRremote.h>

#define IR_RCVR_PIN 11
IRrecv ir_receiver(IR_RCVR_PIN);
decode_results results;



void setup() {
   Serial.begin(9600);
   ir_receiver.enableIRIn(); // Start the receiver
}

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

int c = 1;

void dump(decode_results *results) {
  int count = results->rawlen;
  sprintln(c);
  c++;
  sprintln("For IR Scope: ");
  for (int i = 1; i < count; i++) {
      sprint("0x");
      sprint((unsigned int)results->rawbuf[i], HEX);
   sprint(" ");
  }

  sprintln("");
  sprintln("For Arduino sketch: ");
  sprint("unsigned int raw[");
   sprint(count, DEC);
   sprint("] = {");
  for (int i = 1; i < count; i++) {
      sprint("0x");
      sprint((unsigned int)results->rawbuf[i], HEX);
      sprint(",");
   }
   sprint("};");
   sprintln("0");
   sprint("irsend.sendRaw(raw,");
   sprint(count, DEC);
   sprint(",38);");
   sprintln("");
   sprintln("");

}

Nun möchte ich aber prüfen ob zB:
0x32 0x9 0xE 0xA 0xE 0xA 0x1A 0xA 0xE 0x9 0x1A 0xA 0xE 0xA 0xE 0xA 0xE 0xA 0xE 0x9 0xF 0x9 0xE 0xA 0x1A 0xA 0x1A 0xA 0xE 0x9 0xE

rein kommt, darauf irsend machen:

0x31 0xA 0x1A 0xA 0xE 0xA 0x1A 0xA 0xE 0xA 0x1A 0x9 0xE 0xA 0xE 0xA 0x1A 0xA 0xD 0xA 0xE 0xA 0xE 0xA 0xE

Kann mir jemand helfen?

Wenn du diesen Code selbst geschrieben hast, dann solltest du das wohl hin bekommen.

Damit wir den Code leichter lesen können, diesen bitte besser dokumentieren und in Code-Tags hier einfügen.

Danke.

Schauen wir uns mal an was decode_results/rawbuf eigentlich ist:
https://github.com/z3t0/Arduino-IRremote/blob/master/IRremote.h

class decode_results
{
 public:
 decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
 unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
 unsigned long          value;        // Decoded value [max 32-bits]
 int                    bits;         // Number of bits in decoded value
 volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
 int                    rawlen;       // Number of records in rawbuf
 int                    overflow;     // true iff IR raw code too long
};

Also rawbuf ist ein Array aus unsigned int. Genauer gesagt ein Zeiger auf ein Array das in irparams_t steht. Aber das ist egal.

Damit wird es das vielleicht vernünftigste sein, ein Vergleichs-Array per PROGMEM ins Flash zu schreiben und dann per memcmp_P() zu vergleichen.

z.B.:

unsigned int data[] =
{ 
  0x32, 0x9, 0xE, 0xA, 0xE, 0xA, 0x1A, 0xA, 0xE, 0x9, 0x1A, 0xA, 0xE, 0xA, 0xE,
  0xA, 0xE, 0xA, 0xE, 0x9, 0xF, 0x9, 0xE, 0xA, 0x1A, 0xA, 0x1A, 0xA, 0xE, 0x9, 0xE
};

const unsigned int compareData[] PROGMEM =
{ 
  0x32, 0x9, 0xE, 0xA, 0xE, 0xA, 0x1A, 0xA, 0xE, 0x9, 0x1A, 0xA, 0xE, 0xA, 0xE,
  0xA, 0xE, 0xA, 0xE, 0x9, 0xF, 0x9, 0xE, 0xA, 0x1A, 0xA, 0x1A, 0xA, 0xE, 0x9, 0xE
};


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

  if (memcmp_P(data, compareData, sizeof(data)) == 0)
    Serial.println("gleich");
  else
    Serial.println("nicht gleich");
}

void loop()
{ 
}

Alternativ kann man eine Vergleichsfunktion per Hand schreiben.

Hallo zusammen!

Vielen Dank für die Hilfe erst mal!

Nein leider habe ich diesen Code nicht selber geschrieben und bin ein absoluter Anfänger.

Nun habe ich an meinem Code rumgebastelt:

#define sprint Serial.print 
#define sprintln Serial.println
#include <IRremote.h>

#define IR_RCVR_PIN 11
IRrecv ir_receiver(IR_RCVR_PIN);
decode_results results;



unsigned int data[] =
{
  0x31,0xA,0xE,0xA,0x1A,0xA,0xE,0xA,0xE,0x9,0x1A,0xA,0xE,0xA,0xE,0xA,0x1A,0x9,0xE,0xA,0xE,0xA,0xE,0xA,0xE,
};

const unsigned int compareData[] PROGMEM =
{
  0x31,0xA,0xE,0xA,0x1A,0xA,0xE,0xA,0xE,0x9,0x1A,0xA,0xE,0xA,0xE,0xA,0x1A,0x9,0xE,0xA,0xE,0xA,0xE,0xA,0xE,
};



void setup() {
    Serial.begin(9600);
    ir_receiver.enableIRIn(); // Start the receiver

    if (memcmp_P(data, compareData, sizeof(data)) == 0)
    Serial.println("gleich");
  else
    Serial.println("nicht gleich");  
}
 

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

int c = 1;

void dump(decode_results *results) {
   int count = results->rawlen;
   sprintln(c);
   c++;
   sprintln("For IR Scope: ");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
    sprint(" ");
   }

   sprintln("");
   sprintln("For Arduino sketch: ");
   sprint("unsigned int raw[");
   sprint(count, DEC);
   sprint("] = {");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
       sprint(",");
    }
    sprint("};");
    sprintln("0");
    sprint("irsend.sendRaw(raw,");
    sprint(count, DEC);
    sprint(",38);");
    sprintln("");
    sprintln("");

}

Im Serialmonitor kommt ohne IR Betätinung “gleich”

Dann habe ich versucht die Taste auf welche ich das “gleich” erwarte zu drücken, leider passierte aber nichts.

Dies ist der Serialmonitor:

gleich

1
For IR Scope:
0x32 0xA 0xE 0xA 0x1A 0x9 0xF 0x9 0xE 0xA 0x1A 0xA 0xE 0xA 0xD 0xB 0x19 0xA 0xE 0xA 0xE 0xA 0xD 0xB 0xE
For Arduino sketch:
unsigned int raw[26] = {0x32,0xA,0xE,0xA,0x1A,0x9,0xF,0x9,0xE,0xA,0x1A,0xA,0xE,0xA,0xD,0xB,0x19,0xA,0xE,0xA,0xE,0xA,0xD,0xB,0xE,};0
irsend.sendRaw(raw,26,38);

2
For IR Scope:
0x32 0xA 0xE 0x9 0x1A 0xA 0xE 0xA 0xE 0xA 0x19 0xB 0xE 0x9 0xE 0xA 0x1A 0xA 0xE 0xA 0xE 0xA 0xD 0xA 0xE
For Arduino sketch:
unsigned int raw[26] = {0x32,0xA,0xE,0x9,0x1A,0xA,0xE,0xA,0xE,0xA,0x19,0xB,0xE,0x9,0xE,0xA,0x1A,0xA,0xE,0xA,0xE,0xA,0xD,0xA,0xE,};0
irsend.sendRaw(raw,26,38);

3
For IR Scope:
0x32 0xA 0xE 0xA 0x1A 0xA 0xE 0x9 0xE 0xA 0x1A 0xA 0xE 0xA 0xE 0xA 0x1A 0x9 0xE 0xA 0xE 0xA 0xE 0xA 0xD
For Arduino sketch:
unsigned int raw[26] = {0x32,0xA,0xE,0xA,0x1A,0xA,0xE,0x9,0xE,0xA,0x1A,0xA,0xE,0xA,0xE,0xA,0x1A,0x9,0xE,0xA,0xE,0xA,0xE,0xA,0xD,};0
irsend.sendRaw(raw,26,38);

Darf ich nochmal um Hilfe bitten?

Im Serialmonitor kommt ohne IR Betätinung "gleich"

Natürlich! Das war Test Code! Ich wollte nur zeigen wie man allgmein zwei Arrays vergleicht. Das musst du dann auf dein Problem anwenden. Statt "data" musst du die die Daten nehmen die von IrRemote bekommst. Also results->rawbuf.

Sowas in der Art:

if (memcmp_P(results->rawbuf, compareData, sizeof(compareData)) == 0)
{
}

Wichtig ist hier aber, dass du nicht sizeof(results->rawbuf) machst, weil das nur ein Zeiger ist und du da nicht die Länge des gesamten Arrays bekommst! Mit sizeof(compareData) geht es aber.

Und auch nicht in setup() sondern an der Stelle an der du die Daten auswertest. d.h. irgendwo in der dump() Funktion

Ich weiß auch nicht ob das wirklich die Lösung hier ist

Vielen Dank für die Hilfe.

Nun kann ichvergleichen was super ist bin aber gerade an ein ganz anders Problem gestossen:

Bis jezt habe ich mit einer Sony FB Tests gemacht aber die eigentliche FB ist eine Bang & Olufsen B&O Beo4 welche mit 455kHz sendet. So habe ich einen komptiblen Empfäger montiert ( TSOP7000 ) und getestet.
Leider aber kommen das immer wieder unterschiedliche Resultate rein, nur selten gleiche.

25AE7EE0
DBE32B77
25AE7EE3
180C126A
24AE7D4E
25AE7EE0
25AE7EE3
25AE7EE3
24AE7D4E
25AE7EE0
24AE7D4E
25AE7EE3
4CB0FADF
49B0F626
25AE7EE3
DAE329E4
25AE7EE0
49B0F626
49B0F625
Erfolg
25AE7EE3
F40E874F
BFE48DDA
25AE7EE0
FFCF9280
49B0F626
F40E874F
25AE7EE0
Erfolg
25AE7EE3
DAE329E5
FDAC0150
5AED50ED
25AE7EE0
4CB0FADF
25AE7EE3
49B0F625
25AE7EE0
4CB0FADF
25AE7EE0
4AB0F7B7
22AE7A29
25AE7EE0
25AE7EE0
25AE7EE1
25AE7EE0
22AE7A29
58D4190B
DAC8C9E0
25AE7EE0
24AE7D4E
25AE7EE0
25AE7EE0
FDAC0152
25AE7EE0
BFE48DDA
4CB0FADF
25AE7EE0
24AE7D4E
E9E70E8F
49B0F626
24AE7D4E
FCABFFBF

Hätte sonst jemand eine idee wie ich auf einfachste Weise ein Tastendruck der Beo4 interpreieren kann und darauf was auslösen?

Hat jemand ne Idee? Würde es nicht reichen die Eingangsignale auf PIN 11 zu vergleichen? Es wären ja auch nicht so viele Tasten....