< >
Home » Arduino内置教程 » Arduino内置教程-通讯-读取ASCII字符串

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上读取这些数据

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: arduino内置教程, arduino读取ascii字符串