【问题标题】:Arduino - How to cycle through hex colours from 000000 to FFFFFF?Arduino - 如何循环从 000000 到 FFFFFF 的十六进制颜色?
【发布时间】:2012-07-09 18:26:21
【问题描述】:

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

如果我从这个开始,我怎么能从000000 循环到FFFFFF

long color = 0x000000;

我希望有一个循环来执行每次迭代并显示所有可能的颜色,以结束

color = 0xFFFFFF

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

【问题讨论】:

  • 你需要一个十六进制字符串还是一个整数值?
  • 您将花费很长时间查看 LED。那是超过 1600 万种不同的颜色。
  • 从 0x000000 到 0xFFFFFF 的每一种可能的颜色都是 16777216 种颜色。如果你看每一种颜色一秒钟,然后每周 5 天、每天 8 小时继续这样做,你将需要大约 27 个月的时间才能看到所有颜色。如果你不害怕,你可以使用这样的循环:for (color = 0; color <= 0xFFFFFF; ++color) { ... }

标签: c hex arduino rgb


【解决方案1】:

明显的for (int color = 0x000000; color <= 0xFFFFFF; ++color) 有什么问题?

【讨论】:

    【解决方案2】:

    你可以这样做

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

    但是正如 cmets 中提到的,这将需要很长时间才能显示所有 1600 万种颜色,更不用说 LED 无法显示所有这些颜色,所以您可能会想要这样的东西:

    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.
            }
        }
    }  
    

    【讨论】:

    • 其实要达到最大亮度,step 应该除以 255,而不是 256。也就是说,它只能是 3、5、17 或它们的乘积。
    【解决方案3】:

    我认为您不想循环遍历所有颜色,而是遍历 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);
    }
    

    不幸的是,我无法对其进行测试,但我认为它应该可以正常工作。当然,您可以根据需要对其进行优化。

    【讨论】:

    • +1,但unsigned int i 始终为&gt;=0,因此您的代码中有几个无限循环...
    • 如果i 比这更简单、更易读,难道没有改变类型吗?这永远不会被i == 0 调用,这不是你想要的?
    • 我在while-loops 中不需要i == 0i == 0xFF。它们分别出现在后面的for-loops 中。