Mehrere IR-Codes empfangen

Hello

Ich verwende diesen Code, um von der simplen Arduino-Fernbedienung die Tastencodes zu empfangen:

 if (IrReceiver.decode()) {
    /*
     * !!!Important!!! Enable receiving of the next value,
     * since receiving has stopped after the end of the current received data packet.
     */
    IrReceiver.resume();  // Enable receiving of the next value
    if (IrReceiver.decodedIRData.command == 0xC) {
      bright = 10;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x18) {
      bright = 50;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x5E) {
      bright = 100;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x08) {
      bright = 150;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x1C) {
      bright = 200;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x5A) {
      bright = 255;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x16) {
      Pixelschange(bright, 0, 0, 0);
    } else if (IrReceiver.decodedIRData.command == 0x07) {
      pixelsbar.setBrightness(5);
      pixelsbar.show();
    } else if (IrReceiver.decodedIRData.command == 0x09) {
      pixelsbar.setBrightness(20);
      pixelsbar.show();
    } else if (IrReceiver.decodedIRData.command == 0x45) {
      for (int i = 0; i < NUMPIXELSBAR; i++) {
        pixelsbar.setPixelColor(i, pixelsbar.Color(0, 0, 0));
        pixelsbar.show();
      }
    } else if (IrReceiver.decodedIRData.command == 0x52) {
      rot = 0;
      gruen = 255;
      blau = 0;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x42) {
      rot = 255;
      gruen = 255;
      blau = 255;
      Pixelschange(bright, rot, gruen, blau);
    } else if (IrReceiver.decodedIRData.command == 0x4A) {
      rot = 255;
      gruen = 140;
      blau = 0;
      Pixelschange(bright, rot, gruen, blau);
    }
    //Serial.println(IrReceiver.decodedIRData.command, HEX);
  }
}

Das funktioniert auch, allerdings sendet meine LG-Fernbedienung teilweise die selben Codes.
Gibt es dafür eine Lösung oder läßt sich das nur mit einer manuell programmierbaren Fernbedienung lösen ?

Das ist nicht unüblich und kannst du mittels deines Sketches auswerten.
Das sind Wiederholungscode, mit denen ein längeres drücken selbiger Taste festgestellt werden kann.

Hm, sorry. Ich kann nicht ganz folgen. Was haben Wiederholungscodes damit zu tun ?

Ich rate dir das IR-Empfangs-Sketch aus den Beispielen herunter zu laden.

Dann nimmst du irgend eine FB aus der Schrottkiste. Drückst eine Taste, lässt dir im Seriellen-Monitor den Code anzeigen, und schreibst deine Software um.

Das ist in meinen Augen die einfachste Lösung.

Ich habe nämlich (auch mit LG :wink: ) ein ähnliches Problem. Mein Festplattenrecorder und mein BR-Player (beide von LG) reagieren beide auf die selbe Taste. Weshalb ich vor das nicht genutzte Gerät ein Handtuch legen muss. ;(

Eine andere Lösung gibt es halt nicht. Da du weder die FB noch die Software des LG umprogrammieren kannst.

Die FB aus der Grabbelkiste (sollte nicht von LG sein) hat andere Codes und dein Problem ist gelöst, wenn du besagte Codes in deine Software einbaust.

Gruß

Pucki

Deine Frage ist möglicherweise etwas missverständlich gestellt. Es hat sich erst so gelesen, als ob deine LG Fernbedienung bei einem Druck auf eine Taste diesen Code wiederholt sendet.

Ich habe das jetzt so verstanden, dass du eine "Arduino" Fernbedienung verwendest (was immer das auch sein soll) und die LG Fernbedienung mit gleichen Codes "dazwischenfunkt". Wahrscheinlich ist die "Arduino" Fernbedienung ein Billigteil mit NEC Protokoll. Du kannst das mit dem "gleichen Codes" wahrscheinlich verhindern, wenn Du in dem Programm alle Protokolle bis auf das NEC Protokoll deaktivierst.

Das kannst Du wie folgt machen:

/*
 * Specify which protocol(s) should be used for decoding.
 * If no protocol is defined, all protocols (except Bang&Olufsen) are active.
 * This must be done before the #include <IRremote.hpp>
 */
#define DECODE_NEC

#if !defined(RAW_BUFFER_LENGTH)
// Maximum length of raw duration buffer. Must be even. 100 supports up to 48 bit codings inclusive 1 start and
// 1 stop bit.
#define RAW_BUFFER_LENGTH 100                                                                                              \
// #define RAW_BUFFER_LENGTH  112    // MagiQuest requires 112 bytes.
#endif

#define EXCLUDE_UNIVERSAL_PROTOCOLS   // Saves up to 1000 bytes program space.
#define EXCLUDE_EXOTIC_PROTOCOLS      // saves around 650 bytes program space if all other protocols are active
// #define _IR_MEASURE_TIMING
// #define DEBUG // Activate this for lots of lovely debug output from the decoders.
// #define INFO // To see valuable informations from universal decoder for pulse width or pulse distance protocols

#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp>

Die hier gezeigten #defines einfügen bevor IRremote.hpp includiert wird.

Eine andere Möglichkeit wäre, das Adress- und/oder Protokollfeld auszuwerten. Wenn die beiden Fernbedienungen eine unterschiedliche Adresse senden und/oder ein anderes Protokoll verwenden, kann darüber unterschieden werden, welches die Quelle des Codes ist:

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.
};

Falsche Adresse -> Empfangenen Code verwerfen.

Sorry für die missverständliche Frage. Kai-R hat jedoch herausgefunden, was ich meinte :+1:
Ich verwende im Code nur

#define DECODE_NEC  // Includes Apple and Onkyo

Das ist bei mir nicht aktiviert:

#define RAW_BUFFER_LENGTH

In meinem Programm schaltet z.B. die Taste Null alle LEDs aus. Dasselbe passiert auch, wenn ich auf der LG-Fernbedienung die Null drücke.
Das ist die ominöse Arduino-Fernbedienung:
81W4pxf80gL.AC_SL1500
Den Teil mit "struct IRData" muss ich mir genauer reinziehen, momentan versteh ich nur Bahnhof :thinking:.
Aber danke schonmal für die Unterstützung.

Diese zeigen an, dass du eine Taste länger drückst und damit schrittweise etwas (Lautstärke o.ä) größer bzw. kleiner machen kannst.

Das ist keine Arduino-Ferbedienung. Oder siehst du da irgendwo Arduino drauf stehen.
Der Hersteller ist ein anderer.

Das ist wohl klar. Es steht ja dick und fett "Elegoo" drauf. Ich bezog diese generell zu Arduino gehörig.

Ich habe eben 4 Fernbedienungen getest: Denon, 2 LG und die Arduino.
Bei allen liefert das Programm Protokoll=UNKNOWN und address=0.
Was äußerst seltsam ist.
Kann es evtl. am Receiver liegen ? Ist ein KY-022:

Es gibt welche was mit anderer Grundfrequenz senden

Dir offensichtlich nicht, denn Arduino ist ein geschützter Name.

In Deinem Code hast Du doch schon "IrReceiver.decodedIRData.command" verwendet.
Frag doch zusätzlich mal "IrReceiver.decodedIRData.address" ab. Wenn diese gesendet wird, unterscheidet die sich möglicherweise, hoffentlich von der , die von der LG Fernbedienung kommt.

Es wundert mich eigentlich ein wenig. Ich hätte jetzt angenommen, dass LG ein eigenes Protokoll mitbringt (es gibt jedenfalls ein //#define DECODE_LG). Darum sollte man ja annehmen, dass die Fernbedienung ignoriert wird, wenn in der Software das Protokoll dafür ausgeschaltet wird.

Es klingt verrückt, aber überprüfe mal die Leiterbahnen auf der Platine.

Ich hab vor 2 Jahren 10 Stk. dieser Teile in China bestellt. Und egal was ich machte da passierte NIX. Bis ich auf die Idee kam die Leiterbahnen mit den Diodendatenblatt zu vergleichen.

Ergebnis: Die Beschriftung war bei 4 der Teilchen falsch.

Vielleicht hast du ja auch welche aus diese "Serie" erwischt.
Ist nur eine Vermutung auf Grund der Erfahrung mit den Modul.

Gruß

Pucki

Ich habe mal aus Spaß mir die Codes für einen LG RH-199 in eine Datenbank geschrieben. Grund war eigentlich das die Original-FB bei den Ebay-Teil nicht dabei war und ich den Nachbau nicht traute.

Folgendes Ergebnis (ausgelesen mit einen der Beispiele-Prg).

Power-Taste :
Bit-Code : B4B40CF3
RAW-Code : "unsigned int rawData[67] = {4750,4200, 800,1450, 800,300, 750,1500, 750,1450, 750,350, 750,1500, 700,400, 650,500, 600,1600, 600,550, 550,1650, 550,1700, 550,550, 550,1700, 550,550, 500,600, 550,550, 550,550, 550,550, 550,550, 550,1650, 550,1700, 550,550, 550,550, 550,1700, 550,1650, 600,1650, 550,1700, 550,550, 550,550, 550,1650, 550,1700, 550}; // SAMSUNG B4B40CF3
unsigned int data = 0xB4B40CF3;

Ich habe dabei nur die Infos des Prg. in eine Datenbank geschrieben. Sonst nix.

Witziger Weise ist mir dabei aufgefallen das das Programm bei Vol + und Vol - sowie PRG + und PRG - behauptet hat das es ein NEC Code war. Alle anderen Codes wurden als SAMSUNG identifiziert.

Nochmal es ist ein LG-Gerät. !!!!

Ich hoffe du kannst mit der Info etwas anfangen.

Ach ich habe inzwischen ein kleines Modul gebaut, was die Geräte nach einige Zeit ausschaltet. Und die reagieren wenn ich den Bit-code (s.o.) sende.

Gruß

Pucki

Vielen Dank mal an alle :+1:

Es liegt offensichtlich am Breadboard. Hab ein anderes getestet, da passiert es ebenfalls, dass nur UNKNOWN, etc. ankommt. Erst durch herumwackeln und draufhalten der Kabel ging es (wird als NEC angezeigt).
Ich werde das Ganze auf Verdacht mal zusammenlöten.

So, es funktioniert - es lag am Breadboard.
Sorry für die unnötige Aufregung und danke nochmal !

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