极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13702|回复: 6

关于RGB LED循环变色......

[复制链接]
发表于 2013-4-4 12:51:16 | 显示全部楼层 |阅读模式
想做一个红橙黄绿青蓝紫循环变色的灯....
但是不能实现
是不是对应的rgb有问题??
数值应该是怎么变化的?有规律么??
  1. int redPin = 11;
  2. int greenPin = 10;
  3. int bluePin = 9;

  4. void setup()
  5. {
  6. pinMode(redPin, OUTPUT);
  7. pinMode(greenPin, OUTPUT);
  8. pinMode(bluePin, OUTPUT);
  9. analogWrite(11,70);
  10. analogWrite(10,70);
  11. analogWrite(9,70);
  12. }

  13. void loop()
  14. {
  15.    for (int r=0;r<=255;r++)
  16.      {
  17.        setColor (255, r, 0); // 红——橙——黄
  18.        delay(10);
  19.      }
  20.    for (int r=255;r>=0;r--)
  21.      {
  22.        setColor(r, 255, 0); // 黄——绿
  23.         delay(10);
  24.       }
  25.    for (int r=0;r<=255;r++)
  26.      {  
  27.        setColor(0, 255, r); // 绿——青
  28.         delay(10);
  29.       }
  30.    for (int r=255;r>=0;r--)
  31.      {  
  32.        setColor(0, r, 255); // 青——蓝
  33.         delay(10);
  34.       }
  35.    for (int r=0;r<=255;r++)
  36.      {  
  37.        setColor(r, 0, 255); // 蓝——紫
  38.         delay(10);
  39.       }
  40.    for (int r=255;r>=0;r--)
  41.      {  setColor(0, 0, r); // 蓝——紫
  42.         delay(10);
  43.       }
  44. }



  45. void setColor (int red, int green, int blue)
  46. {
  47. analogWrite(redPin, 255-red);
  48. analogWrite(greenPin, 255-green);
  49. analogWrite(bluePin, 255-blue);
  50. }
复制代码
回复

使用道具 举报

发表于 2013-4-4 19:53:42 | 显示全部楼层
RGB你要准确调色。。很难得,首先每一种颜色的你都需要串联不同的电阻,使他们同样电压与电流情况下,亮度一样。。。然后才能调色。而且。。。调色后近看看的还是几种颜色分开的,你要离1米以上距离,看的颜色才是比较正确的。。。
回复 支持 反对

使用道具 举报

发表于 2013-4-4 23:42:18 | 显示全部楼层
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和RGB三色分量没有简单直观的对应关系,你可以用下面的函数来把HSV颜色空间转换成RGB空间,方便pwm控制三色。其中H是色调,就是你想连续变化的量,S饱和度,V亮度。
  1. /////////////////// HSV //////////////////////


  2. int hsv_to_rgb(float h,float s,float v)
  3. // output = (r<<16) + (g<<8) + b
  4. {
  5.    float r,g,b;

  6.    while (h<0.0) h += 360.0;
  7.    while (h>=360.0) h -= 360.0;

  8.    if (s==0.0) {
  9.       r=v;
  10.       g=v;
  11.       b=v;
  12.    }
  13.    else
  14.    {
  15.       float f,p,q,t;
  16.       float i;

  17.       h /= 60.0;
  18.       i = floor(h);
  19.       f = h - i;
  20.       p = v * (1.0-s);
  21.       q = v * (1.0-(s*f));
  22.       t = v * (1.0-(s*(1.0-f)));

  23.       int o = i;
  24.       switch(o) {
  25.          case 0: r=v; g=t; b=p; break;
  26.          case 1: r=q; g=v; b=p; break;
  27.          case 2: r=p; g=v; b=t; break;
  28.          case 3: r=p; g=q; b=v; break;
  29.          case 4: r=t; g=p; b=v; break;
  30.          case 5: r=v; g=p; b=q; break;
  31.       } // switch

  32.    }

  33.    int ir,ig,ib;

  34.    ir=r;
  35.    ig=g;
  36.    ib=b;
  37.    if (ir>255) ir = 255.0;
  38.    if (ig>255) ig = 255.0;
  39.    if (ib>255) ib = 255.0;

  40.    return (ir<<16) / (ig<<8) / ib;
  41. }

  42. void rgb_to_hsv(float r,float g,float b,float* h,float* s,float* v)
  43. {
  44.    float max,min;
  45.    float temp;

  46.    if (r>g)
  47.       max = r;
  48.    else
  49.       max = g;

  50.    if (b>max)
  51.       max = b;

  52.    if (r<g)
  53.       min = r;
  54.    else
  55.       min = g;

  56.    if (b<min)
  57.       min = b;

  58.    *v = max;

  59.    *s = 0.0;
  60.    if (max != 0.0)
  61.       *s = ((max-min)/max);

  62.    if (*s == 0.0)
  63.       *h = -1;
  64.    else {
  65.       float delta = max - min;
  66.       float maxr = max - r;
  67.       float maxg = max - g;
  68.       float maxb = max - b;

  69.       if (r == max)
  70.          *h = ((maxb)-(maxg)) / delta;
  71.       else if (g == max)
  72.          *h = 2.0 + (((maxr)-(maxb)) / delta);
  73.       else if (b == max)
  74.          *h = 4.0 + (((maxg)-(maxr)) / delta);

  75.       *h *= 60.0;
  76.       while (*h < 0.0)
  77.          *h += 360.0;
  78.       while (*h >= 360.0)
  79.          *h -= 360.0;
  80.    }
  81. }
  82.   
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-13 15:03:24 | 显示全部楼层
春泥蛋炒饭 发表于 2013-4-4 23:42
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...

谢谢~我试试!!
回复 支持 反对

使用道具 举报

发表于 2015-7-17 11:49:38 | 显示全部楼层
春泥蛋炒饭 发表于 2013-4-4 23:42
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...

这个程序不完整????
回复 支持 反对

使用道具 举报

发表于 2015-7-17 12:00:19 | 显示全部楼层
春泥蛋炒饭 发表于 2013-4-4 23:42
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...

写完整嘛。。。头尾我都不知道加什么程序??改了程序编译都不过。。。
回复 支持 反对

使用道具 举报

发表于 2015-7-20 14:30:47 | 显示全部楼层
zch-Jerry 发表于 2015-7-17 12:00
写完整嘛。。。头尾我都不知道加什么程序??改了程序编译都不过。。。

我贴的代码本来就不是完整程序,而是你可以调用的函数。调用时只要h在0和360之间循环,就可以实现颜色连续变换。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-18 04:08 , Processed in 0.039681 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表