Arduino内置教程-通讯-读取ASCII字符串

释放双眼,带上耳机,听听看~!
这个程序用Serial.parseInt()函数来定位非字母数字的字符的值。通常人们用逗号来区分信息的不同模块(这种格式通常叫comma-separated-values 或者 CSV),但其他字符像空格或者句号也可以用。这些值被粘贴成整数,用来区分RGB LED灯的颜色。你用Arduino IDE串口监视器来发送像“5,220,70”的字符串到你的开发板来改变灯光的颜色。

简介

这个程序用Serial.parseInt()函数来定位非字母数字的字符的值。通常人们用逗号来区分信息的不同模块(这种格式通常叫comma-separated-values 或者 CSV),但其他字符像空格或者句号也可以用。这些值被粘贴成整数,用来区分RGB LED灯的颜色。你用Arduino IDE串口监视器来发送像“5,220,70”的字符串到你的开发板来改变灯光的颜色。

硬件要求

  • Arduino or Genuino 开发板
  • 共极 RGB LED
  • 220Ω 电阻
  • 连接线
  • 开发板

电路

Arduino内置教程-通讯-读取ASCII字符串

原理图

Arduino内置教程-通讯-读取ASCII字符串

你需要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值。
// 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);
    }
  }
}

给TA打赏
共{{data.count}}人
人已打赏
动态

Arduino内置教程-通讯-物理像素

2019-1-5 9:31:25

ArduinoArduino-官方内置动态

Arduino内置教程-通讯-串口呼叫响应

2019-1-5 11:37:54

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();