用户工具

站点工具


learing:examples:readasciistring

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);
    }
  }
}
learing/examples/readasciistring.txt · 最后更改: 2023/06/07 04:23 由 127.0.0.1