Protocol aus IRRemote.hpp gibt Zahl aus

Hallo liebes Forum,

folgendes Problem:

Ich habe ein IR Empfänger aufgebaut und lese damit die Daten meiner Fernbedienung aus. Ich benutze die library IRremote (version3.7.1 by Armin Joachimsmeyer).

Über den Befehl "IrReceiver.printIRResultShort" bekomme ich die Daten so wie ich sie haben will:
(siehe Bild unten)

Da ich aber nur an dem Protocol und der Raw-Data interessiert bin, möchte ich diese isoliert ausgeben.

Das sollte eigentlich hiermit funktionieren: "Serial.println(IrReceiver.decodedIRData.protocol);" und "Serial.println(IrReceiver.decodedIRData.decodedRawData);"
Raus kommt das :

Die RawDara stimmt ja, aber beim Protocol kommen da nur Zahlen raus.
Wieso ist das so?? Wo bekommen ich den String einzeln her?

Es sieht so aus, als hätten Sie:
Serial.println("RawData HEX");
wo Sie möchten:
Serial.print("RawData HEX");

Vielleicht postest du deinen Code?

Irgendwo muß es noch eine Stringliste dazu geben, denn weiter unten steht ja Protocol=SONY.

Was für einen String?

Auf dem Oszillogramm sind die Impulse einer Sequenz (Sender und Empfänger) zu sehen. Die Zahlen, die von der IRRemote Software als RAW ausgegeben werden, sind einzelne Zeitabschnitte für jedes Low und High das empfangen wird. Die Zahlen in Ihrer Gesamtheit ergeben die Sequenz.

Die Sequenz besteht i.d.R. aus einen Startbit, Datenbits und einem Stoppbit.
Auf die von Dir gezeigten Daten bezogen könnte z.B. das Startbit 2450µS Low und 550µ High codiert sein. Eine 1 als Datenbit (1250µs Low und 550 µs High), eine 0 (600µs Low und 550µs High) usw.

Das sind die RAW Daten. Darum bekommst du keinen String, sondern eine Array mit Zahlen.

Schau Dir von der Bibliothek mal das Beispiel "SendRawDemo.ino" an:

Eventuell suchst Du nach den 32 bit raw data in IrReceiver.decodedIRData.decodedRawData.

Guck dir mal in den library Sourcen (IRReceive.hpp) an, wie das da gemacht wird.

Erstmal vielen Dank für so viele Antworten.
Hier mein Code:

#include <Arduino.h>
#include <IRremote.hpp>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C                        //Adresse OLED-Displays
#define IR_RECEIVE_PIN 6                        //Pin von Arduino Uno
decode_results results;                         //Protocol Zwischenspeichern
SSD1306AsciiWire oled;

void setup() {
    Serial.begin(9600);                         //9600 baud
    Serial.println(strrchr(__FILE__, '\\')+1);  //Dateiname in seriellen Monitor ausgeben
    IrReceiver.begin(IR_RECEIVE_PIN);           //Receiver start
  
  Wire.begin();
  Wire.setClock(400000L);                       //geht mit 10k 100k 400k
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
  oled.setFont(fixed_bold10x15);                // Auswahl der Schriftart
  oled.clear();                                 //Löschen der aktuellen Displayanzeige
  oled.println("Willkommen");                   //Text in der ersten Zeile beim Startup
  oled.println("Name");                       // -> personalisieren                                                               
  oled.println(strrchr(__FILE__, '\\')+1);      //Dateiname in OLED-Display ausgeben
}

void loop() {
            
            if (IrReceiver.decode()) {                                       // Grab an IR code

//Ausgabe der empfangenen Daten auf seriellen Monitor
            Serial.println();                                                // 2 blank lines between entries
            Serial.println();
            IrReceiver.printIRResultShort(&Serial);      //Ausgabe von decodedIRData
            Serial.println();
            Serial.println(F("Raw result in microseconds - with leading gap"));
            IrReceiver.printIRResultRawFormatted(&Serial, true);            // Output the results in RAW format
            Serial.println();                                               // blank line between entries
//Ausgabe von ausgewähltne Daten auf seriellen Monitor                     
            Serial.print("Protocol=");                              
            Serial.println(IrReceiver.decodedIRData.protocol);              //Hier wird statt dem Protocol-Name nur eine Zahl ausgebeben
            Serial.println("RawData HEX");                        
            Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);   //Korrekte RawData Adresse wird ausgegeben
            
        IrReceiver.resume();                                                //Prepare for the next value
    }
}

Mich interessiert nur, wie ich an den Protocol Namen komme, der in meinem Sendeimpuls versteckt ist (Meinem Fall: SONY)
Gebe ich die Daten in der Funktion IrReceiver.printIRResultShort(&Serial); aus, so sehe ich den Protocolnamen als Schriftzeichen (Protocol=Sony).
Möchte ich aber nur den Protocolnamen mit Serial.println(IrReceiver.decodedIRData.protocol); ausgeben, kommt da eine Zahl raus (Protocol=19).
Es gibt eine Liste in der IRProtocol.h die folgendermaßen aussieht:

typedef enum {
    UNKNOWN = 0,
    PULSE_DISTANCE,
    PULSE_WIDTH,
    DENON,
    DISH,
    JVC,
    LG,
    LG2,
    NEC,
    PANASONIC,
    KASEIKYO,
    KASEIKYO_JVC,
    KASEIKYO_DENON,
    KASEIKYO_SHARP,
    KASEIKYO_MITSUBISHI,
    RC5,
    RC6,
    SAMSUNG,
    SHARP,
    SONY,
    ONKYO,
    APPLE,
    BOSEWAVE,
    LEGO_PF,
    MAGIQUEST,
    WHYNTER,
} decode_type_t;

Natürlich könnte ich da jetzt eine switch/case-Abfrage in meinem Programm implementieren. Plustert aber unnötig auf und sobald sich die Liste ändert, ist meine Abfrage falsch.

@ArminJo Ja, da gibt es eine Funktion, die sich "getProtocolString" nennt, ich weiß aber nicht, wie ich darauf Zugriff bekomme.

Ich hoffe ich konnte mein Problem diesmal besser beschreiben.

Wie greifst Du denn auf die anderen Funktionen zu?

Mit der Klasse "IrReceiver" und dem Punktoperator. Lasst er aber nicht zu... Ich habe die Bibliothek selbst um eine Funktion erweitert, die mir das ausgibt was ich will. Ist ja aber auch nicht Sinn der Sache, da beim nächsten Update weg.

Hat keiner eine Idee wie ich mit der bestehenden Library das hinbekomme?

Und wie wird das da drin gemacht?

Versuche mal:
Serial.println(getProtocolString(IrReceiver.decodedIRData.protocol));

Ich bin eben selbst drauf gekommen und schon steht die Antwort von jemand anderen da. Vielen Dank. Meiner Fehler war zu denken, dass getProtocolString eine FUnktion von der Klasse IrReceiver ist, dabei ist es eine globale Funktion und muss so ausgerufen.

@agmue Vielen Dank!

Zunächst hatte ich Deine Frage falsch verstanden, daher hat es zwei Versuche benötigt :roll_eyes:

Danke für die Rückmeldung :slightly_smiling_face:

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