Go Down

Topic: RGB led-fade via pot read (Read 2644 times) previous topic - next topic

Shebu

Echt super das neue Forum.

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.

Marcus W

Hallo,

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.


Shebu

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.

Megaionstorm

#3
Jan 28, 2011, 09:36 am Last Edit: Jan 31, 2011, 09:20 am by Megaionstorm Reason: 1
Dann nimm doch einfach 3 Potis, jeweils einen für den Rot-, Grün- und Blauanteil.

Dann hast Du auch die besagten Mischfarben !
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Marcus W

#4
Jan 28, 2011, 01:05 pm Last Edit: Jan 28, 2011, 01:11 pm by Marcus W Reason: 1
Schau dir folgendes Bild an:



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

Marcus W

#5
Jan 28, 2011, 03:09 pm Last Edit: Jan 28, 2011, 03:18 pm by Marcus W Reason: 1
Hab mich kurz hingesetzt und das Ding gebastelt...
Kann man bestimmt noch aufhübschen, aber es funktioniert.

Code: [Select]

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



Grüße
Marcus

Shebu

Vielen, vielen dank fuer den Code. Habe ihn mit einem RGB-Led ausprobiert und alles ging super.
Hier den wenig veraenderten Code:
Code: [Select]
[quote]
[color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] pPin = 0;            [color=#7E7E7E]// Pin des Potis[/color]
[color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] pVal, tempVal = 0;   [color=#7E7E7E]// Wert des Potis und TempVariable[/color]
[color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] pRes = 1023;         [color=#7E7E7E]// Maximalwert des Potis[/color]
[color=#CC6600]double[/color] pCol = 170;                [color=#7E7E7E]// 1024/6 = ca 170; Wertebereich der Farben[/color]

[color=#CC6600]double[/color] dr,dg,db = 0;              [color=#7E7E7E]// Double der Farben um dividieren zu können.[/color]
[color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] r,g,b = 0;           [color=#7E7E7E]// Int der Farben für absolute Werte[/color]

[color=#CC6600]int[/color] rLed = 2;                     [color=#7E7E7E]// Rotes Led[/color]
[color=#CC6600]int[/color] gLed = 3;                     [color=#7E7E7E]// Gruenes Led[/color]
[color=#CC6600]int[/color] bLed = 4;                     [color=#7E7E7E]// Blaues Led[/color]

[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]()
{
  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](9600);
}

[color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]()
{
  tempVal = pVal;
  pVal = [color=#CC6600]analogRead[/color](pPin);

  [color=#7E7E7E]// alle Farben auf null;[/color]
  r = g = b = 0;
     
  [color=#7E7E7E]// rot an [/color]
  [color=#CC6600]if[/color] (pVal < pCol)
  { 
    dr = pVal/pCol*256;
    r = ([color=#CC6600]int[/color])dr;
  }
  
  [color=#7E7E7E]// grün dazu[/color]
  [color=#CC6600]if[/color] (pVal < pCol*2 && pVal > pCol)
  {
    r = 255;
    dg = (pVal-pCol)/pCol*256;
    g = ([color=#CC6600]int[/color])dg;
  }
  
  [color=#7E7E7E]// rot weg[/color]
  [color=#CC6600]if[/color] (pVal < pCol*3 && pVal > pCol*2)
  {
    g = 255;
    dr = 256 - ((pVal-pCol*2)/pCol*256);
    r = ([color=#CC6600]int[/color])dr;
  }
  
  [color=#7E7E7E]// blau dazu[/color]
  [color=#CC6600]if[/color] (pVal < pCol*4 && pVal > pCol*3)
  {
    g = 255;
    db = (pVal-pCol*3)/pCol*256;
    b = ([color=#CC6600]int[/color])db;
  }
  
  [color=#7E7E7E]// grün weg[/color]
  [color=#CC6600]if[/color] (pVal < pCol*5 && pVal > pCol*4)
  {
    b = 255;
    dg = 256 - ((pVal-pCol*4)/pCol*256);
    g = ([color=#CC6600]int[/color])dg;
  }
  
  [color=#7E7E7E]// rot dazu[/color]
  [color=#CC6600]if[/color] (pVal <= pCol*6 && pVal > pCol*5)
  {
    b = 255;
    dr = (pVal-pCol*5)/pCol*256;
    r = ([color=#CC6600]int[/color])dr;
  }
  
  [color=#7E7E7E]// Freilauf des Potis am Ende - 100% Blau, 100% rot[/color]
  [color=#CC6600]if[/color] (pVal > 1015)
  {
    r=b=255;
  }
  [color=#7E7E7E]//Werte auf die Led schreieben[/color]
  [color=#CC6600]analogWrite[/color](rLed, r);
  [color=#CC6600]analogWrite[/color](gLed, g);
  [color=#CC6600]analogWrite[/color](bLed, b);
  
  
  [color=#7E7E7E]// nur bei Wertveränderung schreiben [/color]
  [color=#CC6600]if[/color] (tempVal != pVal)
  {
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"pval: "[/color]);
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](pVal);
    
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"  r:"[/color]);
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](r);
    
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"  g:"[/color]);
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](g);
  
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"  b:"[/color]);
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](b);
    
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]();
  }
  
}

[/quote]


Jetzt muss ich nur noch die Leds fuer die unterseite kaufen.

Go Up