怎样添加使用Arduino串行监视器控制计算机上的LED的功能

电子说

1.3w人已加入

描述

概述

在本课中,您将在第4课的基础上,添加使用Arduino串行监视器控制计算机上的LED的功能。串行监视器是计算机和Arduino之间的“纽带”-它使您可以发送和接收文本消息,方便调试以及通过键盘控制Arduino!

监视器

例如,您将能够从计算机发送命令来打开LED 。

在本课程中,您将使用与第4课完全相同的部件和类似的面包板布局。因此,如果您尚未这样做,请立即按照第4课进行。

串行监视器

将以下草图上传到Arduino。稍后,我们将确切了解其工作原理。

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 5. Serial Monitor

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

updateShiftRegister();

Serial.begin(9600);

while (! Serial); // Wait untilSerial is ready - Leonardo

Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);

}

void loop()

{

if (Serial.available())

{

char ch = Serial.read();

if (ch 》= ‘0’ && ch 《= ‘7’)

{

int led = ch - ‘0’;

bitSet(leds, led);

updateShiftRegister();

Serial.print(“Turned on LED ”);

Serial.println(led);

}

if (ch == ‘x’)

{

leds = 0;

updateShiftRegister();

Serial.println(“Cleared”);

}

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} /*

Adafruit Arduino - Lesson 5. Serial Monitor

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

updateShiftRegister();

Serial.begin(9600);

while (! Serial); // Wait untilSerial is ready - Leonardo

Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);

}

void loop()

{

if (Serial.available())

{

char ch = Serial.read();

if (ch 》= ‘0’ && ch 《= ‘7’)

{

int led = ch - ‘0’;

bitSet(leds, led);

updateShiftRegister();

Serial.print(“Turned on LED ”);

Serial.println(led);

}

if (ch == ‘x’)

{

leds = 0;

updateShiftRegister();

Serial.println(“Cleared”);

}

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

将此草图上传到Arduino之后,单击Arduino IDE工具栏上最右边的按钮。该按钮在下方圈出。

监视器

将打开以下窗口。

监视器

该窗口称为“串行监视器”,它是Arduino IDE软件的一部分。它的工作是使您既可以从计算机向Arduino板发送消息(通过USB),也可以从Arduino接收消息。

消息“输入LED编号0至9或‘x’清除”是由Arduino发送的,它告诉我们可以向Arduino发送哪些命令,这些命令要么发送“ x”(关闭所有LED),要么发送您想要打开的LED数量(其中0是底部的LED,1是下一个LED,顶部是LED,最多7个LED)。

尝试在串行监视器的顶部区域中键入以下命令,并与“发送”按钮对齐。键入以下每个字符后,按‘Send’:x 0 3 5

键入x无效,如果LED指示灯已全部熄灭,但是在输入每个数字时,相应的LED指示灯应点亮,并且您将从Arduino板获得确认消息,以便串行监视器如下所示。

监视器

您可以看到,在再次输入“ x”后,我即将按发送。这样做,所有的LED都将熄灭。

如您所料, Arduino代码

该草图基于第4课中使用的草图。因此,我们将在此处介绍新内容。您会发现在Arduino IDE中引用完整的草图很有用。

首先,在“设置”功能中,最后增加了三行:

下载:文件

复制代码

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

updateShiftRegister();

Serial.begin(9600);

while (! Serial); // Wait until Serial is ready - Leonardo

Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);

} void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

updateShiftRegister();

Serial.begin(9600);

while (! Serial); // Wait until Serial is ready - Leonardo

Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);

}

首先,我们有命令‘Serial.begin(9600)’。这将开始串行通信,以便Arduino可以通过USB连接发送命令。值9600称为连接的“波特率”。这是数据发送的速度。您可以将其更改为更高的值,但还必须将Arduio Serial监视器更改为相同的值。我们将在后面讨论,但现在将其保留在9600。

以“ while”开头的行可确保USB连接的另一端有一些东西供Arduino在开始发送消息之前与之交谈。否则,可能会发送该消息,但不会显示。仅当您使用Arduino Leonardo时,此行实际上才是必需的,因为当您打开串行监视器时,Arduino Uno会自动重置Arduino板,而Leonardo则不会。

‘设置”发出我们在串行监视器顶部看到的消息。

“循环”功能是发生所有操作的地方:

下载:文件

复制代码

void loop()

{

if (Serial.available())

{

char ch = Serial.read();

if (ch 》= ’0‘ && ch 《= ’7‘)

{

int led = ch - ’0‘;

bitSet(leds, led);

updateShiftRegister();

Serial.print(“Turned on LED ”);

Serial.println(led);

}

if (ch == ’x‘)

{

leds = 0;

updateShiftRegister();

Serial.println(“Cleared”);

}

}

}

void loop()

{

if (Serial.available())

{

char ch = Serial.read();

if (ch 》= ’0‘ && ch 《= ’7‘)

{

int led = ch - ’0‘;

bitSet(leds, led);

updateShiftRegister();

Serial.print(“Turned on LED ”);

Serial.println(led);

}

if (ch == ’x‘)

{

leds = 0;

updateShiftRegister();

Serial.println(“Cleared”);

}

}

}

循环中发生的所有事情都包含在’if‘语句中。因此,除非对内置Arduino函数’Serial.available()‘的调用为’true‘,否则将不会发生其他任何事情。

Serial.available()如果数据已发送至Arduino和准备好要处理了吗?传入的消息保存在所谓的缓冲区中,如果该缓冲区不为空,则Serial.available()返回true。

如果已接收到消息,则将其转到下一行代码:

下载:文件

复制代码

char ch = Serial.read(); char ch = Serial.read();

这将从缓冲区中读取下一个字符,并将其从缓冲区中删除。它还将其分配给变量“ ch”。变量“ ch”的类型为“ char”,代表“字符”,顾名思义,它包含一个字符。

如果您已按照串行监视器顶部提示中的说明进行操作,则此字符可以是0到7之间的一个数字或字母’x‘。

下一行的’if‘语句通过查看’ch‘是否大于或等于来检查它是否是一个数字。等于字符“ 0”且小于或等于字符“ 7”。以这种方式比较字符看起来有些奇怪,但是完全可以接受。

每个字符都由一个唯一的数字表示,称为ASCII值。这意味着当我们使用《=和》 =比较字符时,实际上是被比较的ASCII值。

如果测试通过,则进入下一行:

下载:文件

复制代码

int led = ch – ’0‘; int led = ch – ’0‘;

现在,我们正在对字符进行算术运算!我们将从输入的任何数字中减去数字“ 0”。因此,如果键入’0‘,则’0‘–’0‘将等于0。如果键入’7‘,则’7‘–’0‘将等于数字7,因为实际上是正在使用的ASCII值

由于我们知道要打开的LED的数量,因此只需要在变量“ leds”中设置该位并更新移位寄存器即可。

下载:文件

复制代码

bitSet(leds, led);

updateShiftRegister(); bitSet(leds, led);

updateShiftRegister();

接下来的两行将确认消息写回到串行监视器。

下载:文件

复制代码

Serial.print(“Turned on LED ”);

Serial.println(led); Serial.print(“Turned on LED ”);

Serial.println(led);

第一行使用Serial.print而不是Serial.println。两者之间的区别在于,Serial.print在打印其参数中的任何内容后都不会开始新行。我们在第一行中使用它,因为我们将消息分为两部分进行打印。首先是通用位:“打开LED”,然后是LED的编号。

LED的编号保存在“ int”变量中,而不是文本字符串。 Serial.print可以采用双引号括起来的文本字符串,也可以采用’int‘或与此相关的几乎任何类型的变量。

处理情况的’if‘语句之后,一位数字已被处理,还有第二个’if‘语句,用于检查’ch‘是否为字母’x‘。

下载:文件

复制代码

if (ch == ’x‘)

{

leds = 0;

updateShiftRegister();

Serial.println(“Cleared”);

} if (ch == ’x‘)

{

leds = 0;

updateShiftRegister();

Serial.println(“Cleared”);

}

如果是,则清除所有指示灯并发送确认消息。

其他要做的事情

我们通过在每个字符后单击“发送”来发送字符来分别控制LED。但是,如果您在一行中发送所有字符命令,它将同样有效。尝试在串行监视器中输入以下内容,然后单击“发送”:

x0246

现在,让我们看看Arduino可以通讯的速度。将草图中的波特率从9600更改为115200,然后再次将其上载到板。然后,在打开串行监视器后,从下拉列表中选择115200。

监视器

您应该发现一切仍然有效。高速通信通常不是必需的,因此经常使用9600的波特率,因为许多串行外围设备(例如GPS模块)会将其作为默认波特率,因此这是一个标准。

请尝试不匹配波特率-例如,使用Serial.begin(9600)并在下拉菜单中选择57600。看到看起来像什么吗?全部乱码?错了如果您在串行监视器中收到奇怪的数据,请三遍检查波特率并确保它们匹配!

串行监视器也是调试行为异常的草图的一种好方法。有时,当草图不符合您的想法时,将Serial.println()语句放在关键位置将有助于您查看发生的情况。

责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分