## **读取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)
- 说明
- 系统示例文件目录结构及说明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (与特定硬件相关,暂无)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暂无)
- ArduinoISP