关于RGB LED循环变色......
想做一个红橙黄绿青蓝紫循环变色的灯....但是不能实现
是不是对应的rgb有问题??
数值应该是怎么变化的?有规律么??int redPin = 11;
int greenPin = 10;
int bluePin = 9;
void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
analogWrite(11,70);
analogWrite(10,70);
analogWrite(9,70);
}
void loop()
{
for (int r=0;r<=255;r++)
{
setColor (255, r, 0); // 红——橙——黄
delay(10);
}
for (int r=255;r>=0;r--)
{
setColor(r, 255, 0); // 黄——绿
delay(10);
}
for (int r=0;r<=255;r++)
{
setColor(0, 255, r); // 绿——青
delay(10);
}
for (int r=255;r>=0;r--)
{
setColor(0, r, 255); // 青——蓝
delay(10);
}
for (int r=0;r<=255;r++)
{
setColor(r, 0, 255); // 蓝——紫
delay(10);
}
for (int r=255;r>=0;r--)
{setColor(0, 0, r); // 蓝——紫
delay(10);
}
}
void setColor (int red, int green, int blue)
{
analogWrite(redPin, 255-red);
analogWrite(greenPin, 255-green);
analogWrite(bluePin, 255-blue);
} RGB你要准确调色。。很难得,首先每一种颜色的你都需要串联不同的电阻,使他们同样电压与电流情况下,亮度一样。。。然后才能调色。而且。。。调色后近看看的还是几种颜色分开的,你要离1米以上距离,看的颜色才是比较正确的。。。 红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和RGB三色分量没有简单直观的对应关系,你可以用下面的函数来把HSV颜色空间转换成RGB空间,方便pwm控制三色。其中H是色调,就是你想连续变化的量,S饱和度,V亮度。/////////////////// HSV //////////////////////
int hsv_to_rgb(float h,float s,float v)
// output = (r<<16) + (g<<8) + b
{
float r,g,b;
while (h<0.0) h += 360.0;
while (h>=360.0) h -= 360.0;
if (s==0.0) {
r=v;
g=v;
b=v;
}
else
{
float f,p,q,t;
float i;
h /= 60.0;
i = floor(h);
f = h - i;
p = v * (1.0-s);
q = v * (1.0-(s*f));
t = v * (1.0-(s*(1.0-f)));
int o = i;
switch(o) {
case 0: r=v; g=t; b=p; break;
case 1: r=q; g=v; b=p; break;
case 2: r=p; g=v; b=t; break;
case 3: r=p; g=q; b=v; break;
case 4: r=t; g=p; b=v; break;
case 5: r=v; g=p; b=q; break;
} // switch
}
int ir,ig,ib;
ir=r;
ig=g;
ib=b;
if (ir>255) ir = 255.0;
if (ig>255) ig = 255.0;
if (ib>255) ib = 255.0;
return (ir<<16) / (ig<<8) / ib;
}
void rgb_to_hsv(float r,float g,float b,float* h,float* s,float* v)
{
float max,min;
float temp;
if (r>g)
max = r;
else
max = g;
if (b>max)
max = b;
if (r<g)
min = r;
else
min = g;
if (b<min)
min = b;
*v = max;
*s = 0.0;
if (max != 0.0)
*s = ((max-min)/max);
if (*s == 0.0)
*h = -1;
else {
float delta = max - min;
float maxr = max - r;
float maxg = max - g;
float maxb = max - b;
if (r == max)
*h = ((maxb)-(maxg)) / delta;
else if (g == max)
*h = 2.0 + (((maxr)-(maxb)) / delta);
else if (b == max)
*h = 4.0 + (((maxg)-(maxr)) / delta);
*h *= 60.0;
while (*h < 0.0)
*h += 360.0;
while (*h >= 360.0)
*h -= 360.0;
}
}
春泥蛋炒饭 发表于 2013-4-4 23:42 static/image/common/back.gif
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...
谢谢~我试试!! 春泥蛋炒饭 发表于 2013-4-4 23:42 static/image/common/back.gif
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...
这个程序不完整???? 春泥蛋炒饭 发表于 2013-4-4 23:42 static/image/common/back.gif
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...
写完整嘛。。。头尾我都不知道加什么程序??改了程序编译都不过。。。 zch-Jerry 发表于 2015-7-17 12:00 static/image/common/back.gif
写完整嘛。。。头尾我都不知道加什么程序??改了程序编译都不过。。。
我贴的代码本来就不是完整程序,而是你可以调用的函数。调用时只要h在0和360之间循环,就可以实现颜色连续变换。
页:
[1]