Eine Android App um jede RGB-LED zu steuern

Uli Eckstein
Blog von BRICKMAKERS
4 min readNov 29, 2017

*Den Beitrag in voller Länge findet ihr jetzt HIER*

Vor ein paar Monaten gab es in einem großen deutschen Discounter ein unwiderstehliches Angebot: vier LED-Unterbauspots für knapp 15€. Perfekt um die stromfressenden Halogenspots in meinem Bücherregal zu ersetzen. Darüber hinaus wurde mit dem vollen RGB Farbspektrum geworben, was meine Spontankauf-Entscheidung dann vollends besiegelte.

Zuhause angekommen dann erstmal eine herbe Enttäuschung. Das Icon mit dem Farbspektrum hatte mich über das Kleingedruckte hinweglesen lassen: “1 Farbwechsel-Programm und 7 konstante Einzelfarben”. Ziemlich dürftig also. Noch dazu lassen sich die Farben nur über einen Hardware-Button am Stromkabel durchschalten. Für eine Beleuchtung die hinter den Büchern versteckt liegen soll also völlig inakzeptabel.

Nun waren die Spots aber schon mal gekauft und der Entschluss einer schicken neuen Beleuchtung war getroffen, da wollte ich mich von derartigen Kleinigkeiten nicht von meinem Vorhaben abhalten lassen. Der erste Schritt war also eine Analyse der benötigten Hardware.

Teil 1: Hardware

Bedarfsanalyse

Um eine Verbindung zur Android App herzustellen verwende ich den ESP8266 WiFi Chip. Glücklicherweise gibt es auch einen Arduino-Clone, der diesen Chip direkt auf dem Board integriert hat, was mir etwas Arbeit spart.

Nun muss nur noch die Frage geklärt werden, wie ich den Arduino dazu bringe, mit seinen 5V Ausgangsspannung die 12V der LEDs zu schalten. Die Antwort darauf heißt NPN Transistoren.

Die vollständige Hardware-Einkaufsliste lautet also:
- WeMos D1 WiFi Board (~3,60€)
- BC547B Transistoren (~1,50€ / 100 Stück)
- 220Ω Widerstände (~1€ / 100 Stück)
- Breadboard (~1,50€)
- Jumper-Kabel male-to-male (~1€ / 40 Stück)

Die Gesamtkosten des Projekts (ausschließlich LEDs) belaufen sich also auf etwa 8,60€, wobei diese Rechnung auch etwas überdimensioniert ist, da man natürlich nicht 100 Widerstände und Transistoren benötigt, sondern lediglich drei Transistoren pro LED und drei Widerstände insgesamt.

Verkabelung

Der technische Aufbau ist vergleichweise einfach. Die NPN Transistoren haben drei Pins: Collector, Base und Emitter. Wird an die Base eine Spannung angelegt, so schaltet der Transistor den Strom vom Collector zum Emitter durch. Also wird der Collector mit der LED verbunde und der Emitter mit GND. Die Base wird mit dem Pin des Arduino verbunden, hier wird allerdings noch ein 220Ω Widerstand zwischengeschaltet.

Unten im Schaltbild wäre der Anschluss der LED, links und oben sind die jeweiligen Anschlüsse am Arduino vermerkt. Möchte man mehrere LEDs in der gleichen Farbe schalten, so benötigt man für jede LED drei eigene BC547B Transistoren, da ansonsten die Leuchtkraft pro LED nachlässt (die Base-Pins der jeweiligen Transistoren können dann miteinander verbunden werden, so spart man sich die zusätzlichen Wiederstände).

Diese Schaltung funktioniert für RGB-LEDs mit gemeinsamer Versorgungsspannung (Common Anode). Für RGB-LEDs mit gemeinsamer Masse (Common Cathode) ist ein etwas komplexerer Aufbau mithilfe von zusätzlichen PNP Transistoren notwendig, der hier beschrieben ist:

Möchte man mehr als einen Spot bzw. einen LED-Strip über die gleichen Arduino-Pins ansteuern, so sollte man dem zweiten Anschluss jeweils eigene Transistoren verbauen, da sich ansonsten die Leuchtkraft pro LED verringert.

Ein Hinweis noch: Damit die Transistoren korrekt schalten ist es wichtig, dass alle Bauteile mit dem gleichen Stromkreis verbunden sind. In meinem ersten Versuch hatte ich den Arduino über das USB-Verbindungskabel meines Rechners versorgt, während die LEDs über ihr eigenes Netzteil versorgt wurden. Die Fehlersuche dauerte ewig…

Die fertige Verkabelung auf meinem Breadboard

Es werde Licht

Jetzt wird es Zeit zu testen, ob alles wie erwartet funktioniert. Hierfür habe ich mir ein kleines Arduino Programm geschrieben, das nacheinander ein paar Farben durchschaltet.

int LEDblue = D5;   // Blau an Pin 5
int LEDgreen= D6; // Gruen an Pin 6
int LEDred = D7; // Rot an Pin 7
void setup() {
pinMode(LEDblue, OUTPUT);
pinMode(LEDgreen, OUTPUT);
pinMode(LEDred, OUTPUT);
}
void loop() {
setColor(255,0,0);
delay(1000);
setColor(0,255,0);
delay(1000);
setColor(0,0,255);
delay(1000);
setColor(0,0,100);
delay(1000);
}
void setColor(int red, int green, int blue){
analogWrite(LEDred, red);
analogWrite(LEDgreen, green);
analogWrite(LEDblue, blue);
}

Zuerst definiere ich die Konstanten für meine Pin-Belegung und lege in der Setup-Methode die entsprechenden Pins als Output-Pins fest.

Ganz unten in der Methode “setColor” schreibe ich dann über “analogWrite” die übergebenen Werte auf den jeweiligen Ausgangs-Pin. Zu beachten ist, dass ich mit analogWrite die Pulse-Width-Modulation des Arduino verwende, die Werte von 0 bis 255 übergeben bekommen kann. Mein WeMos Board hat PWM-Funktionalität für alle Pins verbaut, beim originalen Arduino Uno ist dies nicht der Fall, also achtet bei der Pin Auswahl darauf.

In der “loop” Methode schalte ich einfach vier Farben durch und lasse das Board zwischendurch jeweils eine Sekunde Pause machen. Es sollten nacheinander Rot, Grün, Blau und ein etwas dunkleres Blau erscheinen. Die ersten drei Farben zeigen mir, dass ich alle Pins korrekt angeschlossen habe, das blasse Blau bestätigt, dass die Pulse-Width-Modulation auch tatsächlich funktioniert.

Teil 2: Der Arduino-Code

--

--