IR Signale senden mit Arduino UNO: Code

Hi,
ich bin ein ziemlicher Anfänger, habe aber vor, meinen Arduino quasi als Fernbedienung zu nutzen. Empfangene Signale wieder zu versenden funktioniert nicht so ganz. Nun habe ich folgenden Code:

#include <IRremote.hpp>

const int receiverPin = 2;
const int senderPin = 3;
void setup() {
  Serial.begin(9600);

  IrReceiver.begin(receiverPin);
  Serial.print("Ready:  ");
  printActiveIRProtocols(&Serial);
  IrSender.begin(senderPin);
}

void loop() {
  if (IrReceiver.decode()) {
    // if (IrReceiver.decodedIRData.protocol != UNKNOWN) {
      IrReceiver.printIRResultShort(&Serial);
      Serial.println();
      IrReceiver.printIRSendUsage(&Serial);
      Serial.println();

      Serial.print(IrReceiver.decodedIRData.decodedRawData, HEX);
      Serial.println();
      Serial.println();
    }
  // }
  IrReceiver.resume();
}

Signale empfangen funktioniert reibungslos, nur das Speichen und wieder senden von diesen Daten geht nicht. Ich habe bspw. eine VU+ Fernbedienung und möchte z.B. wenn ich "OK" drücke, dass der Wert im Arduino gespeichert werden kann und ich mit meinem Arduino das "OK" SIgnal wieder versenden kann.

Ich habe schon etliche Videos angeschaut, auch die Beispiele von der library, aber ich bin nicht schlau draus geworden, zumal ich die neueste Version 4.2.1 von IRremote benutze.

Es würde mir schon reichen, dass ich die einzelnen Werte für jeden Befehl, den ich brauche, aus dem Serial Monitor abschreiben kann. Was für Befehle brauche ich dafür und wie speichere ich die Daten als z.B. Variable?

Ich verstehe das Problem nicht so ganz. Du hast Die Daten doch in der IrReceiver.decodedIRData Struktur gespeichert.

Die Struktur hat folgenden Aufbau:

struct IRData {
    decode_type_t protocol;     // UNKNOWN, NEC, SONY, RC5, PULSE_DISTANCE, ...
    uint16_t address;           // Decoded address
    uint16_t command;           // Decoded command
    uint16_t extra;             // Used for Kaseikyo unknown vendor ID. Ticks used for decoding Distance protocol.
    uint16_t numberOfBits;      // Number of bits received for data (address + command + parity) - to determine protocol length if different length are possible.
    uint8_t flags;              // IRDATA_FLAGS_IS_REPEAT, IRDATA_FLAGS_WAS_OVERFLOW etc. See IRDATA_FLAGS_* definitions
    IRRawDataType decodedRawData;    // Up to 32 (64 bit for 32 bit CPU architectures) bit decoded raw data, used for sendRaw functions.
    uint32_t decodedRawDataArray[RAW_DATA_ARRAY_SIZE]; // 32 bit decoded raw data, to be used for send function.
    irparams_struct *rawDataPtr; // Pointer of the raw timing data to be decoded. Mainly the data buffer filled by receiving ISR.
};

Man kann erkennen, dass das empfangene Kommando in IrReceiver.decodedIRData.command gespeichert ist. Diesen Wert kannst du in eine andere Variable z.B. mit

uint16_t saveCommand = IrReceiver.decodedIRData.command ;

Diese Daten kann man verwenden, um sie in einem zweiten Schritt wieder zu versenden.

Dokumentation:

Receive and Send Beispiel:

Vielleicht hilft ja folgendes Beispiel auf Wokwi.

Eigentlich demonstriert das Beispiel, wie man Daten von einer Fernbedienung empfängt und damit einzelne Leds ein. bzw. ausschalten kann. Ich habe es dahingehend ergänzt, dass ein empfangenes Kommando mit der "Dreiecktaste" wieder gesendet werden kann. Das wird durch die LED an Pin 3 emuliert, die beim Senden kurz aufflackert. Das sollte eigentlich auch in "echt" funktionieren, sofern eine Infrarot LED verwendet wird.

Was Gibt denn dein Programm so aus?
Hast Du dir das mal genau reingezogen?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.