RGB三基色LED实验
前言
了解RGB三基色LED的原理和使用方法; 认识Arduino开源硬件开发平台中PMW输出控制的方法; 掌握Arduino通过C语言实现电路组建和信号控制的基本方法。提示:以下是本篇文章正文内容,下面案例可供参考
一、实验基础知识
1.RGB三基色LED
三基色是指RGB三种颜色,R=Red,G=Green,B=Blue,通过这三种颜色不同比例的混合,可以显示任何颜色。全彩的 LED 屏幕就是通过这种单个的 RGB 灯珠集成在一起做成的,一个 LED 就是一个像素,这个像素可以通过程序控制显示任何颜色、任何灰度。在单片机中是通过 PWM 来实现调色功能,之前学习过 PWM 调光功能,使用 1 个单色 LED,主要功能是亮度变化,如果三种颜色都用 PWM 控制器亮度,就可以混合出不同的比例。看到的彩色图片一般也会用 RGB 格式表示,比如 24 位彩色,RGB 三种颜色各占 8 位,组成的格式是 RGB=888 格式。每种颜色都有 2 的 8 次方=256 个亮度等级,那么整个像素是可以显示 2 的 24 次方=16777216 种颜色,这就是一个像素可以实现的颜色,位数越高,颜色就分的越细。另外一种常用格式是 16 位,RGB=565 格式,一个像素可以显示 2 的 16 次方=65536种颜色,这种格式在单片机里面用的非常多,尤其是单片机控制的彩屏。还有一种格式是18 位,RGB=666 格式,一个像素显示的颜色数量是 2 的 18 次方=262144,以前常听说的 26万色就是说的这种格式。还是从最基本的说起,既然三基色灯是 3 种颜色灯的组合,那么控制部分也就变得非常明确,1 种颜色用 1 路 PWM,三种颜色就用三路 PWM,很幸运,UNO 有大于 3 路 PWM功能输出,所以还有剩余 PWM 来完成其他功能。下面是电路图和实物连接他。同样的 RGB也分共阳和共阴,LED 一共 4 个有效引脚,1 个公共端,另外 3 个是三种颜色的另外一端。
二、接线及实验要求
1.基础接线
2.实验要求
1、使RGB三基色LED自动循环显示红、绿、蓝三种颜色。
void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop() {
digitalWrite(11,255);
digitalWrite(9,0);
digitalWrite(10,0);
delay(1000);
digitalWrite(11,0);
digitalWrite(9,255);
digitalWrite(10,0);
delay(1000);
digitalWrite(11,0);
digitalWrite(9,0);
digitalWrite(10,255);
delay(1000);
}
2、控制RGB三基色LED显示红、绿、蓝、黄、紫、青、白、熄灭。(代码关键是加一个延时代码delay)
int PIN_R=11;
int PIN_G=9;
int PIN_B=10;
//int PIN_KEY=2;
//int key_count=0;
void setup() {
pinMode(PIN_R,OUTPUT);
pinMode(PIN_G,OUTPUT);
pinMode(PIN_B,OUTPUT);
//pinMode(PIN_KEY,INPUT);
}
void loop() {
color(0,255,255);//红
delay(1000);
color(255,0,255);//绿
delay(1000);
color(255,255,0);//蓝
delay(1000);
color(0,0,255);//黄
delay(1000);
color(0,255,0);//紫
delay(1000);
color(255,0,0);//青
delay(1000);
color(0,0,0);//白
delay(1000);
}
void color (unsigned char red,unsigned char green,unsigned char blue)
{
analogWrite(PIN_R,255-red);
analogWrite(PIN_G,255-green);
analogWrite(PIN_B,255-blue);
}
3、添加按键,通过按键按下,控制RGB三基色LED显示红、绿、蓝、黄、紫、青、白、熄灭。
int PIN_R=11;
int PIN_G=9;
int PIN_B=10;
int PIN_KEY=2;
int key_count=0;
void setup() {
pinMode(PIN_R,OUTPUT);
pinMode(PIN_G,OUTPUT);
pinMode(PIN_B,OUTPUT);
pinMode(PIN_KEY,INPUT);
}
void loop() {
ScanKey();
if(key_count==1)
{
color(0,255,255);//红
}
if(key_count==2)
{
color(255,0,255);//绿
}
if(key_count==3)
{
color(255,255,0);//蓝
}
if(key_count==4)
{
color(0,0,255);//黄
}
if(key_count==5)
{
color(0,255,0);//紫
}
if(key_count==6)
{
color(255,0,0);//青
}
if(key_count==7)
{
color(0,0,0);//白
}
if(key_count==8)
{
color(255,255,255);//白
}
if(key_count>7)
{
key_count=0;
}
}
void ScanKey()
{
if(digitalRead(PIN_KEY)==LOW)
{
delay(20);
if(digitalRead(PIN_KEY==LOW))
{
key_count++;
while(digitalRead(PIN_KEY)==LOW);
}
}
}
void color (unsigned char red,unsigned char green,unsigned char blue)
{
analogWrite(PIN_R,255-red);
analogWrite(PIN_G,255-green);
analogWrite(PIN_B,255-blue);
}