欢迎光临
我们一直在努力

通信部分-读取ASCII字符串

本例使用Serial.parseInt()函数来解析一列用非字母字符分割的值。一般来所,人们使用逗号来分隔一段数据的不同的部分(这种格式的数据一般被称作 comma-separated-values 简称 CSV)。不过这里用空格或者其他字符分割也可以。解析出来的数据将被来给RGB LED调光。你可以使用Arduino

IDE的串口监视器来发送类似“5,220,70”这样的颜色数据到板子来改变LED颜色。

硬件需求

Arduino板或Genuino板

共阳RGB

LED

3个220Ω电阻

跳线

面包板

连接线

电路

clip_image002

原理图

clip_image004

你需要四根线来搭建电路。第一根线从5V连接到RGB LED的长脚。你应该将LED引脚稍微转一下,以保证长脚是左数第二个引脚。

然后将RGB LED插到面包板上,注意,长脚应在从上往下第二个。检查数据手册来确定引脚的意义,一般的RGB LED应该有 R,V+,G和B四个引脚,从上往下第二个引脚应该接5V。请参照原理图。

用三个电阻分别连接R引脚到3号引脚、G引脚到5号引脚、B引脚到6号引脚。

共阳 RGB LED中共阳的意思是共享阳极。因此如果要让其亮起来,你要将R/G/B 引脚置LOW,以此在发光二级管两端创造一个电压差,让它亮起来。因此 analogWrite() 中传入255会将LED关闭,而0代表LED将会常开。在下列代码中,你会看到我们进行了一些数学运算来解决问题,主要是使用了analogWrite(pin, 255-brightness)来代替原来的analogWrite(pin, brightness)。

RGB LED原理

clip_image005

白光LED 与 RGB LED 两者殊途同归,都是希望达到白光的效果,只不过一个是直接以白光呈现,另一个则是以红绿蓝三色混光而成。RGB灯是以三原色共同交集成像,此外,也有蓝光LED配合黄色荧光粉,以及紫外LED配合RGB荧光粉,整体来说,这两种都有其成像原理。某些LED背光板出现的颜色特别清楚而鲜艳,甚至有高画质电视的程度,这种情形,正是RGB的特色,标榜红就是红、绿就是绿、蓝就是蓝的特性,在光的混色上,具备更多元的特性。

简单来说RGB LED中有三个小LED,分别是红色小LED、绿色小LED和蓝色小LED。通过PWM控制三个小灯的亮度(使用PWM其实是等效亮度。依靠人的视觉暂留来实现,并非是直接调整输出的电压。)

代码

首先,你要为RGB LED的各引脚定义全局常量。这将让你能够在后面更好的区分哪个引脚是红色(red),哪个引脚是绿色(green),哪个引脚是蓝色(blue):

const int redPin = 3;

const int greenPin = 5;

const int bluePin = 6;

在setup()函数中,用下列代码打开电脑和板子之间的串口连接(波特率9600):

Serial.begin(9600);

在setup()函数中, 用下列代码将引脚定义为OUTPUT:

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减一下,以适配共阳RGB LED,作差后才是在0时LED关闭,在255时LED打开。在约束和数学运算完成后,RGB LED内的三个小LED就能够工作了。

red = 255 – constrain(red, 0, 255);

green = 255 – constrain(green, 0, 255);

blue = 255 – constrain(blue, 0, 255);

已经将RGB值处理完毕, 使用analogWrite()来改变LED的颜色:

analogWrite(redPin, red);

analogWrite(greenPin, green);

analogWrite(bluePin, blue);

用十六进制的形式将颜色发回串口监视器:

Serial.print(red, HEX);

Serial.print(green, HEX);

Serial.println(blue, HEX);

在你给板子编程完毕后,打开Arduino IDE 串口监视器。按照下列格式输入:红色+逗号+绿色+逗号+蓝色 (例如 255,255,255)。注意,串口数据的最后一定要有换行符(\n),不过Arduino IDE的串口监视器默认在发送的每条数据后都加上了换行符,因此这里不用多加。完成这一切后,你会看到LED会根据你提供的数据改变它的颜色。

/*
   读取ASCII字符串
 
  本代码展示了Serial库中parseInt()函数的使用。
  parseInt()函数寻找数据中的用逗号分隔的值,然后将他们解析为整型。我们用parseInt()返回的值来给RGB LED设置颜色。
 
  电路搭建: 共阳RGB LED如下连接:(原文错误,已经修正)
  * 红色阴极: 3号引脚
  * 绿色阴极: 5号引脚
  * 蓝色阴极: 6号引脚
  * 阳极 : +5V
 
  代码是公开的。
  */ 
  
// LED引脚: 
const int redPin = 3; 
const int greenPin = 5; 
const int bluePin = 6; 
  
void setup() { 
   // 初始化串口: 
   Serial.begin(9600); 
   // 将串口设置为OUTPUT模式: 
   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') { 
       // 将rgb值约束到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); 
  
       // 给RGB LED调光: 
       analogWrite(redPin, red); 
       analogWrite(greenPin, green); 
       analogWrite(bluePin, blue); 
  
       // 以十六进制值输出颜色数值: 
       Serial.print(red, HEX); 
       Serial.print(green, HEX); 
       Serial.println(blue, HEX); 
     } 
   } 

未经允许不得转载:Arduino-Maker » 通信部分-读取ASCII字符串

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

线上商城

中贝斯特创客空间蘑菇云创客教育