Read ASCII String (读取ASCII字符串)
这个例子使用 Serial.parseInt()功能来找到被非字母数字字符分隔的值。通常人们使用一个逗号来区分几条不同的信息(这个格式通常简称逗号分隔值),但是别的字符例如空格或者句号也可以。这个值被解析后作为输入使LED变色。你将使用串口监视器来发送字符串如“5,220,70”到控制器来改变LED颜色。
ALPHA 8F328D-U核心
硬件
搭建电路
代码
MangoII
硬件要求
- OCROBOT控制器
- 面包板
- 跳线
- 共阳极RGB LED
- 3个220欧姆电阻
- 导线
你不要用五条线来连接电路。一根红线接到面包板长竖直端,另外一端接到控制器的+5V
放置一个RGB LED在面包板上,查阅它的datasheet来确定引脚。连接电源到LED共阳极。
剩下的几条线,依次用电阻连接红色的阴极到3号脚,绿色的阴极到5号脚,蓝色的阴极到6号脚。
共阳极的RGB LED共用了一个电源引脚。这次不用HIGH来点亮LED,给LED加上LOW,在二极管间产生压差。这样用analogWrite() 发送255就熄灭LED了,发送0就使LED最亮。下面的程序中,在控制器中使用一些数学运算,来发送对应期望的亮度值,使用analogWrite(pin, 255-brightness)而不是analogWrite(pin, brightness)。
代码
首先为LED的引脚设置全局变量,这样可以方便的在程序中区分哪一个是红,绿,蓝。
const int redPin = 3; const int greenPin = 5; const int bluePin = 6;
波特率设置为9600波特率来进行通讯
Serial.begin(9600);
设置引脚为输出
pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT);
检查串口缓冲区是否有数据,使用while功能,将会一直运行来检查是否有数据到达
while (Serial.available() > 0) {
声明一些变量来存储串口信息。例如LED的亮度,使用Serial.parseInt()把以逗号分隔的数据分开,读取到变量。
int red = Serial.parseInt(); int green = Serial.parseInt(); int blue = Serial.parseInt();
读取到数据存进变量之后,继续检查新的字符。
if (Serial.read() == '\n') {
使用常量可以控制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);
以16进制发送每个LED的值到串口监视器
Serial.print(red, HEX); Serial.print(green, HEX); Serial.println(blue, HEX);
} } }
给你的OCROBOT控制器下载完程序之后,打开串口监视器。确保已经选择换行发送字符。以这种格式输入0-255的值 Red,Green,Blue 。发送之后,LED将会根据你预想的那样变色,你也会在串口监视器中看到十六进制值。
/* Reading a serial ASCII-encoded string. 这个例子演示了串口 parseInt()的功能,它找到以逗号分隔的ascii字符串,把它解析为整形数据作为输入使LED变色。 */ // LED引脚: const int redPin = 3; const int greenPin = 5; const int bluePin = 6; void setup() { //初始化串口通讯 Serial.begin(9600); // 作为输出: 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 ,反过来 // 如果你用共阴极的LED那就是constrain(color, 0, 255) red = 255 - constrain(red, 0, 255); green = 255 - constrain(green, 0, 255); blue = 255 - constrain(blue, 0, 255); // 使LED变色: analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); // 作为十六进制的一个字符串显示在串口 Serial.print(red, HEX); Serial.print(green, HEX); Serial.println(blue, HEX); } } }