0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:网络整理 作者:网络整理 2019-11-28 08:51 次阅读

概述

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

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

例如,您将能够从计算机发送命令来打开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

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

    关注

    0

    文章

    763

    浏览量

    32840
  • 串行
    +关注

    关注

    0

    文章

    230

    浏览量

    33533
  • Arduino
    +关注

    关注

    184

    文章

    6428

    浏览量

    184846
收藏 人收藏

    评论

    相关推荐

    监视器黑屏是什么原因 监视器黑屏和蓝屏的区别

    问题、分辨率设置问题、显示器设置问题、显卡问题或硬件故障等。 蓝屏(Blue Screen):蓝屏通常指的是计算机操作系统(如Windows)的蓝屏死机(Blue Screen of Death,简称
    的头像 发表于 08-24 15:35 3733次阅读

    在配置位中启用了监视器( WDT) 函数,监视器将自动启动是为什么?

    在使用 Nuvoton ISP 启动装入时需要启用配置位中的监视功能( WDT), 请务必将监视重置功能
    发表于 08-24 06:36

    带3个LED的汽车电池监视器电路图

      这是一个 3 LED 条形图型电池监视器的电路图,非常适合用电池监视汽车电池电压的电压水平。
    的头像 发表于 08-18 17:42 535次阅读
    带3个<b class='flag-5'>LED</b>的汽车电池<b class='flag-5'>监视器</b>电路图

    带有土壤电容传感器的Arduino植物监视器

    电子发烧友网站提供《带有土壤电容传感器的Arduino植物监视器.zip》资料免费下载
    发表于 06-29 09:30 1次下载
    带有土壤电容传感器的<b class='flag-5'>Arduino</b>植物<b class='flag-5'>监视器</b>

    如何使用Arduino构建植物监视器

    电子发烧友网站提供《如何使用Arduino构建植物监视器.zip》资料免费下载
    发表于 06-28 15:34 0次下载
    如何使用<b class='flag-5'>Arduino</b>构建植物<b class='flag-5'>监视器</b>

    将量子计算机连接到Arduino

    电子发烧友网站提供《将量子计算机连接到Arduino.zip》资料免费下载
    发表于 06-25 15:09 1次下载
    将量子<b class='flag-5'>计算机</b>连接到<b class='flag-5'>Arduino</b>

    模具监视器报警了怎么处理?图灵慧眼教程# 模具监视器#

    监视器
    jf_06850557
    发布于 :2023年06月16日 13:41:25

    模具监视器是什么?

    模具监视器是一种能够监测模具加工过程的设备。它通常被安装在模具加工机床上,在模具制造过程中实时监控模具的性能和状态。模具监视器利用传感或其他检测装置收集模具的温度、压力、形变、振动等数据,通过
    发表于 06-16 13:23

    串行监视器和上传到NodeMCU ESP8266的问题如何解决?

    \': PermissionError(13, \'Access is denied.\', None , 5) 通过谷歌搜索,我发现当两件事要使用同一端口时会出现此问题。我对这个问题的愚蠢基本解决方案是将 ESP8266 或串行监视器切换到两个不同的端口。我
    发表于 06-06 13:03

    MacBook Pro 2014无法读取串行监视器是为什么?

    计算机:MacBook Pro 2014 / High Sierra 主板:NodeMcu LoLin V3 -ESP-12E,芯片 CH340G 问题:无法从串口读取信息。试图切换波特率。尝试
    发表于 06-06 12:23

    无法从串行监视器控制ESP8266怎么解决?

    连接 Arduino 时,Arduino IDE Lybrary 的串行监视器上就绪。在我使用了一些来自互联网的草图之后它工作正常,但是一周后我想从那里的
    发表于 05-31 06:10

    串行监视器中出现Stacktrace错误怎么解决?

    我解码了我在串行监视器中获得的 ESP8266 堆栈跟踪: 代码:全选Decoding stack results 0x40211de4: operator new[](unsigned int
    发表于 05-29 07:18

    在我的串行监视器上使用简单的AT COMMANDS?

    我正在尝试在我的串行监视器上使用简单的AT COMMANDS 使用 php 脚本将数据发送到我的 sql,但我的 ESP8266 没有收到 +IPD 回复。除此之外,数据没有到达我的 php 脚本
    发表于 05-19 08:15

    有没有办法打开和读取存储在Linux计算机上的一些文件?

    有没有办法打开和读取存储在 Linux 计算机上的一些文件? ESP8266 使用 Arduino,Ubuntu 12.04.2 我想根据家庭自动化计算机上某些文件的状态打开一些不同的 LED
    发表于 05-12 08:19

    如何将文件内容从Arduino无线发送到计算机

    Arduino UNO 正在将带有格式化文本行的约 8 MB 文件记录到 SD 卡中。我已经将 ESP8266-01 插入到 Arduino 的软件串行端口中。局域网内的计算机最终会请
    发表于 05-04 06:47