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);
