🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **读取ASCII字符串** > 本例使用Serial.parseInt()函数来**解析**一列用**非字母字符**分割的值。一般来所,人们使用逗号来分隔一段数据的不同的部分(这种格式的数据一般被称作 **comma-separated-values** 简称 **CSV**)。不过这里用空格或者其他字符分割也可以。解析出来的数据将被来给RGB LED调光。你可以使用Arduino  > IDE的串口监视器来发送类似“5,220,70”这样的颜色数据到板子来改变LED颜色。 ### **所需硬件设备** * Arduino板或Genuino板 * 共阳RGB * LED * 3个220Ω电阻 * 跳线 * 面包板 * 连接线 ### **电路** ![图片来自官网](http://img.blog.csdn.net/20160517165719036) ### **原理图** ![图片来自官网](http://img.blog.csdn.net/20160517165732047)  你需要四根线来搭建电路。第一根线从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原理** ![图片来自官网](http://img.blog.csdn.net/20160520130137804) > 白光LED 与 RGB LED 两者殊途同归,都是希望达到白光的效果, 只不过一个是直接以白光呈现,另一个则是以红绿蓝三色混光而成。RGB灯是以三原色共同交集成像,此外,也有蓝光LED配合黄色荧光粉,以及紫外LED配合RGB荧光粉,整体来说,这两种都有其成像原理。某些LED背光板出现的颜色特别清楚而鲜艳,甚至有高画质电视的程度,这种情形,正是RGB的特色,标榜红就是红、绿就是绿、蓝就是蓝的特性,在光的混色上,具备更多元的特性。([来自百度百科](http://baike.baidu.com/subview/2017681/2017681.htm)) 简单来说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值约束到0到255并且进行数学运算 // 如果你用的是共阴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); } } } ~~~ ### **相关资料** [if()](https://www.arduino.cc/en/Reference/If)  [while()](https://www.arduino.cc/en/Reference/While)  [Serial](https://www.arduino.cc/en/Reference/Serial)