【Intel Genuino 101 (curie)开发板试用体验】9、RGB与HSV空间转换

  • xukejing
  • LV5工程师
  • |      2017-05-28 00:37:47
  • 浏览量 1140
  • 回复:0
本帖最后由 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;

}

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子