用户工具

站点工具


learing:examples:readasciistring

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

learing:examples:readasciistring [2017/04/07 10:03] (当前版本)
行 1: 行 1:
 +====== Read ASCII String (读取ASCII字符串)======
 +
 +<WRAP left round info 65%>
 +这个例子使用 Serial.parseInt()功能来找到被非字母数字字符分隔的值。通常人们使用一个逗号来区分几条不同的信息(这个格式通常简称逗号分隔值),但是别的字符例如空格或者句号也可以。这个值被解析后作为输入使LED变色。你将使用串口监视器来发送字符串如"​5,​220,​70"​到控制器来改变LED颜色。
 +</​WRAP>​
 +
 +<WRAP left round box 100%>
 +===== ALPHA 8F328D-U核心 =====
 +==== 硬件 ====
 +
 +==== 搭建电路 ====
 +
 +==== 代码 ====
 +</​WRAP>​
 +
 +<WRAP left round box 100%>
 +===== 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的引脚设置全局变量,这样可以方便的在程序中区分哪一个是红,绿,蓝。
 +
 +<code cpp>​const int redPin = 3;
 +const int greenPin = 5;
 +const int bluePin = 6;
 +</​code>​
 +
 +波特率设置为9600波特率来进行通讯
 +
 +<code cpp>​Serial.begin(9600);​
 +</​code>​
 +
 +设置引脚为输出
 +
 +<code cpp>​pinMode(redPin,​ OUTPUT);
 +pinMode(greenPin,​ OUTPUT);
 +pinMode(bluePin,​ OUTPUT);
 +</​code>​
 +
 +检查串口缓冲区是否有数据,使用while功能,将会一直运行来检查是否有数据到达
 +
 +<code cpp>​while (Serial.available() > 0) {
 +</​code>​
 +
 +声明一些变量来存储串口信息。例如LED的亮度,使用Serial.parseInt()把以逗号分隔的数据分开,读取到变量。
 +
 +<code cpp>int red = Serial.parseInt();​
 +int green = Serial.parseInt();​
 +int blue = Serial.parseInt();​
 +</​code>​
 +
 +读取到数据存进变量之后,继续检查新的字符。
 +
 +<code cpp>if (Serial.read() == '​\n'​) {
 +</​code>​
 +
 +使用常量可以控制PWM在一个可接受的范围内。这样的话,如果值超出PWM的范围了,这个值就被限制到有效区间的数字,用255减去这个值,用在共阳极LED上。综上所述,当阳极和控制器引脚间有电压差,这些LED将会变亮。
 +
 +<code cpp>red = 255 - constrain(red,​ 0, 255);
 +green = 255 - constrain(green,​ 0, 255);
 +blue = 255 - constrain(blue,​ 0, 255);
 +</​code>​
 +
 +得到了用来做PWM的值之后,使用 analogWrite() 改变LED颜色,因为前面已经用255减去了这个值。
 +
 +<code cpp>​analogWrite(redPin,​ red);
 +analogWrite(greenPin,​ green);
 +analogWrite(bluePin,​ blue);
 +</​code>​
 +
 +以16进制发送每个LED的值到串口监视器
 +
 +<code cpp>​Serial.print(red,​ HEX);
 +Serial.print(green,​ HEX);
 +Serial.println(blue,​ HEX);
 +</​code>​
 +
 +
 +
 +<code cpp>
 +    }
 +  }
 +}</​code>​
 +
 +给你的OCROBOT控制器下载完程序之后,打开串口监视器。确保已经选择换行发送字符。以这种格式输入0-255的值 Red,​Green,​Blue ​ 。发送之后,LED将会根据你预想的那样变色,你也会在串口监视器中看到十六进制值。
 +<code cpp>/*
 +  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);
 +    }
 +  }
 +}</​code>​
 +</​WRAP>​
  
learing/examples/readasciistring.txt · 最后更改: 2017/04/07 10:03 (外部编辑)