本帖最后由 xukejing 于 2017-5-28 00:40 编辑
本帖将要介绍一下如何用PWM的方式调整RGB灯的颜色
首先,硬件连接图如下。每个引脚都有220欧电阻限流,高电平点亮。
我们要用到一个函数analogWrite,这个函数有8位精度,以0到255输出不同的脉宽比,我们可以用它控制RGB led灯里各个颜色的亮度
控制色彩的代码可以是这样的
void myRGB(int i,int j,int k)
{
analogWrite(R, i);
analogWrite(G, j);
analogWrite(B, k);
}
实际上,用RGB来调色不是很方便。
下面干货来了,RGB与HSV颜色空间的转换。
在HSV颜色空间下,让S和V等于1,然后H在0到360范围变化,就可以以最高色彩饱和度调出各种颜色。
但是RGB LED硬件的显示还是基于RGB色彩空间的,所以我们要转回来。
我们来写一下HSV空间转RGB空间的函数。我喜欢把一些功能以函数的方式封装起来,这样方便移植的时候复制黏贴。
注意里面那个int *RGB的用法,我写代码的风格超级飘逸的:lol
void HSV2RGB(float h, float s, float v,int * RGB)
{
int h_i=(int)h/60.0;
float f=h/60-h_i;
float p=v*(1.0-s);
float q=v*(1.0-f*s);
float t=v*(1.0-(1.0-f)*s);
float r=0, g=0, b=0;
switch (h_i)
{
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;
default:
break;
}
RGB = (int)255.0*r;
RGB = (int)255.0*g;
RGB = (int)255.0*b;
}
七彩循环的demo函数可以这么写。仍然是做成函数的形式。
void mytest1()
{
for (h = 0; h < 360; h += 0.1)
{
HSV2RGB(h, s, v, rgb);
myRGB(rgb, rgb, rgb);
delay(2);
}
}
最后给出完整的代码
int R = 2;
int G = 3;
int B = 4;
int *rgb = new int;
float h=0, s=1, v=1;
void setup()
{
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop()
{
mytest1();
}
void mytest1()
{
for (h = 0; h < 360; h += 0.1)
{
HSV2RGB(h, s, v, rgb);
myRGB(rgb, rgb, rgb);
delay(2);
}
}
void myRGB(int i,int j,int k)
{
analogWrite(R, i);
analogWrite(G, j);
analogWrite(B, k);
}
void HSV2RGB(float h, float s, float v,int * RGB)
{
int h_i=(int)h/60.0;
float f=h/60-h_i;
float p=v*(1.0-s);
float q=v*(1.0-f*s);
float t=v*(1.0-(1.0-f)*s);
float r=0, g=0, b=0;
switch (h_i)
{
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;
default:
break;
}
RGB = (int)255.0*r;
RGB = (int)255.0*g;
RGB = (int)255.0*b;
}
本帖最后由 xukejing 于 2017-5-28 00:40 编辑
本帖将要介绍一下如何用PWM的方式调整RGB灯的颜色
首先,硬件连接图如下。每个引脚都有220欧电阻限流,高电平点亮。
我们要用到一个函数analogWrite,这个函数有8位精度,以0到255输出不同的脉宽比,我们可以用它控制RGB led灯里各个颜色的亮度
控制色彩的代码可以是这样的
void myRGB(int i,int j,int k)
{
analogWrite(R, i);
analogWrite(G, j);
analogWrite(B, k);
}
实际上,用RGB来调色不是很方便。
下面干货来了,RGB与HSV颜色空间的转换。
在HSV颜色空间下,让S和V等于1,然后H在0到360范围变化,就可以以最高色彩饱和度调出各种颜色。
但是RGB LED硬件的显示还是基于RGB色彩空间的,所以我们要转回来。
我们来写一下HSV空间转RGB空间的函数。我喜欢把一些功能以函数的方式封装起来,这样方便移植的时候复制黏贴。
注意里面那个int *RGB的用法,我写代码的风格超级飘逸的:lol
void HSV2RGB(float h, float s, float v,int * RGB)
{
int h_i=(int)h/60.0;
float f=h/60-h_i;
float p=v*(1.0-s);
float q=v*(1.0-f*s);
float t=v*(1.0-(1.0-f)*s);
float r=0, g=0, b=0;
switch (h_i)
{
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;
default:
break;
}
RGB = (int)255.0*r;
RGB = (int)255.0*g;
RGB = (int)255.0*b;
}
七彩循环的demo函数可以这么写。仍然是做成函数的形式。
void mytest1()
{
for (h = 0; h < 360; h += 0.1)
{
HSV2RGB(h, s, v, rgb);
myRGB(rgb, rgb, rgb);
delay(2);
}
}
最后给出完整的代码
int R = 2;
int G = 3;
int B = 4;
int *rgb = new int;
float h=0, s=1, v=1;
void setup()
{
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop()
{
mytest1();
}
void mytest1()
{
for (h = 0; h < 360; h += 0.1)
{
HSV2RGB(h, s, v, rgb);
myRGB(rgb, rgb, rgb);
delay(2);
}
}
void myRGB(int i,int j,int k)
{
analogWrite(R, i);
analogWrite(G, j);
analogWrite(B, k);
}
void HSV2RGB(float h, float s, float v,int * RGB)
{
int h_i=(int)h/60.0;
float f=h/60-h_i;
float p=v*(1.0-s);
float q=v*(1.0-f*s);
float t=v*(1.0-(1.0-f)*s);
float r=0, g=0, b=0;
switch (h_i)
{
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;
default:
break;
}
RGB = (int)255.0*r;
RGB = (int)255.0*g;
RGB = (int)255.0*b;
}