Hallo, ich mochte die Farbe von mehreren RGB leds via einem pot andern. Es ware schon dass ich das muster von der adobeRGB oder rainbow durchlaufen kann. Die leds sollen unter main Gehause kommen. Je nach lust drehe ich am poti und die Farbe andert sich.
was du beschreibst ist gar nicht so aufwendig. Im Grunde muss du niur den Wert des Potis auslesen und dementsprechend die Farbe zuweisen. Teil den Wertebereich (von minimum aufgedreht bis maximum aufgedreht) durch die Anzahl der Farben, die du durchlaufen willst und fahre im loop eine abfrage welchen Wert der Poti hat. Ist er im ersten bereich, stellst du rot ein, im zweiten grün und so weiter.
Uber das habe ich auch nachgedacht. Es ist mir doch etwas zu umstandlich, Ich will auch die Zwischenfarben. Wenn es nicht anders geht dann werde ich es so machen, werde ein Paar farben den verschiedenen Potiwerten zuordnen. Benutze viele if's unc case's.
Dies ist das Bild einer additiven Farbmischung auf Basis des RGB-Farbraums.
Deutlicher wird es auf diesem Bild:
Wenn du deinen Wertebereich so aufteilst, hast du die drei Grundfarben plus der Komplimentärfarben in allen Zwischenstufen. Ein zweiter Potti könnte auch noch den Weißwert steuern. Ein ordentlicher Weißfade ist mit einem eindimensionalen (+/-) Eingabegerät nicht möglich, da ein Farbmodell 2-dimensional aufgebaut ist (+/- , Weißwert)
Wenn du statt eines Potis einen Drehencoder benutzen würdest, könntest die Auflösung erhöhen. dann hättest du pro Durchlauf zum Beispiel 256 Stufen.
Ein Beispiel:
einmal rundrum: 256 Stufen Rot
nochmal rundrum + 256 Stufen Grün
nochmal rundrum - 256 Stufen rot
nochmal rundrum + 256 Stufen Blau
nochmal rundrum - 256 Stufen Grün
nochmal rundrum + 256 Stufen Rot
nochmal rundrum + 256 Stufen Blau
Eine solche Auflösung bekommt man allerdings nur mit einem Drehencoder hin - beim Poti wäre es ein arges gefummel.
Gruß
Marcus
Hab mich kurz hingesetzt und das Ding gebastelt...
Kann man bestimmt noch aufhübschen, aber es funktioniert.
unsigned int pPin = 0; // Pin des Potis
unsigned int pVal, tempVal = 0; // Wert des Potis und TempVariable
unsigned int pRes = 1023; // Maximalwert des Potis
double pCol = 170; // 1024/6 = ca 170; Wertebereich der Farben
double dr,dg,db = 0; // Double der Farben um dividieren zu können.
unsigned int r,g,b = 0; // Int der Farben für absolute Werte
void setup()
{
Serial.begin(9600);
}
void loop()
{
tempVal = pVal;
pVal = analogRead(pPin);
// alle Farben auf null;
r = g = b = 0;
// rot an
if (pVal < pCol)
{
dr = pVal/pCol*256;
r = (int)dr;
}
// grün dazu
if (pVal < pCol*2 && pVal > pCol)
{
r = 255;
dg = (pVal-pCol)/pCol*256;
g = (int)dg;
}
// rot weg
if (pVal < pCol*3 && pVal > pCol*2)
{
g = 255;
dr = 256 - ((pVal-pCol*2)/pCol*256);
r = (int)dr;
}
// blau dazu
if (pVal < pCol*4 && pVal > pCol*3)
{
g = 255;
db = (pVal-pCol*3)/pCol*256;
b = (int)db;
}
// grün weg
if (pVal < pCol*5 && pVal > pCol*4)
{
b = 255;
dg = 256 - ((pVal-pCol*4)/pCol*256);
g = (int)dg;
}
// rot dazu
if (pVal <= pCol*6 && pVal > pCol*5)
{
b = 255;
dr = (pVal-pCol*5)/pCol*256;
r = (int)dr;
}
// Freilauf des Potis am Ende - 100% Blau, 100% rot
if (pVal > 1015)
{
r=b=255;
}
// nur bei Wertveränderung schreiben
if (tempVal != pVal)
{
Serial.print("pval: ");
Serial.print(pVal);
Serial.print(" r:");
Serial.print(r);
Serial.print(" g:");
Serial.print(g);
Serial.print(" b:");
Serial.print(b);
Serial.println();
}
}