Arduino - 如何在000000到FFFFFF之间循环显示十六进制颜色?

时间:2012-07-10 09:43:03

标签: c hex arduino rgb

我有一个涉及LED模块的项目,该模块使用3色LED,可以通过传入RGB十六进制颜色来控制,例如22AAFF

如果我从这开始,我怎样才能从000000转到FFFFFF

long color = 0x000000;

我希望有一个循环来完成每次迭代并显示每种可能的颜色,最后以

结束
color = 0xFFFFFF

我不确定我对颜色的十六进制表示的理解是否有意义??

3 个答案:

答案 0 :(得分:12)

显而易见的for (int color = 0x000000; color <= 0xFFFFFF; ++color)

出了什么问题

答案 1 :(得分:6)

你可以这样做

for (int color = 0x000000; color <= 0xFFFFFF; ++color)

但是正如评论中提到的那样,显示所有1600万种颜色需要很长时间,更不用说LED可以无法显示所有这些颜色了,所以你可能会想要这样的东西: / p>

const int step = 8; // Select this to be a power of two if you want the maximum brightness to be reachable
for( int red = 0x00; red <= 0xFF; red += step ) {
    for( int green = 0x00; green <= 0xFF; green += step ) {
        for( int blue = 0x00; blue <= 0xFF; blue += step ) {
            const int color = blue << 16 + green << 8 + red;
            // Change the led settings here.
        }
    }
}  

答案 2 :(得分:4)

我认为您不希望循环使用所有颜色,而是通过HSV(HSB)颜色模型中的HUE通道。如果是这样,您可以谷歌执行将HSV值转换为RGB的功能。你的代码看起来像这样:

for(int hue=0; hue<360; hue++)
    setColorHSV(hue,1,1);

您可以找到其中一种可能的实施方式here

如果你不想打扰这个功能,你可以使用这个虚拟循环:

unsigned int i;
for(i = 0; i <= 0xFF; i++)
{
    rgb = 0xFF0000 | i<<8;  
    setLed(rgb);
}
while(--i > 0)
{
    rgb = 0x00FF00 | i<<16; 
    setLed(rgb);
}
for(i = 0; i <= 0xFF; i++)
{
    rgb = 0x00FF00 | i; 
    setLed(rgb);
}
while(--i > 0)
{
    rgb = 0x0000FF | i<<8;  
    setLed(rgb);
}
for(i = 0; i <= 0xFF; i++)
{
    rgb = 0x0000FF | i<<16; 
    setLed(rgb);
}
while(--i > 0)
{
    rgb = 0xFF0000 | i;
    setLed(rgb);
}

不幸的是,我无法测试它,但我认为它应该没有问题。当然,您可以根据需要进行优化。