Go Down

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

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