RGB彩灯

在《Arduino从基础到实践》一书中第8个项目里面用的是三个RGB灯珠来实现彩灯的效果。但是直接有RGB三色彩灯LED灯珠,我就直接换成了这个。

需要的元器件:

RGB三色LED灯珠T2QdYpXpVXXXXXXXXX_!!1993239370.jpg_q30

220欧姆电阻:电阻

电路连接图:

113503ojy3phyopmgiioyg

实拍电路图:

84032179432553735

代码1:

int redPin = 11;
int greenPin = 10;
int bluePin = 9;
 
void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);  
}
 
void loop()
{
  setColor(255, 0, 0);  // 红色
  delay(1000);
  setColor(0, 255, 0);  // 绿色
  delay(1000);
  setColor(0, 0, 255);  // 蓝色
  delay(1000);
  setColor(255, 255, 0);  // 黄色
  delay(1000);  
  setColor(80, 0, 80);  // 紫色
  delay(1000);
  setColor(0, 255, 255);  // 浅绿色
  delay(1000);
}
 
void setColor(int red, int green, int blue)
{
  analogWrite(redPin, 255-red);
  analogWrite(greenPin, 255-green);
  analogWrite(bluePin, 255-blue);  
}

代码2:

float RGB1[3];
float RGB2[3];
float INC[3];

int red, green, blue;

int RedPin = 11;
int GreenPin = 10;
int BluePin = 9;

void setup() 
{ 
  	Serial.begin(9600);
  	randomSeed(analogRead(0));
  
  	RGB1[0] = 0;
  	RGB1[1] = 0;
  	RGB1[2] = 0;
  
  	RGB2[0] = random(256);
  	RGB2[1] = random(256);
  	RGB2[2] = random(256);  
} 
 
void loop() 
{ 
  	randomSeed(analogRead(0));
  
  	for (int x=0; x<3; x++) {
    		INC[x] = (RGB1[x] - RGB2[x]) / 256; } 
  
  	for (int x=0; x<256; x++) {
    		red = int(RGB1[0]);
    		green = int(RGB1[1]);
    		blue = int(RGB1[2]);

    		analogWrite (RedPin, red);  
    		analogWrite (GreenPin, green);   
    		analogWrite (BluePin, blue);     
   		delay(100);   
    
    		RGB1[0] -= INC[0];
    		RGB1[1] -= INC[1];    
    		RGB1[2] -= INC[2];    
  	}
  	for (int x=0; x<3; x++) {
  		RGB2[x] = random(556)-300;
  		RGB2[x] = constrain(RGB2[x], 0, 255); 
  		delay(1000);
 }
}

第一段代码比较好理解,这个也是测试电路连接正确与否的一个检验代码

代码2的解释:

构成彩灯的LED包括红色,绿色和蓝色LED。同样道理,计算机显示器也是由小的红,绿,蓝点组成的。可以通过调整LED中三个引脚的电压强度产生不同的颜色。

我们通过使用PWM调整亮度,你可以得到任何颜色。通过把LED聚集在一起,将色彩混合,三种颜色的光谱加在一起形成一个单一的颜色。使用PWM可以产生0-255之间的全部颜色,共16777216种颜色(256*256*256)。

在代码中,开始定义了一些浮点类型的数组和整型变量来存储RGB值,如下:

float RGB1[3];
float RGB2[3];
float INC[3];
int red,green,blue;

在setup函数中,有下列语句:

randomSeed(analogRead(0));

randomSeed函数产生一个随机数(实际上是伪随机数)。计算机芯片实际上不可能产生真正的随机数,但是它可以通过查看不同的存储器或者通过查找有不同值得表形成一个伪随机数。通过设置一个种子,告诉计算机从哪块存储器或表中的哪个数开始计算。在这里所指定的随机数种子是从模拟引脚0读到的数。因为模拟引脚0是悬空的,因此将读到由模拟噪声引起的随机数。

一旦给随机数设置一个种子,就可以用random()函数生成一个随机数。需要两组RGB值,存储在三个元素的数组里。RGB1存储你希望灯开始时的RGB值(在这里,都是零或全关闭状态。)

        RGB1[0] = 0;
  	RGB1[1] = 0;
  	RGB1[2] = 0;

RGB2数组是一组随机RGB值,表示你所希望转换成的颜色。

  	RGB2[0] = random(256);
  	RGB2[1] = random(256);
  	RGB2[2] = random(256);

这是用random(256)给数组元素用随机数赋值。random(256)产生一个在0-255(含255)之间的随机数(因此所产生的数总是大于0)。

如果传递给random()函数一个数,它将返回0到这个数之间的一个数。比如,random(1000)将返回一个0到999之间的数。如果提供两个数作为参数,它将返回一个从较小数(含)到较大数减1之间的随机数。

在主程序循环中,首先查看开始和结束时的RGB值,并计算出需要用什么值作为增量在256步内(因为PWM值只能在0-255之间)从一个值转到另一个值,使用下面代码实现以上动作。

for (int x=0; x<3; x++) {
    	INC[x] = (RGB1[x] - RGB2[x]) / 256; }

这个for循环通过计算两个亮度值之差,并除以256实现RGB设置INC增量。

还需要另外一个for循环:

for (int x=0; x<256; x++) {
    		red = int(RGB1[0]);
    		green = int(RGB1[1]);
    		blue = int(RGB1[2]);

    		analogWrite (RedPin, red);  
    		analogWrite (GreenPin, green);   
    		analogWrite (BluePin, blue);     
   		delay(100);   
    
    		RGB1[0] -= INC[0];
    		RGB1[1] -= INC[1];    
    		RGB1[2] -= INC[2];    
  	}

它给RGB1数组中的元素设置一个红、绿、蓝值;将这些数值写到数字引脚9,10和11中;减去增量值,重复这个过程256次,慢慢将一种随机颜色变成下一种颜色。在每一步中延时100毫秒,保证这个过程缓慢并且稳步进行。可以通过调整这个数值让颜色变化的速度变慢或变快。也可以增加一个电位计让使用者自己设置颜色变化的速度。

现在已经通过256步缓慢地从一个随机颜色变到另一个,RGB1数组变得与RGB2数组的数值相同。下面需要确定另外3个随机值,为下一次变化做好准备。用另一个for循环实现。

for (int x=0; x<3; x++) {
  		RGB2[x] = random(556)-300;
  		RGB2[x] = constrain(RGB2[x], 0, 255); 
  		delay(1000);
 }

随机数是通过在0-556之间选择一个随机数值后,减去300得到的。用这种方法,每次强制用不同的颜色初始化,以保证不总是从大青灰阴影颜色开始。你有300次机会再556中得到一个负数,因此强制有一个或多个颜色以减小的方向在初始和结束两个颜色之间变化,而不总是向增强方向变化。下一句代码通过使用constrain()函数确保这个数被送外PWM引脚时不会出现负数。

constrain()函数需要3个参数:x,a和b。这里x是一个被约束的数,a是最小值,b是最大值。因此constrain()函数查看x的值,确定它是否在a到b范围内,如果它小于a,则设置为a。如果高于b,则设置为b。这样就可以保证送到PWM中的值不小于0。

0 Comments
Leave a Reply