Infrarot-Fernbedienung mit dem Arduino auswerten

FunduinoZuletzt aktualisiert am

Tastencodes einer Fernbedienung einlesen und damit etwas schalten

Eine Fernbedienung sendet ihre Befehle als unsichtbares Infrarotlicht. Mit einem kleinen Empfängerbaustein kann der Arduino diese Befehle mitlesen – und du kannst damit alles steuern, was an deinem Board hängt.

In dieser Anleitung findest du zuerst heraus, welchen Zahlencode jede Taste deiner Fernbedienung sendet. Danach schaltest du damit eine LED ein und aus.

Kleine Infrarot-Fernbedienung mit Zifferntasten und Pfeiltasten
Die Infrarot-Fernbedienung aus dem Lernset

Wie eine Infrarot-Fernbedienung funktioniert

Mit einem Infrarotempfänger kann der Arduino die Befehle einer Infrarot-Fernbedienung empfangen und auswerten. Die Daten wandern dabei als Infrarotlicht von der Fernbedienung zum Empfänger. Unser Auge nimmt dieses Licht nicht wahr.

Mit einem kleinen Trick kannst du trotzdem prüfen, ob eine Fernbedienung sendet: Richte eine Digitalkamera darauf – die vom Smartphone genügt – und sieh dir die Infrarotdiode auf dem Display an. Drückst du eine Taste, siehst du die Diode leuchten. Kamerasensoren nehmen Infrarotlicht nämlich wahr. Das Licht flackert dabei leicht, weil die Diode sehr schnell an- und ausgeht. Dahinter steckt ein bestimmter Rhythmus, an dem der Empfänger später erkennt, welche Taste gedrückt wurde.

Infrarot-Fernbedienungen begegnen dir ständig:

  • Lautstärke ändern und Programme am Fernseher wechseln
  • Temperatur an Heizkörperthermostaten einstellen
  • Garagentore öffnen und schließen
  • Steckdosen ein- und ausschalten
Kleine Infrarot-Fernbedienung mit Zifferntasten und Pfeiltasten
Die Infrarot-Fernbedienung aus dem Lernset

Empfänger anschließen

Im Empfänger VS1838B steckt eine Fotodiode. Sie fängt das Infrarotlicht auf, und die Elektronik des Bausteins wandelt es in einen Zahlencode um. Diesen Code fragst du im Sketch ab und löst damit eine Aktion aus.

Baue die Schaltung nach dem Schaltplan auf. Der Signalpin des Empfängers kommt in diesem Beispiel an Pin 11. Achte auf die Pinbelegung – sie ist nicht bei allen Infrarotempfängern gleich.

Schaltplan mit Infrarot-Empfänger VS1838B am Arduino UNO
Schaltplan: der Infrarot-Empfänger am Arduino
Pinbelegung des Infrarot-Empfängers VS1838B
Pinbelegung des Empfängers VS1838B
1 / 2

Tastencodes auslesen

Jede Taste sendet einen eigenen Zahlencode. Der Sketch liest diesen Code ein und zeigt ihn am seriellen Monitor an – zusammen mit der Taste, die bei unserer Fernbedienung dazu gehört.

Drückst du die Taste „A“, erscheint am seriellen Monitor: Dezimalwert: 69 -> A

Wenn deine Fernbedienung andere Werte liefert, ist das normal: Die Zuordnung gilt für das Modell aus unserem Lernset. Die Dezimalwerte aus dem seriellen Monitor trägst du dann einfach in den Sketch ein.

Die Sketche verwenden die Schreibweise der Bibliothek IRremote ab Version 3 (IrReceiver.begin, IrReceiver.decodedIRData). Ältere Anleitungen im Netz nutzen häufig noch die Schreibweise der Version 2 mit irrecv und results.value – die beiden lassen sich nicht mischen. Installiere IRremote über die Bibliotheksverwaltung, dann bekommst du die aktuelle Version.

Tastencodes der Fernbedienung auslesen
// Das Programm greift hier auf eine Bibliothek zurück. Das erspart viel Arbeit: Das
// Infrarotlicht wird verschlüsselt gesendet, und um diesen Code selbst auszulesen und
// in passende Werte umzuwandeln, wären sehr viele Zeilen Code nötig.
#include <IRremote.h>

int EmpfaengerPin = 11;  // der Pin, an dem der Infrarot-Empfänger angeschlossen ist

void setup()
{
  Serial.begin(9600);               // Seriellen Monitor starten
  IrReceiver.begin(EmpfaengerPin);  // Infrarot-Empfänger starten
}

void loop()
{
  if (IrReceiver.decode())  // decode() prüft, ob Daten vorhanden sind
  {
    delay(200);           // kurze Pause, damit nur ein Tastendruck gelesen wird
    IrReceiver.resume();  // resume() liest den nächsten Wert

    /*
      Der Empfänger empfängt zwischendurch Signale, die sich nicht auswerten lassen.
      Ausgewertet werden sollen deshalb nur die korrekt erkannten Tasten. Deren
      Dezimalwerte liegen zwischen 0 und 95. Die folgende Zeile fragt ab, ob das
      empfangene Kommando decodedIRData.command größer als 0 UND (&&) kleiner als 95 ist.
    */
    if (IrReceiver.decodedIRData.command > 0 && IrReceiver.decodedIRData.command < 95)
    {
      // Der Text "Dezimalwert: " erscheint am seriellen Monitor, danach der Wert selbst.
      Serial.print("Dezimalwert: ");
      // decodedIRData.command ist der Wert der gedrückten Taste.
      Serial.print(IrReceiver.decodedIRData.command);
      // Der Pfeil trennt den Wert von der zugeordneten Taste auf der Fernbedienung.
      Serial.print(" -> ");

      // Die Dezimalzahl 69 entspricht bei unserer Fernbedienung der Taste "A", und so weiter.
      if (IrReceiver.decodedIRData.command == 69) Serial.println("A");
      if (IrReceiver.decodedIRData.command == 70) Serial.println("Pfeil oben");
      if (IrReceiver.decodedIRData.command == 71) Serial.println("B");
      if (IrReceiver.decodedIRData.command == 68) Serial.println("Pfeil links");
      if (IrReceiver.decodedIRData.command == 64) Serial.println("X");
      if (IrReceiver.decodedIRData.command == 67) Serial.println("Pfeil rechts");
      if (IrReceiver.decodedIRData.command ==  7) Serial.println("0");
      if (IrReceiver.decodedIRData.command == 21) Serial.println("Pfeil unten");
      if (IrReceiver.decodedIRData.command ==  9) Serial.println("C");
      if (IrReceiver.decodedIRData.command == 22) Serial.println("1");
      if (IrReceiver.decodedIRData.command == 25) Serial.println("2");
      if (IrReceiver.decodedIRData.command == 13) Serial.println("3");
      if (IrReceiver.decodedIRData.command == 12) Serial.println("4");
      if (IrReceiver.decodedIRData.command == 24) Serial.println("5");
      if (IrReceiver.decodedIRData.command == 94) Serial.println("6");
      if (IrReceiver.decodedIRData.command ==  8) Serial.println("7");
      if (IrReceiver.decodedIRData.command == 28) Serial.println("8");
      if (IrReceiver.decodedIRData.command == 90) Serial.println("9");
    }
  }
}

Erweiterung: Eine LED mit der Fernbedienung schalten

Jetzt soll ein Druck auf die Taste „1“ eine LED einschalten und ein Druck auf die Taste „2“ sie wieder ausschalten. Damit du nichts neu verkabeln musst, verwendest du die Onboard-LED an Pin 13.

Erweiterung: LED mit der Fernbedienung schalten
#include <IRremote.h>

int EmpfaengerPin = 11;
int LED = 13;  // Pin der LED

void setup()
{
  IrReceiver.begin(EmpfaengerPin);
  pinMode(LED, OUTPUT);  // Pin 13 wird als Ausgang definiert.
}

void loop()
{
  if (IrReceiver.decode())  // Prüfen, ob Daten vorhanden sind
  {
    IrReceiver.resume();  // nächsten Wert lesen

    if (IrReceiver.decodedIRData.address == 0)
    {
      // Taste 1 -> gelesener Dezimalwert 22 -> LED einschalten
      if (IrReceiver.decodedIRData.command == 22) digitalWrite(LED, HIGH);
      // Taste 2 -> gelesener Dezimalwert 25 -> LED ausschalten
      if (IrReceiver.decodedIRData.command == 25) digitalWrite(LED, LOW);
    }
  }
}
Anleitung bewerten

Kommentare

Frage stellen oder Erfahrung teilen

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Wir prüfen jeden Kommentar vor der Veröffentlichung. Deine E-Mail-Adresse bleibt bei uns.