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转换为字符串,并且在前面加上字符0strRed ="0"+red;if(red<10) //当red分量小于10时,将red转换为字符串,并且在前面加上字符00strRed="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各分量连接为字符串,通过串口发送到Arduinoprintln(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灯相关推荐
- 全彩色LED灯带中应用到的LED炫彩灯
全彩色LED灯带:所谓LED全彩灯带便是指把LED组装在带状的FPC柔性线路板或PCB硬板上,因其产品形状象一条带子而得名.全彩色LED灯带和幻彩跑马灯条都可控制单灯跑马.流水.开窗.流星追尾.追逐等 ...
- 树莓派 | threading01 - 创建两个子线程同时运行,两个线程各负责控制一个LED灯以不同的频率闪烁
文章目录 一.前言 二.代码 三.运行 一.前言 Python | threading01 - 创建两个同时运行的子线程 上一次使用了python的多线程库threading创建了两个同时运行的子线程 ...
- 第01课 了解单片机的原理控制一个LED灯的亮和灭-----51单片机C语言试验教程
第一课,了解单片机及单片机的控制原理和DX516 的用法,控制一个LED 灯的亮和灭 本章学习内容: 单片机基本原理,如何使用DX516 仿真器,如何编程点亮和灭掉一个LED 灯,如何进入KEILC5 ...
- AT89C52利用定时器控制单个led灯闪烁
AT89C52利用定时器控制单个led灯闪烁 keil芯片选择AT89C52 新建一个.c文件,将代码拷贝进去,然后保存. 然后将保存的.c文件加载到工程项目里面去. 设置好生产hex文件,就可以编译 ...
- 实例2:树莓派GPIO控制外部LED灯闪烁
实例2:树莓派GPIO控制外部LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派. 通过树莓派GPIO操作的学习,熟悉GPIO的读写控制. 通过 ...
- python自动化控制arduino_LattePandaAI-Python控制Arduino LED灯
本帖最后由 铁甲小宝 于 2020-9-3 17:58 编辑 LattePanda&AI-Python控制Arduino LED灯 概述 --------------------------- ...
- arduinows2812灯条程序_Arduino 控制WS2812 LED灯条
传统的LED限制总是很多,比如需要很多的引脚.所以有一种很好的解决方案是用灯条.理论上这种灯条可以通过通讯,用一根数据总线可以控制达到无上限个数的RGB-LED灯珠,并且在数量在1024以下时,延迟是 ...
- 了解单片机及单片机的控制原理和 DX516 的用法,控制一个 LED 灯的亮
学习内容 单片机基本原理, 如何使用 DX516 仿真器, 如何编程点亮和灭掉一个 LED 灯, 如何进入 KEILC51uV, 调试环境, 如何使用单步,断点,全速,停止的调试方法. ------- ...
- LabVIEW控制Arduino LED灯闪烁(基础篇—2)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用LIAT中的数字I/O函数库,通过LabVIEW控制Arduino Uno控制板上D13管脚上LED灯,实现等间隔闪烁. ...
最新文章
- Python再获年度编程语言,微软或成最大赢家
- 赠书 | 在Python领域,你与专家之间的距离只差这两本书
- python输出数据格式_这串数据有什么方法用python输出我想要的格式?
- [异常解决] android studio检测不到手机的解决办法——ADB驱动自己安装
- linux下父子进程共享socket,多进程共享socket(Linux,Win32)
- 数学不好,能学好机器学习吗?
- Apache OpenOffice 漏洞使数千万用户易受代码执行攻击
- ThreadLocal总结(jdk1.8源码)
- 麒麟系统linux内核,麒麟Linux操作系统内核简介(14页)-原创力文档
- 深入理解Linux文件系统与日志分析
- Nerv实战 - 京东首页改版小结
- VC修改IE滚动条宽度
- 如何合理确定线程池的大小
- 写代码也要讲规矩——SLA
- 特斯拉员工年薪曝光:软件工程师 109 万元
- 基于图像识别和文字识别用 Python 提取视频字幕
- 前沿分享|数澜科技联合创始人副总裁 江敏:基于云原生数据仓库AnalyticDB PostgreSQL的最佳实践
- vb中自动调整控件的大小
- Windows10家庭版本开启Hyper-v虚拟机
- Apache日志分割——rotatelogs、cronolog