Realistische LED-Kerzen
Es gibt ja zu Hauf "LED Kerzen" bei Amazon für wenige Euro zu kaufen. Allerdings sehen die meistens nicht sehr nach Kerze aus. Da ich jedes Jahr im Winter zur Dekoration Kerzen benötige und aus Sicherheitsgründen vor ein paar Jahren auf LED-Kerzen umgestiegen bin, wollte ich das einmal "richtig" machen - naja zumindest "richtiger".
Der erste Grund, warum LED-Kerzen immer kacke aussehen, ist die Lichtfarbe. Meistens bestehen die Kerzen aus einer LED, die mehr oder weniger gelbes Licht erzeugt. Manche Bastelanleitungen im Internet empfehlen eine gelbe und eine rote LED zu nehmen. Kerzenlicht ist aber viel "kälter" als man das so denkt, wie man im direkten Vergleich ganz gut erkennen kann. Daher habe ich eine RGB-LED mit mattem Köpfchen genommen und die einzelnen Kanäle mithilfe des Vorwiderstands gedimmt.
Das Ergebnis konnte einer kurzen Twitter-Umfrage stand halten. Die Vorwiderstände variieren vermutlich stark von LED zu LED und auch ein bisschen nach "Geschmack" welche Lichtfarbe persönlich am besten gefällt. Dennoch als Richtwerte hier die Vorwiderstände, die ich benutzt habe. Rot: 150Ω, Grün: 690Ω, Blau: 10kΩ.
Auf einer Lochrasterplatine lassen sich die Teile platzsparend und sicher anbringen. Anschließend kann man sie in das Gehäuse einer billigen LED-Kerze stecken, wenn man die originale LED rausbricht.
Ich wollte aber, dass die Lichter auch ein bisschen flackern. Also zwei ULN2003 Darlington-Transistor arrays als Treiber an einen Arduino Uno angeschlossen (meine LEDs fressen bis zu 60mA pro Stück - bei 13 LEDs viel mehr, als der Uno pro bereitstellen kann). Der IC ist glaube ich zwar etwas überdimensioniert, aber von Elektrotechnik versteh ich zu wenig um auf die schnelle was besseres zu finden und die Dinger sind billig.
Für den Code griff ich zunächst auf
einen Blogpost zurück. Der dortige
Code funktioniert auch prima, aber nicht bei 13 LEDs. Denn das Flackern wird immer für
eine ganze LED auf einmal durchgeführt, was dazu führt, dass die Kerzen über kurz
oder lang sequentiell flackern, weil die aktuelle LED die Aktivierung einer weiteren
verhindert. Ein kurzer Versuch, das Problem mit einer scheduling library zu lösen war
nicht erfolgreich, weil die Library beim delay
-call nicht die Kontrolle übernimmt und
andere Tasks einscheduled. Ausgehend dem Code aus den Blogpost, habe ich daher eine
Kerzen-Klasse erstellt, die die Kontrolle beim Flackern nicht an sich reißt.
Schlussendlich flackern Kerzen meistens aufgrund von leichten Luftbewegungen und daher gleich mehrere auf einmal. Dass "zufällige Flackern" sah nur auf den ersten Blick realistisch aus. Erst als ich den Code dahingehend erweitert habe, dass nebeneinander platzierte Kerzen gleichzeitig flackern, wurden die Kerzen glaubwürdig.
Hier is der Code. Ich hab mir jetzt nicht die Mühe gemacht, Header und Implementierung zu trennen, denn mein C++ is etwas eingerostet und, hey, es is n arduino-Fummel-Projekt.