Das Stimmungslicht programmieren

Lektion
Downloads

Kommen wir also zur Praxis. Im folgenden Sketch bringst du die RGB-LED und die Fernbedienung samt IR-Empfänger zusammen. Am Ende wird ein Tastendruck von dir per switch … case identifiziert und das Licht der LED entsprechend umgeschaltet.

Beginnen musst du jedoch erst mit zwei Bibliotheken. Diesmal sind diese nicht im Bibliotheksverwalter zu finden, sondern befinden sich in den Downloads dieser Lektion. Lade dir die .ZIP-Datei herunter und entpacke sie. Du findest neben dem Sketch die Datei IR.h – lass diese einfach an Ort und Stelle liegen, damit sie vom Sketch gefunden werden kann.

Öffne nun als nächstes den Sketch in der Arduino IDE und binde die Bibliothek IRremote.zip über Sketch -> Bibliothek einbinen -> .ZIP-Bibliothek hinzufügen ein. Und das war es auch schon. Zu Beginn des Sketch integrierst du beide Bibliotheken wie gewohnt:

#include "IRremote.h"
#include "IR.h"

Als nächstes erstellst du mithilfe der Bibliotheken zwei Objekte, die du für Empfang und Verarbeitung deiner Befehle benötigst. Ebenso deklarierst du die Variablen für die Anschlüsse der RGB-LED.

___STEADY_PAYWALL___

IRrecv irrecv(RECEIVER);
decode_results results;

int ledRed = 10;
int ledGreen = 9;
int ledBlue = 8;

Die Setup-Funktion

Hier startest du den Seriellen Monitor, aktivierst den Infrarot-Empfänger und legst den jeweiligen pinMode für die Anschlüsse der RGB-LED fest.

void setup() {

  Serial.begin(9600);
  Serial.println("IR gestartet.");
  irrecv.enableIRIn();
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledRed, OUTPUT);
}

Der Loop

Im Loop des Sketchs wartet dein IR-Empfänger auf ein Signal von der Fernbedienung und reagiert per switch … case entsprechend darauf. Zunächst jedoch eine If-Abfrage, so wie du sie schon oft verwendet hast:

void loop() {
  
  if (irrecv.decode(&results)) {

Innerhalb der Klammern der If-Anweisung prüfst du, ob irrecv.decode(&results) == true ist – also wahr ist. Den Teil == true kannst du dir jedoch sparen –für diese Prüfung reicht es auch, wenn du einfach nur die Variable einträgst. Diese Prüfung bedeutet, dass dein IR-Empfänger ein Signal von der Fernbedienung empfangen hat. In diesem Fall wird der Code nach der geschweiften Klammer { ausgeführt, in dem geprüft wird, welche Taste denn gedrückt wurde.

Falls bei der Abfrage jedoch ein false herauskommt – also kein Signal empfangen wurde – wird weiter unten der Befehl irrecv.resume() ausgeführt, also weiter auf ein Signal gewartet.

Switch … Case

Nun zum Kernstück: Die Abfrage, welche Taste gedrückt wurde und die entsprechende Einstellung der RGB-LED. Zunächst leitest du mit switch und der Variablen, auf deren Inhalt du reagieren möchtest, ein. Diese Variable heißt hier results.value.

switch (results.value) {

In diesem Projekt sind nur die Tasten 0 bis 3 mit Funktionen belegt. Die Null schaltet die LED aus, die Tasten 1 bis 3 schalten die Lichtfarbe um. Also benötigst du ingesamt 4 case-Abfragen. Hier die erste:

case 0xFF6897:
  Serial.println("0");
  digitalWrite(ledRed, LOW);
  digitalWrite(ledGreen, LOW);
  digitalWrite(ledBlue, LOW);
  break;

Dies ist die Abfrage für die Taste 0 (Null). Wie du siehst, wird hier der Name der Taste im Seriellen Monitor ausgegeben und alle Kanäle der RGB-Led ausgeschaltet, also auf LOW gesetzt. Doch was bedeutet 0xFF6897 hinter case?

Hierbei handelt es sich um eine Zahl im Hexadezimalsystem, die die Taste 0 repräsentiert. Diese Zahl wird von der Fernbedienung gesendet, indem sie ein entsprechendes Signal per Pulsweitenmodulation generiert und per Infrarot sendet. Dieses Signal wird dann im Empfänger dekodiert und, wie in diesem Fall, verwendet, um verschiedene Tasten der Fernbedienung zu unterscheiden.

Im Sketch dieses Projekts findest du nur die Hexadezimal-Codes für die Tasten 0 bis 3. Am Ende dieser Lektion findest du jedoch eine vollständige Liste für alle Tasten deiner Fernbedienung.

Schauen wir uns noch einen weiteren Fall an: Die Taste 1.

case 0xFF30CF:
  Serial.println("1");
  digitalWrite(ledRed, HIGH);
  digitalWrite(ledGreen, LOW);
  digitalWrite(ledBlue, LOW);
  break;

Hier wird nur der rote Kanal der LED auf HIGH geschaltet, die anderen beiden verbleiben auf LOW – die LED leuchtet also in einem satten Rot. Sobald das passiert ist, folgt der Befehl break, mit dem der code aus diesem case wieder herausspringt sich dann wieder im Loop befindet – und auf das nächste Signal wartet.

Und das war es auch schon. Im Sketch folgen noch zwei weitere Fälle für die Tasten 2 und 3. Du kannst aber natürlich noch viel mehr Lichtfarben definieren und sie mit Tasten deiner Wahl einstellen. Hier ist die vollständige Liste der Tasten und ihrer Hexadezimal-Codes:

switch(results.value) {
  case 0xFFA25D: Serial.println("POWER"); break;
  case 0xFFE21D: Serial.println("FUNC/STOP"); break;
  case 0xFF629D: Serial.println("VOL+"); break;
  case 0xFF22DD: Serial.println("FAST BACK"); break;
  case 0xFF02FD: Serial.println("PAUSE"); break;
  case 0xFFC23D: Serial.println("FAST FORWARD"); break;
  case 0xFFE01F: Serial.println("DOWN"); break;
  case 0xFFA857: Serial.println("VOL-"); break;
  case 0xFF906F: Serial.println("UP"); break;
  case 0xFF9867: Serial.println("EQ"); break;
  case 0xFFB04F: Serial.println("ST/REPT"); break;
  case 0xFF6897: Serial.println("0"); break;
  case 0xFF30CF: Serial.println("1"); break;
  case 0xFF18E7: Serial.println("2"); break;
  case 0xFF7A85: Serial.println("3"); break;
  case 0xFF10EF: Serial.println("4"); break;
  case 0xFF38C7: Serial.println("5"); break;
  case 0xFF5AA5: Serial.println("6"); break;
  case 0xFF42BD: Serial.println("7"); break;
  case 0xFF4AB5: Serial.println("8"); break;
  case 0xFF52AD: Serial.println("9"); break;
  case 0xFFFFFFFF: Serial.println("REPEAT");break;  
}

Hast du Fragen?

Schreibe uns an info@polluxlabs.net