Arduino内置教程-通讯-读取ASCII字符串
读取ASCII字符串
这个程序用Serial.parseInt()函数来定位非字母数字的字符的值。通常人们用逗号来区分信息的不同模块(这种格式通常叫comma-separated-values 或者 CSV),但其他字符像空格或者句号也可以用。这些值被粘贴成整数,用来区分RGB LED灯的颜色。你用Arduino IDE串口监视器来发送像“5,220,70”的字符串到你的开发板来改变灯光的颜色。
硬件要求
- Arduino or Genuino 开发板
- 共极 RGB LED
- 3 220 ohm 电阻
- 连接线
- 开发板
电路
原理图
你需要4根线来连接上面的电路。一根把从开发板的电源处的5V连接到RGB LED灯的长引脚。
把RGB LED灯放在你的面包板上。检查你的LED灯的数据手册来判断引脚,它们应该是R,V+,G和B。从5V引来的线应该连接第二个引脚上,如电路图所示。
用剩下的线,连接LED灯的红阴极到pin3,绿阴极连接到pin5,蓝阴极连接到pin6,中间串联一个220ohm电阻。
共极的RGN LED灯分享一个共同的电源引脚。和使一个引脚切换高电平来点亮的LED灯不同,你需要使这个引脚切换成低电平,来产生一个电压差。所以,发送255到analogWrite()可以使LED关闭,而发送0会使它变得最亮。在下面的代码里,你用到一些数学公式,以便你能发送一些和亮度相应的数值。重要的是,和使用analogWrite(pin, brightness)不同,你要调用analogWrite(pin, 255-brightness).
样例代码
- 你首先为这些LED灯连接到的引脚设置全变量。这个可以使区分在主程序里哪个是红绿蓝变得更加容易:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
- 在setup()里,开发板和电脑的串口通讯的波特率设置为9600bits:
Serial.begin(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灯会变亮:
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);
- 最后,从if,while,主循环的声明里关闭你的括号:
}
}
}
- 一旦你编译好开发板,打开Arduino IDE串口监视器。确保当你发送信息时你选择发送新行的字符。在下面的格式里输入0-255之间的亮度值:Red,Green,Blue。如果你发送这些值到开发板,连接到的LED灯将会切换成你指定的颜色,并且你将在串口监视器接收到返回的HEX值。
/*
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-Cathode RGB LED wired like so:
* Red anode: digital pin 3
* Green anode: digital pin 5
* Blue anode: digital pin 6
* Cathode : GND
created 13 Apr 2012
by Tom Igoe
modified 14 Mar 2016
by Arturo Guadalupi
This example code is in the public domain.
*/
// pins for the LEDs:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
void setup() {
// initialize serial:
Serial.begin(9600);
// make the pins outputs:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
// if there's any serial available, read it:
while (Serial.available() > 0) {
// look for the next valid integer in the incoming serial stream:
int red = Serial.parseInt();
// do it again:
int green = Serial.parseInt();
// do it again:
int blue = Serial.parseInt();
// look for the newline. That's the end of your
// sentence:
if (Serial.read() == '\n') {
// constrain the values to 0 - 255 and invert
// if you're using a common-cathode LED, just use "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);
// print the three numbers in one string as hexadecimal:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
}
}
}
[Get Code]
更多
- if()
- while()
- Serial
- ASCIITable - 示范使用Arduino的高等的串口输出函数。
- Dimmer - 移动鼠标来改变LED灯的亮度
- Graph - 发送数据到电脑,然后在Processing里画出它的图表。
- Midi - 连续发送MIDI音符信息
- MultiSerialMega - 使能Arduino Mega上2个串口。
- PhysicalPixel - 通过从Processing或者Max/MSP发送数据到Arduino上,使LED开关。
- ReadASCIIString - 分析整数里一个用逗号分隔的字符串,来使一个LED灯褪色。
- SerialCallResponse - 通过一个呼-应的方法(握手)来发送多个变数
- SerialCallResponseASCII - 通过一个呼-应的方法(握手)来发送多个变数,并在发送前解码(ASCII)这些数值。
- SerialEvent - 使用SerialEvent()函数
- VirtualColorMixer - 从Arduino发送多个变数到你的电脑,然后在Processing或者Max/MSP上读取这些数据