/*
翻译:tom
时间:2013年08月04日
IDE版本号:1.01
发表地址:www.geek-workshop.com
翻译说明: 根据arduino自带的范例进行翻译,可能根据实际的需要略作修改
*/
http://arduino.cc/en/Tutorial/ReadASCIIString
Examples > Communication
Read ASCII String
这个草图中使用了Serial.parseInt()函数定位数值,用非文本数字字符。通常人们用一个隔号表明不同的信息部分。这个格式通常适用于逗号分隔数值),但是其它的字符如一个空格或是句号同时有效。这个数值被解释成整型数值和作为RGB LED的颜色。你将可以使用串口发送字符串“5,220,70”到Arduino改变LED灯。
硬件需要:
:Arduino
: 面包板
: 连接线
:普通共阳极RGB LED
: 三个220欧姆 电阻
图片制作使用Fritzing.更多的电路范例,请看Fritzing prjoect page;
你将需要5根线连接上述电路。连接一根红线到面包板上的竖直行。连接另一端end 至 5V端口到你的Arduino.
将RGB灯放置在你的面包板上。核对你的RGB LED 数据表的脚接到正确的端口上。接上电源,将它连接在RGB的阳极上,你将得到一个普通的共阳的LED。
用剩余的电线,连接(RGB)红色阴极至数字端口3,连接(RGB)绿色阴极至数字端口5,连接(RGB)蓝色阴极至数字端口7。
RGB LED使用一个普通的阳极共享为一个阳极。轮替打开照亮LED,你需要将针脚的电平置为低,创建不同的电压通过二极管。这通过analogWrite()发送255将LED关闭,与此同时0 将它达到最亮。在以下的代码,你将非正式的使用一点数学,所以你能发送数值达到你预期的亮度。本来,代替使用analogWrite(pin,brightness),你将呼叫analogWrite(pin,255-brightness);
Code
你将首先设置一些全局变量将要为RGB连接的引脚。这将更容易区分,哪个是红色,绿色,蓝色,在主程序之中。
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
在你的setup(),开始串口输出设置为9600。
同样在setup()中,你想配置哪些引脚作为输出模式。
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减去这个值,你将以格式化的数值使用一个共阳LED。如上说明,这些发光LED将照亮当那里存在一个电压差在阳极与连接到Arduino的引脚之间。
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);
现在你已经格式化了数值为了PWM,使用analogWrite()函数改变LED的颜色。因为你在上一步中用255减去了数值:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
发送每一个LED的数值在串口监视器,以十六进制形式输出一个字符串:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
最后,用}字符封闭那些字段比如声明,while ,main loop函数:
一旦你调试好了Arduino程序,打开你的串口监视器。核实你已经选择发送一行新字符当正在发送一个消息。键入数字0至255之间的数值以下面的格式:红,绿,蓝。
一旦你已经发送了数值到Arduino,连接上的LED将改变到你指定的颜色,和你将接收十六进制值在串口监视器。
/*
Reading a serial ASCII-encoded string.
This sketch demonstrates the Serial parseInt() function.
It looks for an ASCII string of comma-separated values.
It parses them into ints, and uses those to fade an RGB LED.
Circuit: Common-anode RGB LED wired like so:
* Red cathode: digital pin 3
* Green cathode: digital pin 5
* blue cathode: digital pin 6
* anode: +5V
created 13 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
// 定义RGB的针脚:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
void setup() {
// 初始化
Serial.begin(9600);
//设置RGB LED输出模式
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') {
//将数值限制在0-255这个范围之内 并使之反转
//如果你用的一个共阳RGB,可以使”Constrain(color,0,255);”
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);
// fade the red, green, and blue legs of the LED:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
//打印那三个数值以十六进制在一个字符串
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
}
}
}
后记:串口输入最好输入三个数字 比如 100 0 150 之类,如果乱输入字符,很可能看不到效果哦。
|