biubiu_ 发表于 2013-4-4 12:51:16

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

想做一个红橙黄绿青蓝紫循环变色的灯....
但是不能实现
是不是对应的rgb有问题??
数值应该是怎么变化的?有规律么??int redPin = 11;
int greenPin = 10;
int bluePin = 9;

void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
analogWrite(11,70);
analogWrite(10,70);
analogWrite(9,70);
}

void loop()
{
   for (int r=0;r<=255;r++)
   {
       setColor (255, r, 0); // 红——橙——黄
       delay(10);
   }
   for (int r=255;r>=0;r--)
   {
       setColor(r, 255, 0); // 黄——绿
      delay(10);
      }
   for (int r=0;r<=255;r++)
   {
       setColor(0, 255, r); // 绿——青
      delay(10);
      }
   for (int r=255;r>=0;r--)
   {
       setColor(0, r, 255); // 青——蓝
      delay(10);
      }
   for (int r=0;r<=255;r++)
   {
       setColor(r, 0, 255); // 蓝——紫
      delay(10);
      }
   for (int r=255;r>=0;r--)
   {setColor(0, 0, r); // 蓝——紫
      delay(10);
      }
}



void setColor (int red, int green, int blue)
{
analogWrite(redPin, 255-red);
analogWrite(greenPin, 255-green);
analogWrite(bluePin, 255-blue);
}

弘毅 发表于 2013-4-4 19:53:42

RGB你要准确调色。。很难得,首先每一种颜色的你都需要串联不同的电阻,使他们同样电压与电流情况下,亮度一样。。。然后才能调色。而且。。。调色后近看看的还是几种颜色分开的,你要离1米以上距离,看的颜色才是比较正确的。。。

春泥蛋炒饭 发表于 2013-4-4 23:42:18

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


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

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

   if (s==0.0) {
      r=v;
      g=v;
      b=v;
   }
   else
   {
      float f,p,q,t;
      float i;

      h /= 60.0;
      i = floor(h);
      f = h - i;
      p = v * (1.0-s);
      q = v * (1.0-(s*f));
      t = v * (1.0-(s*(1.0-f)));

      int o = i;
      switch(o) {
         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;
      } // switch

   }

   int ir,ig,ib;

   ir=r;
   ig=g;
   ib=b;
   if (ir>255) ir = 255.0;
   if (ig>255) ig = 255.0;
   if (ib>255) ib = 255.0;

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

void rgb_to_hsv(float r,float g,float b,float* h,float* s,float* v)
{
   float max,min;
   float temp;

   if (r>g)
      max = r;
   else
      max = g;

   if (b>max)
      max = b;

   if (r<g)
      min = r;
   else
      min = g;

   if (b<min)
      min = b;

   *v = max;

   *s = 0.0;
   if (max != 0.0)
      *s = ((max-min)/max);

   if (*s == 0.0)
      *h = -1;
   else {
      float delta = max - min;
      float maxr = max - r;
      float maxg = max - g;
      float maxb = max - b;

      if (r == max)
         *h = ((maxb)-(maxg)) / delta;
      else if (g == max)
         *h = 2.0 + (((maxr)-(maxb)) / delta);
      else if (b == max)
         *h = 4.0 + (((maxg)-(maxr)) / delta);

      *h *= 60.0;
      while (*h < 0.0)
         *h += 360.0;
      while (*h >= 360.0)
         *h -= 360.0;
   }
}

biubiu_ 发表于 2013-4-13 15:03:24

春泥蛋炒饭 发表于 2013-4-4 23:42 static/image/common/back.gif
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...

谢谢~我试试!!

zch-Jerry 发表于 2015-7-17 11:49:38

春泥蛋炒饭 发表于 2013-4-4 23:42 static/image/common/back.gif
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...

这个程序不完整????

zch-Jerry 发表于 2015-7-17 12:00:19

春泥蛋炒饭 发表于 2013-4-4 23:42 static/image/common/back.gif
红橙黄绿青蓝紫的连续光谱变化,实际是对应Hue值的连续变化,在用HSV色彩空间描述颜色时才方便实现。这个和 ...

写完整嘛。。。头尾我都不知道加什么程序??改了程序编译都不过。。。

春泥蛋炒饭 发表于 2015-7-20 14:30:47

zch-Jerry 发表于 2015-7-17 12:00 static/image/common/back.gif
写完整嘛。。。头尾我都不知道加什么程序??改了程序编译都不过。。。

我贴的代码本来就不是完整程序,而是你可以调用的函数。调用时只要h在0和360之间循环,就可以实现颜色连续变换。
页: [1]
查看完整版本: 关于RGB LED循环变色......