Processing控制彩色LED灯
Posted 村头陈师傅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Processing控制彩色LED灯相关的知识,希望对你有一定的参考价值。
Processing控制彩色LED灯
公众号:STCode
1-RGB彩色LED模块简介
LED是发光二极管的简称,它是半导体二极管的一种,可以把电能转化成光能。LED灯已经大量进入人们的生活。普通的LED灯大部分是单色的,用于照明、装饰等。彩色的LED是以三原色(红、绿、蓝)按照一定比例混合出来,可以近似调出所有人眼可见光的颜色。彩色LED用于户外的大型显示屏等需要多种颜色的场合。彩色LED有贴片和直插封装两种。
2-Arduino控制LED灯亮度和颜色
控制彩色LED灯发出不同的亮度,需要采用模拟输出引脚。每个模拟输出引脚控制红、绿、蓝三种颜色中的一种,通过输出不同的电压,可以搭配出不同的颜色。Arduino的模拟输出引脚是8位的,理论上可以输出16777216种颜色。Arduino与彩色LED的接线如图所示。
3-Arduino控制RGB彩色LED代码测试
下面的代码演示了随机生成三原色混搭形成各种颜色,每种颜色延时200ms。
int Red =3;
int Green =5;
int Blue =6;
void setup()
{
pinMode(Red,OUTPUT);
pinMode(Green,OUTPUT);
pinMode(Blue,OUTPUT);
}
void loop()
{
analogWrite(Red,random(0,255));
analogWrite(Green,random(0,255));
analogWrite(Blue,random(0,255));
delay(200);
}
4-Processing颜色条绘制
首先我们绘制三个颜色条,分别代表R、G、B三种颜色分量,通过颜色条的长度再映射到0~255,赋值给R、G、B三个颜色分量,就能随意组合颜色,效果如图所示。
代码如下:
int redDisplay,greenDisplay,blueDisplay; //定义R,G,B 3个颜色分量显示的长度变量
int red,green,blue; //定义R,G,B三种颜色分量的值的变量
void setup()
{
size(700,500);
}
void draw()
{
background(204);
rectMode(CORNER);
noFill(); //不填充颜色
strokeWeight(2); //三个进度条的边框厚度为2个像素
stroke(255,0,0); //描边颜色为红色
rect(50,100,500,50); //绘制红色分量进度条的边框
stroke(0,255,0); //描边颜色为绿色
rect(50,200,500,50); //绘制绿色分量进度条的边框
stroke(0,0,255); //描边颜色为蓝色
rect(50,300,500,50); //绘制蓝色分量进度条的边框
fill(red,0,0); //填充颜色为当前红色分量的值
rect(50,100,redDisplay,50); //以当前红色分量的长度画出进度条
fill(0,green,0); //填充颜色为当前绿色分量的值
rect(50,200,greenDisplay,50); //以当前绿色分量的长度画出进度条
fill(0,0,blue); //填充颜色为当前蓝色分量的值
rect(50,300,blueDisplay,50); //以当前蓝色分量的长度画出进度条
fill(red,green,blue); //以当前R,G,B分量合成的颜色值为填充,画出一个矩形
rect(300,400,50,50);
}
void mouseClicked() //定义一个鼠标事件
{
if(mouseX<=550&&mouseX>=50)
{
if(mouseY<=150&&mouseY>=100) //当鼠标指针在该范围时,读取mouseX的值,映射到0~255,为红色颜色分量的值
{
red =(int)map(mouseX,50,550,0,255);
redDisplay =mouseX-50;
}
else if(mouseY<=250&&mouseY>=200)
{
green =(int)map(mouseX,50,550,0,255);
greenDisplay =mouseX-50;
}
else if(mouseY<=350&&mouseY>=300)
{
blue=(int)map(mouseX,50,550,0,255);
blueDisplay =mouseX-50;
}
}
}
5-Processing调节彩色LED灯交互
Processing通过将R、G、B分量经串口发送到Arduino上面。Arduino经过处理数据,将R、G、B各分量传送到R、G、B彩色LED模块,就能实现颜色的改变。
Processing端代码:
import processing.serial.*;
Serial port =new Serial(this,"COM10",9600);
int redDisplay,greenDisplay,blueDisplay;
int red,green,blue;
String strRed,strGreen,strBlue;
String message;
void setup()
{
size(700,500);
}
void draw()
{
background(204);
frame(); //绘制进度条边框
RGBDisplay(); //绘制进度条
sendMessage();
}
void frame() //绘制进度条边框函数
{
rectMode(CORNER);
noFill();
stroke(255,0,0);
strokeWeight(2);
rect(50,100,500,50);
stroke(0,255,0);
rect(50,200,500,50);
stroke(0,0,255);
rect(50,300,500,50);
}
void RGBDisplay() //绘制进度条函数
{
rectMode(CORNER);
noStroke();
fill(red,0,0);
rect(50,100,redDisplay,50);
fill(0,green,0);
rect(50,200,greenDisplay,50);
fill(0,0,blue);
rect(50,300,blueDisplay,50);
fill(red,green,blue);
rect(300,400,50,50);
fill(0);
rect(400,400,50,50);
}
void mouseClicked() //单击鼠标事件,改变现实的进度条,同时更新R,G,B各分量的值
{
if(mouseX<=550&&mouseX>=50)
{
if(mouseY<=150&&mouseY>=100)
{
red =(int)map(mouseX,50,550,0,255);
redDisplay =mouseX-50;
}
if(mouseY<=250&&mouseY>=200)
{
green =(int)map(mouseX,50,550,0,255);
greenDisplay =mouseX-50;
}
if(mouseY<=350&&mouseY>=300)
{
blue =(int)map(mouseX,50,550,0,255);
blueDisplay =mouseX-50;
}
if(mouseX<=450&&mouseX>=400)
if(mouseY>=400&&mouseY<=450)
{
shut(); //当鼠标在该区域单击时,关闭LED灯
}
}
}
void sendMessage() //定义发送数据函数
{
strRed =red+""; //将red分量转换为字符串类型
if(red<100) //当red分量小于100时,将red转换为字符串,并且在前面加上字符0
strRed ="0"+red;
if(red<10) //当red分量小于10时,将red转换为字符串,并且在前面加上字符00
strRed="00"+red;
strGreen =green+"";
if(green<100)
strGreen="0"+green;
if(green<10)
strGreen="00"+green;
strBlue =blue+"";
if(blue<100)
strBlue ="0"+blue;
if(blue<10)
strBlue="00"+blue;
message ='a'+strRed+strGreen+strBlue+'s'; //将R,G,B各分量连接为字符串,通过串口发送到Arduino
println(message);
port.write(message);
}
void shut() //定义关闭LED灯函数
{
redDisplay =0;
greenDisplay =0;
blueDisplay =0;
red =0;
green =0;
blue =0;
}
Arduino端代码:
int redpin = 3;
int greenpin = 5;
int bluepin = 6;
char charbuf[20];
int color[3];
void setup()
{
Serial.begin(9600);
pinMode(redpin,OUTPUT);
pinMode(greenpin,OUTPUT);
pinMode(bluepin,OUTPUT);
}
void loop()
{
while(Serial.available()>0)
{
Serial.readBytesUntil('s',charbuf,20);
if(charbuf[0] == 'a')
{
color[0] = 100*(charbuf[1]-'0') + 10*(charbuf[2]-'0') + charbuf[3]-'0';
color[1] = 100*(charbuf[4]-'0') + 10*(charbuf[5]-'0') + charbuf[6]-'0';
color[2] = 100*(charbuf[7]-'0') + 10*(charbuf[8]-'0') + charbuf[9]-'0';
}
analogWrite(redpin,color[0]);
analogWrite(greenpin,color[1]);
analogWrite(bluepin,color[2]);
}
}
颜色条
RGB灯效果
以上是关于Processing控制彩色LED灯的主要内容,如果未能解决你的问题,请参考以下文章