In diesem Artikel beschreibe ich eine Technik, mit der man RGB-LEDs, d.h. LEDs die alle Farben des RGB-Farbraums darstellen können, auf die jeweilige Farbei stufenlos einzustellt.
Erklärung
Eine RGB-LED kann die verschiedensten Farben darstellen, welche über Rot, Grün und Blau zusammengemischt werden. Als Verbesserung des Espruino-Tutorials habe ich einen stufenlosen Farbwechsel eingebaut und verschiedene Farben für die Anzeige vordefiniert. Damit kann man die volle Leistung aus einer RGB-LED herauskitzeln.
Schaltungsaufbau
Verbindungsübersicht
RGB-LED | Kabel Espruino |
Fuß für Kathode | GND |
Fuß für Rot | C7 |
Fuß für Grün | C8 |
Fuß für Blau | C9 |
Programmcode
Im ersten Teil wird die Pin-Belegung festgelegt und das dictionary colors enthält den Farbnamen und den zugehörigen Farbwert [R,G,B]=[255,0,0]=rot. Die Funktion setColor(red, green, blue) schreibt die ihr übergebenen Farbwerte. Der dynamische Wechsel erfolgt über dim(color). Die Funktion setColor(red, green, blue) pulst die jeweilige Farbe mit (PWM bzw. pulse-width-modulation kommt zum Einsatz):
analogWrite(redPin, red / 255, {freq:70});
Dabei ist „red / 255“ der Duty-Cycle und „{freq:70}“ die Frequenz mit der gepulst wird. Eine schöne Erklärung findet man in einem Youtube Video:
Hier der Quellcode:
var redPin = C7; var greenPin = C8; var bluePin = C9; var red=0; var green=0; var blue=0; var colors = {red:[255,0,0],green:[0,255,0],blue:[0,0,255], purple:[80, 0, 80], yellow:[255, 255, 0], aqua:[0, 255, 255], white:[255, 255, 255]}; function setColor(red, green, blue) { analogWrite(redPin, red / 255, {freq:70}); analogWrite(greenPin, green / 255, {freq:70}); analogWrite(bluePin, blue / 255, {freq:70}); //print(red,green,blue); } function dim(color){ r=color[0]; g=color[1]; b=color[2]; if (int !== "undefined") { clearInterval(int); //print("lösche int"); } var int = setInterval(function(){ var flag1; var flag2; var flag3; if (red > r) { red=red-5; } else if (red < r) { red=red+5; } else { flag1=1; } if (green > g) { green=green-5; } else if (green < g) { green=green+5; } else { flag2=1; } if (blue > b) { blue=blue-5; } else if (blue < b) { blue=blue+5; } else { flag3=1; } setColor(red, green, blue); if (flag1&&flag2&&flag3){ //print("return"); clearInterval(int); return true; } },50); }
Die Farben werden wie folgt angezeigt:
//zeigt rot dim(colors.red); //zeigt gelb dim(colors.yellow);