Go Back   Science Forums Biology Forum Molecular Biology Forum Physics Chemistry Forum > Regional Molecular Biology Discussion > Forum Physik
Register Search Today's Posts Mark Forums Read

Forum Physik Forum Physik.


komplettes sichtbares Spektrum über LEDs wiedergeben

komplettes sichtbares Spektrum über LEDs wiedergeben - Forum Physik

komplettes sichtbares Spektrum über LEDs wiedergeben - Forum Physik.


Reply
 
LinkBack Thread Tools Display Modes
  #1  
Old 09-22-2004, 12:44 PM
Martin Meier \(MMC\)
Guest
 
Posts: n/a
Default komplettes sichtbares Spektrum über LEDs wiedergeben



Hallo zusammen!

Ich möchte eine Lampe (zur Dekorationsbeleuchtung) bauen, die von selber das
komplette Spektrum des sichtbaren Lichts "durchfährt".

Dazu setze ich einen Atmel-µC ein, der die PWM-Ansteuerung der roten, grünen
und blauen LEDs macht und somit die Helligkeit der einzelnen LEDs regelt.

Meine Frage: mit welchem Algorithmus muss ich die 3 Helligkeitswerte verändern,
so dass alle möglichen Farben dargestellt werden und möglichst weiche Über-
gänge zwischen den Farben erfolgen ?

Vielen Dank,
Martin


Reply With Quote
  #2  
Old 09-22-2004, 01:30 PM
Patrick Schalberger
Guest
 
Posts: n/a
Default komplettes sichtbares Spektrum über LEDs wiedergeben


"Martin Meier (MMC)" <[Only registered users see links. ]> schrieb im Newsbeitrag
news:cirs13$2jb$03$[Only registered users see links. ]...

Das komplette Spektrum kannst du auf diese Art leider nicht darstellen, da
Spektralfarben sich nicht durch Mischen erzeugen lassen (Die LEDs selber
erzeugen auch keine reinen Spektralfarben). Aber du kommst recht nahe ran,
indem du z.B. mit Rot beginnst und es langsam abdunkelst. In gleichem Maß
erhöhst du die intensität von Grün, bis Grün voll leuchtet und Rot aus ist.
Das selbe machst du mit Blau und am Ende wieder mit Rot.
Ich habe das mal auf einem Atmel Tiny 12 mit einer RGB-LED realisiert.

Gruß,
Patrick


Reply With Quote
  #3  
Old 09-22-2004, 01:37 PM
Markus Gronotte
Guest
 
Posts: n/a
Default komplettes sichtbares Spektrum über LEDs wiedergeben


"Martin Meier (MMC)"



verändern,

Also ich seh das richtig, dass du einen Algorithmus in C dafür nutzen willst,
ja?

Falls den so ist, habe ich einen Codeschnipsel aus Pascal/Delphi für dich, der
zwischen RGB- und HSL-Farbräumen hin- und herkonvertieren kann. Diesen Code
kann man problemlos nach C übersetzen. Du musst nur darauf achten, dass
die drei Farben in RGB nicht gleich gewichtet sind.

lg,

Markus

PS: HSL steht für Hue(Farbtemperatur),Sättigung,Luminanz(Helligkeit)


//------------------------------------------------------------------------------
//
// HSL - RGB colour model conversions
//
// These four functions can be used to convert between the RGB and HSL colour
// models. RGB values are represented using the 0-255 Windows convention and
// always encapsulated in a TColor 32 bit value. HSL values are available as
// either 0 to 1 floating point (double) values or as a 0 to a defined integer
// value. The colour common dialog box uses 0 to 240 by example.
//
// The code is based on that found (in C) on:
//
// http:/www.r2m.com/win-developer-faq/graphics/8.html
//
// Grahame Marsh 12 October 1997
//
// Freeware - you get it for free, I take nothing, I make no promises!
//
// Please feel free to contact me: [Only registered users see links. ]
//
// Revison History:
// Version 1.00 - initial release 12-10-1997
//
//------------------------------------------------------------------------------


unit HSLUtils;

interface

uses
Windows, Graphics;

var
HSLRange : integer = 255;

// convert a HSL value into a RGB in a TColor
// HSL values are 0.0 to 1.0 double
function HSLtoRGB (H, S, L: double): TColor;

// convert a HSL value into a RGB in a TColor
// SL values are 0 to the HSLRange variable
// H value is to HSLRange-1
function HSLRangeToRGB (H, S, L : integer): TColor;

// convert a RGB value (as TColor) into HSL
// HSL values are 0.0 to 1.0 double
procedure RGBtoHSL (RGB: TColor; var H, S, L : double);

// convert a RGB value (as TColor) into HSL
// SL values are 0 to the HSLRange variable
// H value is to HSLRange-1
procedure RGBtoHSLRange (RGB: TColor; var H, S, L : integer);

implementation

function HSLtoRGB (H, S, L: double): TColor;
var
M1,
M2: double;

function HueToColourValue (Hue: double) : byte;
var
V : double;
begin
if Hue < 0 then
Hue := Hue + 1
else
if Hue > 1 then
Hue := Hue - 1;

if 6 * Hue < 1 then
V := M1 + (M2 - M1) * Hue * 6
else
if 2 * Hue < 1 then
V := M2
else
if 3 * Hue < 2 then
V := M1 + (M2 - M1) * (2/3 - Hue) * 6
else
V := M1;
Result := round (255 * V)
end;

var
R,
G,
B: byte;
begin
if S = 0 then
begin
R := round (255 * L);
G := R;
B := R
end else begin
if L <= 0.5 then
M2 := L * (1 + S)
else
M2 := L + S - L * S;
M1 := 2 * L - M2;
R := HueToColourValue (H + 1/3);
G := HueToColourValue (H);
B := HueToColourValue (H - 1/3)
end;

Result := RGB (R, G, B)
end;

function HSLRangeToRGB (H, S, L : integer): TColor;
begin
Result := HSLToRGB (H / (HSLRange-1), S / HSLRange, L / HSLRange)
end;

// Convert RGB value (0-255 range) into HSL value (0-1 values)

procedure RGBtoHSL (RGB: TColor; var H, S, L : double);

function Max (a, b : double): double;
begin
if a > b then
Result := a
else
Result := b
end;

function Min (a, b : double): double;
begin
if a < b then
Result := a
else
Result := b
end;

var
R,
G,
B,
D,
Cmax,
Cmin: double;

begin
R := GetRValue (RGB) / 255;
G := GetGValue (RGB) / 255;
B := GetBValue (RGB) / 255;
Cmax := Max (R, Max (G, B));
Cmin := Min (R, Min (G, B));

// calculate luminosity
L := (Cmax + Cmin) / 2;

if Cmax = Cmin then // it's grey
begin
H := 0; // it's actually undefined
S := 0
end else begin
D := Cmax - Cmin;

// calculate Saturation
if L < 0.5 then
S := D / (Cmax + Cmin)
else
S := D / (2 - Cmax - Cmin);

// calculate Hue
if R = Cmax then
H := (G - B) / D
else
if G = Cmax then
H := 2 + (B - R) /D
else
H := 4 + (R - G) / D;

H := H / 6;
if H < 0 then
H := H + 1
end
end;

procedure RGBtoHSLRange (RGB: TColor; var H, S, L : integer);
var
Hd,
Sd,
Ld: double;
begin
RGBtoHSL (RGB, Hd, Sd, Ld);
H := round (Hd * (HSLRange-1));
S := round (Sd * HSLRange);
L := round (Ld * HSLRange);
end;

end.




Reply With Quote
  #4  
Old 09-22-2004, 02:03 PM
Martin Meier \(MMC\)
Guest
 
Posts: n/a
Default komplettes sichtbares Spektrum über LEDs wiedergeben

> Also ich seh das richtig, dass du einen Algorithmus in C dafür nutzen willst,

Danke Euch beiden; der Tip mit dem HSL-Farbraum war ideal, jetzt kann ich
Sättigung um Helligkeit auf Maximum setzen und die Hue einfach durchlaufen.

Vielen Dank nochmal,
Martin


Reply With Quote
Reply

Tags
komplettes , leds , sichtbares , spektrum , wiedergeben , über


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Sichtbares elektromagnetische Spektrum Uwe Hercksen Forum Physik 0 04-27-2006 08:21 AM
Sichtbares elektromagnetische Spektrum Hendrik van Hees Forum Physik 0 04-27-2006 01:27 AM
Sichtbares elektromagnetische Spektrum Peter Niessen Forum Physik 0 04-26-2006 09:29 PM
Sichtbares elektromagnetische Spektrum Roland Damm Forum Physik 0 04-26-2006 09:16 PM


All times are GMT. The time now is 08:31 AM.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Copyright 2005 - 2012 Molecular Station | All Rights Reserved
Page generated in 0.14153 seconds with 16 queries