电子说
概述
在本课中,您将在第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
全部0条评论
快来发表一下你的评论吧 !