光的三原色
牛顿发现光的色散奥秘之后,进一步计算发现:七种色光中只有红、绿、蓝三种色光无法被分解,而其他四种颜色的光均可由这三种色光以不同比例相合而成。于是红、绿、蓝被称为“三原色光”或“光的三原色”。后经证实:红、绿、蓝这三种颜色的组合,几乎能形成所有的颜色。
组合 红+绿=黄; 绿+蓝=青; 红+蓝=品红; 红+绿+蓝=白
RGB彩灯
RGB彩灯内部原理
共阳极 共阴极
共阴极彩灯电路接线
RGB红绿灯
功能需求:红灯亮7秒,绿灯亮7秒,黄灯闪烁3秒(闪烁间隔为500毫秒)。
void setup(){
}
void loop(){
analogWrite(9,255);
analogWrite(10,0);
analogWrite(11,0);
delay(7000);
analogWrite(9,0);
analogWrite(10,255);
analogWrite(11,0);
delay(7000);
for (int i = 1; i <= 3; i = i + (1)) {
analogWrite(9,255);
analogWrite(10,255);
analogWrite(11,0);
delay(500);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);
delay(500);
}
}
用3个电位器,对RGB彩灯进行调色。
volatile int dwq1;
volatile int dwq2;
volatile int dwq3;
void setup(){
dwq1 = 0;
dwq2 = 0;
dwq3 = 0;
}
void loop(){
dwq1 = (map(analogRead(A1), 0, 1023, 0, 255));
dwq2 = (map(analogRead(A2), 0, 1023, 0, 255));
dwq3 = (map(analogRead(A3), 0, 1023, 0, 255));
analogWrite(9,dwq1);
analogWrite(10,dwq2);
analogWrite(11,dwq3);
}
这段代码是一个基于Arduino的简单示例,用于实时处理来自三个ADC输入(A1, A2, A3)的模拟信号,并将其转换为0到255范围内的数字值,再通过PWM控制RGB三色LED灯(连接到数字引脚9、10和11)。`volatile`关键字在此处的作用非常重要,因为它确保了在多任务环境中,CPU不会优化对这三个变量(dwq1, dwq2, dwq3)的访问,防止可能出现的数据竞争(data race)问题。
以下是代码逐行解释:
1. `volatile int dwq1;`,`volatile int dwq2;` 和 `volatile int dwq3;`:声明了三个名为`dwq1`、`dwq2`和`dwq3`的整型变量,因为它们存储的是从ADC读取的结果,这些值可能会随着外部输入的变化而随时改变,所以标记为volatile,表示编译器在每次读取时都需要重新检查该变量的值。
2. 在`setup()`函数中:
- `dwq1 = 0;`:初始化`dwq1`为0,相当于清零准备接收ADC的读数。
- 同理,`dwq2`和`dwq3`也被初始化为0。
3. 在`loop()`函数中:
- `dwq1 = (map(analogRead(A1), 0, 1023, 0, 255));`: 从ADC引脚A1获取模拟电压值,映射到0到255的整数值。`map()`函数用于线性变换,将原范围的值缩放到目标范围。
- 类似地,`dwq2`和`dwq3`分别对应A2和A3的ADC读数。
4. 最后,通过`analogWrite(9, dwq1);`、`analogWrite(10, dwq2);`和`analogWrite(11, dwq3);`将每个`dwq`变量的值分配给RGB LED的PWM输出,控制LED的颜色强度。