Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Arduino Lektion 20: IR Fernbedienung auslesen

Posted on 13. März 20165. März 2024 by Stefan Draeger

Bei meinem ersten Kit war nicht nur ein Sainsmart Mega 2560 R3 und diverse Sensoren, sondern auch eine IR Fernbedienung dabei. In diesem Tutorial möchte ich nun beschreiben, wie diese am Arduino Nano betrieben werden kann.

Arduino Lektion 20: IR Fernbedienung auslesen
Arduino Lektion 20: IR Fernbedienung auslesen

  • Bezug der einzelnen Komponenten für diesen Beitrag
  • Technische Daten
  • Schaltplan
  • Quellcode
    • Tabelle mit den decodierten Werten für die Tasten
    • Fehlermeldung aus der Arduino IDE
  • Video
  • Download

Bezug der einzelnen Komponenten für diesen Beitrag

Wenn du das nachfolgende Beispiel nachbauen möchtest, dann benötigst du:

  • einen Arduino UNO*,
  • einen Transistor, 2N222*,
  • eine Infrarot Diode*,
  • diverse Breadboardkabel*,
  • ein 400 Pin Breadboard*, oder
  • ein 170 Pin Breadboard*

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Technische Daten

  • Betriebsspannung 3.3V bis 5V

Schaltplan

Der Anschluss des IR Receiver (die Labels sind selbst sprechend gewählt)

  • +5V an +5V des Arduino Nano
  • GND an Ground (GND)
  • Signal an einen digitalen Eingang (Bsp. D10)
Anschluss der IR LED.
Anschluss der IR LED.

Die hier dargestellte Schaltung habe ich dir bereits im Beitrag Daten per Infrarot versenden und Empfangen am Arduino vorgestellt.

Aufbau einer kleinen Schaltung für die IR-Fernbedienung.
Aufbau einer kleinen Schaltung für die IR-Fernbedienung.

Quellcode

#include <IRremote.h>

int irPin = 10; //Pin am Arduino Nano für den IR Receiver
int ledPin = 5; //Pin am Arduino Nano für die LED als Signalbestätigung

int led1Pin = 4; //Pin am Arduino Nano für LED 1
int led2Pin = 3; //Pin am Arduino Nano für LED 2

boolean led1Status = false;
boolean led2Status = false;


IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;

void setup() {
  pinMode(ledPin, OUTPUT);  //Den LED Pin als Ausgang deklarieren.
  pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
  irrecv.enableIRIn(); //Den IR Pin aktivieren
  Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
}
 
void loop(){
   if (irrecv.decode(&results)) { //Wenn etwas gelesen wurde dann...
      //Ausgabe des Wertes auf die Serielle Schnittstelle.
      int value = results.value;
      switch (value){
        case 16724175 : //Taste 1
            led1Status = !led1Status; //umkehren des Status für die LED 1
            if(led1Status == true){
              digitalWrite (led1Pin, HIGH); //LED anschalten
            } else {
              digitalWrite (led1Pin, LOW); //LED ausschalten
            }
        break;
        case 16718055 : //Taste 2
            led2Status = !led2Status; //umkehren des Status für die LED 2
            if(led2Status == true){
              digitalWrite (led2Pin, HIGH); //LED anschalten
            } else {
              digitalWrite (led2Pin, LOW); //LED ausschalten
            }
        break;
      }
      Serial.println(value, DEC);
      digitalWrite (ledPin, HIGH); //Status LED anschalten
      irrecv.resume(); // auf den nächsten Wert warten
      delay(250); // kurze Pause von 250ms damit die LED aufleuchten kann.
      digitalWrite (ledPin, LOW); //Status LED ausschalten
 }
}

Tabelle mit den decodierten Werten für die Tasten

TasteWert
016738455
116724175
216718055
316743045
416716015
516726215
616734885
716728765
816730805
916732845
An / Aus16753245
Mode16736925
Mute16769565
Play / Pause16720605
Preview16712445
Forward16761405
EQ16769055
Minus16754775
Plus16748655
Repeat / Shuffle16750695
U / SD16756815

Fehlermeldung aus der Arduino IDE

Wenn man die neueste Arduino IDE verwendet, kann es zu folgender Fehlermeldung kommen, wenn der Sketch kompiliert / überprüft wird.

„IRremoteTools.cpp:5: error: ‚TKD2‘ was not declared in this scope“

Es wird dabei empfohlen, auf eine frühere Version zu wechseln. Oder aber 2 Dateien aus dem Bibliothektsordner zu löschen, da diese wohl doppelt vorhanden sind.
Ich habe unter „C:\Program Files (x86)\Arduino\libraries\RobotIRremote“ die Dateien

  • IRremoteTools.cpp
  • IRremoteTools.h

in einen Unterordner verschoben (wer weiß, vielleicht werden die noch benötigt).
Nach dieser Prozedur hat der Sketch nun kompiliert und konnte erfolgreich übertragen werden.

Video

Infrarot Fernbedienung
Dieses Video auf YouTube ansehen.

Da die rote & blaue LED einen geringeren Abstrahlwinkel haben, leuchten diese von der Seite nicht ganz so stark, jedoch wenn die Kamera genau darauf zeigen würde, wäre diese wiederum mit der Leistung der LED überfordert.

Download

IR Fernbedienung auslesenHerunterladen

12 thoughts on “Arduino Lektion 20: IR Fernbedienung auslesen”

  1. Hans sagt:
    23. Mai 2017 um 23:01 Uhr

    Danke für das lehrreiche Tutorial.
    Ich konnte das Beispiel problemlos auf meine Hardware umstellen.
    Da meine Fernbedienung längere Codes sendet, musste ich value als long definieren damit es funktioniert.
    Außerdem war es noch nötig, die beiden PINs led1Pin und led2Pin im setup auf OUTPUT zu setzen.
    Nun funktioniert alles und der Weg für größere Projekte ist frei.

    Antworten
  2. steven sagt:
    1. Januar 2018 um 18:09 Uhr

    Oh sry my little boy…
    Thank you for the Tutorial…
    i have searched for this one

    Antworten
  3. Sebastian sagt:
    17. Januar 2018 um 22:37 Uhr

    Hi, schönes Projekt, genau danach habe ich gesucht. Aber Dir ist wohl ein kleiner Fehler unterlaufen. Der Infrarotempfänger VS1838B, den Du scheinbar benutzt, ist keine IR-LED, sondern ein IR-Receiver- (Empfänger-)Bauteil mit einem Phototransistor. Eine LED (Light Emitting Diode), sendet Licht. Die Fernbedienung bespielsweise benutzt eine IR-LED.
    http://www.1pico.com/vs1838b-datenblatt-pdf/

    Antworten
    1. Stefan Draeger sagt:
      18. Januar 2018 um 09:06 Uhr

      Hi,

      danke für das Feedback.
      Habe ich gleichmal geändert.

      Gruß,

      Stefan

      Antworten
  4. Jan-Peter sagt:
    29. Juli 2018 um 07:16 Uhr

    Hallo Stefan,
    sehr schöner Beitrag. Hat mir auch weitergeholfen. Nun beisse ich mir seit 1 Tag die Zähne an folgendem Problem aus:
    Ich steuere mit den Remote Befehlen 2 Motoren eines Roboters an. Ich nutze eine Arduino UNO.
    Das kuriose ist,
    Wenn ich die remote Befehle nutze, dann steuert mir der Arduino nur noch einen Motor der H Brücke an. der 2. bleibt still!!
    Wenn ich die remote Befehle im Code deaktiviere und die Motoren „von Hand“ starte, dann laufen beide.
    Das Problem liegt definitive an der Remote Funktion, die sich mit der H-Brücke in die Quere kommt.
    Ich habe den PIN der remote getauscht und digita analoge und A3 verwendet: keine Besserung:
    Ich habe die Detlayzeiten geändert: keine Besserung

    Hast du eine Idee?

    Gruss Jan-Peter

    Anbei der Code:

    #include

    /*
    * IRremote: IRrecvDemo – demonstrates receiving IR codes with IRrecv
    * An IR detector/demodulator must be connected to the input RECV_PIN.
    */

    int RECV_PIN = 12;
    int command = 4;

    IRrecv irrecv(RECV_PIN); //Objekt initialisieren für die IR Übertragung
    decode_results results;

    void setup()
    {
    //———————————————————————–
    //———- remote control ————————-
    //———————————————————————–

    irrecv.enableIRIn(); // Start the receiver
    Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.

    //———————————————————————–
    //———- output für die Motoren des Antriebs————————-
    //———————————————————————–
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(3, OUTPUT);

    pinMode(RECV_PIN, INPUT);
    }

    void loop() {
    if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);
    //Serial.println(results.value, DEC);
    switch (results.value){
    case 16718055 : //vorwärts fahren
    command = 0;
    break;
    case 16730805 : //rückwärts fahren
    command = 1;
    break;
    case 16734885 : //rechts fahren
    command = 2;
    break;
    case 16716015 : //links fahren
    command = 3;
    break;
    case 16726215 : //stop!!!
    command = 4;
    break;
    }

    irrecv.resume(); // Receive the next value
    }

    if (command == 0)//vorwärts fahren
    {
    //Serial.println(„vorwärts fahren“);
    // rechte Kette
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    analogWrite(9, 80);
    // linke Kette
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    analogWrite(3, 80);
    }

    //_____________________________________________________________________

    if (command == 1)//rückwärts fahren
    {
    //Serial.println(„rückwärts fahren“);
    // rechte Kette
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    analogWrite(9, 80);
    // linke Kette
    digitalWrite(2, HIGH);
    digitalWrite(4, LOW);
    analogWrite(3, 80);
    }

    //_____________________________________________________________________

    if (command == 2)//rechts fahren
    {
    //Serial.println(„rechts fahren“);
    // rechte Kette
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    analogWrite(9, 80);
    // linke Kette
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    analogWrite(3, 80);
    }

    //_____________________________________________________________________

    if (command == 3)//links fahren
    {
    //rechte Kette
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    analogWrite(9, 80);
    // linke Kette
    digitalWrite(2, HIGH);
    digitalWrite(4, LOW);
    analogWrite(3, 80);
    //Serial.println(„links fahren“);
    }
    //_____________________________________________________________________

    if (command == 4)//stop
    {
    //Serial.println(„stop!!!“);
    analogWrite(3, 0);
    analogWrite(9, 0);
    }

    delay(250);
    }

    Antworten
    1. Stefan Draeger sagt:
      29. Juli 2018 um 10:04 Uhr

      Hallo Jan-Peter,

      hast du mal die Codes der Fernbedienung ausgelesen? Diese sind von Fernbedienung zu Fernbedienung unterschiedlich.
      Das delay würde ich weglassen. Denn das würde eigentlich kein Sinn ergeben.

      Des Weiteren habe ich mir mal deinen Code vorgenommen und etwas vereinfacht, unter folgendem Link https://pastebin.com/viw7QBgR kannst du dir diesen herunterladen.

      Gruß,

      Stefan Draeger

      Antworten
      1. Jan-Peter sagt:
        31. Juli 2018 um 20:30 Uhr

        Hallo Stefan,
        vielen Dank für deine Mühe und Hilfe.
        Den Code habe ich ausprobiert. Sieht deutlich professioneller als meiner aus.
        Zeile 73 ist falsch, da sie den Motor immer gleich wieder anhält.

        Leider habe ich genau das gleiche Problem wieder.

        Wenn ich die Remote im setup aktiviere, dann läuft nur noch der rechte Motor. Wenn ich die Remote im setup nicht einschalte, dann laufen beide Motoren wie geplant. Irgendetwas macht der remotebefehl auf dem Prozessor, was ihn „dauerbeschäftigt“. Auffällig ist auch, dass der rechte Motor deutlich müder dreht, wenn die remote aktiviert ist. Wenn ich beide Motoren laufen lasse (ohne remote) dann drehen sie beide schneller.

        Kann man den code irgendwie bei der Abarbeitung „überwachen“.
        Ich habe mal eine andere remote bestellt. Aber glauben tue ich daran eigentlich nicht.

        Was würdest du als nächstes versuchen?

        Jan-Peter

        Antworten
        1. Stefan Draeger sagt:
          31. Juli 2018 um 21:29 Uhr

          Hi,

          leider gibt es keine Breakpoints aber man kann sich mit Serial.println Ausgaben erzeugen so das man von diesen einen Status ablesen kann. Der Fehler tut mir leid da ich den Bausatz nicht (noch nicht) habe und den Code validieren könnte.

          Ich würde das wiefolgt lösen: erstmal die Fernbedienung auslesen um die Codes zu erhalten. Dann Schritt für Schritt erst einen Motor ansteuern und dann den zweiten und dann beide.

          Mehr kann ich dir sagen wenn das Paket aus China angekommen ist.

          Gruß,

          Stefan Draeger

          Antworten
  5. Martin sagt:
    17. Februar 2023 um 17:17 Uhr

    Hallo Stefan,
    ich suche eine Schaltung zum Auslesen der Fernbedienung von meiner Klimaanlage, um sie per Arduino oder ESP8266 ein- bzw. auszuschalten. Leider erhalte ich folgenden Fehler:

    The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData. .
    -1
    Hast DU eine Idee?
    VG
    Martin

    Antworten
    1. Stefan Draeger sagt:
      17. Februar 2023 um 17:54 Uhr

      Hallo Martin,

      die Lösung dazu habe ich im englischen Beitrag https://draeger-it.blog/en/arduino-lesson-4-programming-ir-remote-control/ veröffentlicht (Abschnitt „Prevent message “The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData.”“)

      Gruß

      Stefan

      Antworten
  6. Pingback: Vorstellung RFID Starter Kit für den Arduino UNO R3 - Technik Blog
  7. Pingback: Review - Funduino-Cube - Technik Blog

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}