Pages: [1]   Go Down
Author Topic: RGB led-fade via pot read  (Read 2395 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 61
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 61
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann nimm doch einfach 3 Potis, jeweils einen für den Rot-, Grün- und Blauanteil.

Dann hast Du auch die besagten Mischfarben !
« Last Edit: January 31, 2011, 03:20:51 am by Megaionstorm » Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 28, 2011, 07:11:00 am by Marcus W » Logged


Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab mich kurz hingesetzt und das Ding gebastelt...
Kann man bestimmt noch aufhübschen, aber es funktioniert.

Code:
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
« Last Edit: January 28, 2011, 09:18:22 am by Marcus W » Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 61
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen, vielen dank fuer den Code. Habe ihn mit einem RGB-Led ausprobiert und alles ging super.
Hier den wenig veraenderten Code:
Code:
[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.
Logged

Pages: [1]   Go Up
Jump to: