Processing控制彩色LED灯

Posted 村头陈师傅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Processing控制彩色LED灯相关的知识,希望对你有一定的参考价值。

Processing控制彩色LED灯

公众号:STCode

1-RGB彩色LED模块简介

LED是发光二极管的简称,它是半导体二极管的一种,可以把电能转化成光能。LED灯已经大量进入人们的生活。普通的LED灯大部分是单色的,用于照明、装饰等。彩色的LED是以三原色(红、绿、蓝)按照一定比例混合出来,可以近似调出所有人眼可见光的颜色。彩色LED用于户外的大型显示屏等需要多种颜色的场合。彩色LED有贴片和直插封装两种。

image.png image.png

2-Arduino控制LED灯亮度和颜色

控制彩色LED灯发出不同的亮度,需要采用模拟输出引脚。每个模拟输出引脚控制红、绿、蓝三种颜色中的一种,通过输出不同的电压,可以搭配出不同的颜色。Arduino的模拟输出引脚是8位的,理论上可以输出16777216种颜色。Arduino与彩色LED的接线如图所示。

image.png

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三个颜色分量,就能随意组合颜色,效果如图所示。

image.png

代码如下:

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]);
    
  }
     
}
image.png

​ 颜色条

image.png

​ RGB灯效果

以上是关于Processing控制彩色LED灯的主要内容,如果未能解决你的问题,请参考以下文章

Processing按钮控制LED灯

Processing按钮控制LED灯

用arduino控制三色LED的颜色变化

arduino两个led灯交替闪烁

微机原理汇编语言课程设计 中的LED 灯显示控制代码怎么写?

arduino蓝牙控制呼吸灯无法熄灭的问题