通信部分-读取ASCII字符串

本例使用Serial.parseInt()函数来解析一列用非字母字符分割的值。一般来所,人们使用逗号来分隔一段数据的不同的部分(这种格式的数据一般被称作 comma-separated-values 简称 CSV)。不过这里用空格或者其他字符分割也可以。解析出来的数据将被来给RGB LED调光。你可以使用Arduino

IDE的串口监视器来发送类似“5,220,70”这样的颜色数据到板子来改变LED颜色。

硬件需求
Arduino板或Genuino板
共阳RGB
LED
3个220Ω电阻
跳线
面包板
连接线

电路
clip_image002

原理图
clip_image004

你需要四根线来搭建电路。第一根线从5V连接到RGB LED的长脚。你应该将LED引脚稍微转一下,以保证长脚是左数第二个引脚。
然后将RGB LED插到面包板上,注意,长脚应在从上往下第二个。检查数据手册来确定引脚的意义,一般的RGB LED应该有 R,V+,G和B四个引脚,从上往下第二个引脚应该接5V。请参照原理图。
用三个电阻分别连接R引脚到3号引脚、G引脚到5号引脚、B引脚到6号引脚。
共阳 RGB LED中共阳的意思是共享阳极。因此如果要让其亮起来,你要将R/G/B 引脚置LOW,以此在发光二级管两端创造一个电压差,让它亮起来。因此 analogWrite() 中传入255会将LED关闭,而0代表LED将会常开。在下列代码中,你会看到我们进行了一些数学运算来解决问题,主要是使用了analogWrite(pin, 255-brightness)来代替原来的analogWrite(pin, brightness)。

RGB LED原理

clip_image005

白光LED 与 RGB LED 两者殊途同归,都是希望达到白光的效果,只不过一个是直接以白光呈现,另一个则是以红绿蓝三色混光而成。RGB灯是以三原色共同交集成像,此外,也有蓝光LED配合黄色荧光粉,以及紫外LED配合RGB荧光粉,整体来说,这两种都有其成像原理。某些LED背光板出现的颜色特别清楚而鲜艳,甚至有高画质电视的程度,这种情形,正是RGB的特色,标榜红就是红、绿就是绿、蓝就是蓝的特性,在光的混色上,具备更多元的特性。

简单来说RGB LED中有三个小LED,分别是红色小LED、绿色小LED和蓝色小LED。通过PWM控制三个小灯的亮度(使用PWM其实是等效亮度。依靠人的视觉暂留来实现,并非是直接调整输出的电压。)

代码

首先,你要为RGB LED的各引脚定义全局常量。这将让你能够在后面更好的区分哪个引脚是红色(red),哪个引脚是绿色(green),哪个引脚是蓝色(blue):
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
在setup()函数中,用下列代码打开电脑和板子之间的串口连接(波特率9600):
Serial.begin(9600);
在setup()函数中, 用下列代码将引脚定义为OUTPUT:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
在loop()中,检查是否串口有任何内容。while循环保证后面代码执行时一定串口有数据:
while (Serial.available() > 0) {
然后,声明一些局部变量来存储串口获取的数据。这些数据就是LED的红色亮度、绿色亮度、蓝色亮度信息。用Serial.parseInt()来根据逗号分隔数据,并且存入对应变量:
int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();
一旦你将数据存储到了变量,你还要进行数据校验,如果收到换行符就说明串口监视器发送的颜色数据全部接收到了:
if (Serial.read() == ‘\n’) {
用constrain()函数,你可以将值约束为PWM操作的合理数值。通过这种方式,就算是发来的值超过了PWM的允许值,也能够正常执行。这些值还要用255减一下,以适配共阳RGB LED,作差后才是在0时LED关闭,在255时LED打开。在约束和数学运算完成后,RGB LED内的三个小LED就能够工作了。
red = 255 – constrain(red, 0, 255);
green = 255 – constrain(green, 0, 255);
blue = 255 – constrain(blue, 0, 255);
已经将RGB值处理完毕, 使用analogWrite()来改变LED的颜色:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
用十六进制的形式将颜色发回串口监视器:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
在你给板子编程完毕后,打开Arduino IDE 串口监视器。按照下列格式输入:红色+逗号+绿色+逗号+蓝色 (例如 255,255,255)。注意,串口数据的最后一定要有换行符(\n),不过Arduino IDE的串口监视器默认在发送的每条数据后都加上了换行符,因此这里不用多加。完成这一切后,你会看到LED会根据你提供的数据改变它的颜色。

/*
读取ASCII字符串

本代码展示了Serial库中parseInt()函数的使用。
parseInt()函数寻找数据中的用逗号分隔的值,然后将他们解析为整型。我们用parseInt()返回的值来给RGB LED设置颜色。

电路搭建: 共阳RGB LED如下连接:(原文错误,已经修正)
* 红色阴极: 3号引脚
* 绿色阴极: 5号引脚
* 蓝色阴极: 6号引脚
* 阳极 : +5V

代码是公开的。
*/

// LED引脚:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

void setup() {
// 初始化串口:
Serial.begin(9600);
// 将串口设置为OUTPUT模式:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

}

void loop() {
// 如果串口有数据就继续:
while (Serial.available() > 0) {

// 获取下一个整数:
int red = Serial.parseInt();
// 获取下一个整数:
int green = Serial.parseInt();
// 获取下一个整数:
int blue = Serial.parseInt();

// 如果是换行符则表示获取完毕:
if (Serial.read() == '\n') {
// 将rgb值约束到0255并且进行数学运算
// 如果你用的是共阴LED,只需要写成"constrain(color, 0, 255);"即可
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);

// 给RGB LED调光:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);

// 以十六进制值输出颜色数值:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
}
}
} 
0
分享到:

评论0

请先

原Arduino365.com域名更改为品牌域名ultirobot.com,承载内容要将更丰富,网站也进行了改版,改善阅读体验。
没有账号? 忘记密码?