使用 20x4 LCD 显示屏和 Nano 发现代码的运行情况
学习 Arduino 编程的一个主要挑战是,没有调试器可以显示您的硬件实际在做什么。了解连接 LCD 以编写“日志”语句是多么容易。
引言
如果您遵循了我的第一篇文章来设置您的 Arduino Nano(使用小型廉价 Nano 板开始使用 Arduino[^]),那么您现在就可以用您的 Nano 做更多的事情了。
确定出了什么问题
当您开始使用 Arduino 做更多事情时,您会发现(正如我们所有人在编程时一样)事情并不像您预期的那样工作,您可能想知道如何判断出了什么问题。其他时候,您可能只是想知道某个输入引脚在特定时间可能读取的值。
目前,无法连接到您的 Nano 并调试正在运行的代码。
写入串行端口
来自 Arduino 网站的大多数代码示例都添加了将信息写入串行端口的行,然后可以在 Arduino IDE 串行监视器程序中查看这些信息。但是,这有点烦人,因为每次您上传代码到 Arduino 时,都需要确保串行监视器没有运行,否则,您经常会遇到冲突,因为 Arduino 正在向串行监视器写入语句,而程序正在尝试将新程序上传到 Arduino。
20x4 LCD 屏幕
将 20(字符)X 4(字符)LCD(液晶显示器)添加到您的 Nano 是如此容易,以至于我认为写一篇有用的文章向您展示如何选择一个以及如何快速连接和使用它。
从输入引脚读取值
为了显示一些有趣的数据,我将向您展示如何从输入引脚读取不同的值。我们可以通过将电位器连接到模拟引脚来轻松地使值发生变化,我将向您展示如何操作。
背景
当我开始使用 Arduino 时,我等了太长时间才订购一个简单的输出设备 (LCD) 并学习如何使用它。它如此简单且如此有用,它应该真正成为您学习的第一件事之一。一旦您这样做,我相信您会发现它以一种戏剧性的方式开启了您的 Arduino 编程,因为它使您能够更多地了解代码实际在做什么。此外,看到您的小设备在屏幕上写入也很有趣。
如果您没有屏幕,您必须不断依赖会打印到计算机串行监视器上的 Serial.print()
语句。
您应该购买哪种 LCD?
我找到了一种便宜且似乎运行良好的。这是我在此项目中使用的那个(https://amzn.to/2MsiarM)。
这个包括 I2C 接口(集成电路间,这是一种二进制串行通信协议)。这个协议也称为 TWI - 两线接口。这款 LCD 大约只需 9.50 美元。
仅四根线
这里需要注意的重要一点是,您只需连接四根线。
两根用于为 LCD 供电(电压和接地),一根用于传输串行数据(将显示),第四根是串行时钟,用于管理传输数据的速度。
现在,将前面的 LCD 与不实现 I2C(而是使用并行接口)的类似 LCD 进行比较。您可以看到需要处理的线要多得多。这些线也会占用您 Arduino 更多的引脚,因此如果您正在构建一个更大的项目,这可能会限制您。
我用那个 20x4 LCD 吃了不少苦头,因为我的焊接技术很差,如果任何一条数据线没有完美连接,您将看不到任何东西,或者您将看到乱码和奇怪的输出。很难确定哪条线没有正确连接。
然而,I2C 接口非常容易连接。
让我们将其连接到我们在我的另一篇文章中创建的相同 Nano 电路 ( )。
I2C 接口线
首先,让我们看看 20x4 LCD 的背面,检查 I2C 引脚和标签。
当您拿到您的 LCD 时,将其翻过来,您会看到四个引脚(我的已经连接了电线)。
从上到下,它们被标记为
- GND(地线)我有一根黑线连接到地线
- VCC 电压输入——运行在 5V,这很完美,因为我们通过 USB 端口供电
- SDA - 串行数据线
- SCL - 串行时钟
连接到 Nano
连接地线和电压很容易,因为我们可以将它们连接到 Nano 上的 5V 和 GND 引脚。
但是,我们应该将 SDA 和 SCL 引脚连接到哪里呢?为了找到答案,我们需要一张 Nano 引脚图。
我在谷歌上搜索了“nano pinout”这个短语,并在 Arduino 官方网站论坛上找到了以下图片
我用红色方框标出了我看到 SCL 和 SDA 标记的引脚。这表明我们所要做的就是将 SDA 引脚连接到 A4,将 SCL 引脚连接到 A5,LCD 就会为我们工作。
这是面包板上连接的特写。
现在,它已通电。
然而,它没有显示任何内容,因为我们还没有编写一个执行此操作的程序(Arduino Sketch)。
LCD 和 I2C
尽管使用 I2C 模块的 LCD 更容易,因为布线更少,但 I2C 模块没有直接随其他基本库提供。相反,我们需要下载它并将其放到我们的 Arduino IDE 安装目录中。
获取 LiquidCrystal_I2C 库
您可以在此处获取事实标准库。
只需点击 [Clone or Download] 按钮,然后点击 [Download ZIP] 按钮,您就会得到一个包含所需文件的 zip 文件。
接下来,我们要去您的 Arduino IDE 安装位置,找到 libraries 目录。
您的 Android IDE 很可能安装在 c:\program files(x86)\ 下。
这是我的安装位置。您可以在顶部看到 libraries 目录的完整路径
您的 Arduino 程序可能未安装在名为 Arduino185 的目录中,它可能只名为 Arduino。
进入 libraries 目录后,我们要创建一个名为 LiquidCrystal_I2C 的新目录。
您可以看到我已经创建了该目录。创建目录后,将您下载的 zip 文件中的文件放到该目录中。
只需打开您下载的 zip 文件并将文件复制到您的新目录中。
实际上您只需要两个文件
- LiquidCrystal_I2C.cpp
- LiquidCrystal_I2C.h
一旦您放入文件,您就全部设置完毕,可以编写一个使用新库的简单程序了。
启动 Arduino IDE
让我们启动 Arduino IDE(集成开发环境),看看如何在 LCD 上打印一些文本。
注意:如果您已经启动了 Arduino IDE,则需要停止程序并重新启动它,以便它可以加载新库。
启动一个新的 Sketch,我们首先要做的是添加一个 include,以便在 sketch 中使用我们的新库。
#include <LiquidCrystal_I2C.h>
当 include
语句使用 <
和 >
括号时,这意味着将搜索默认库路径,这就是我们将新文件添加到 Arduino IDE 安装目录下的 \libraries 目录的原因。
接下来,我们需要初始化将用于调用 LCD 功能的对象。我们将该对象命名为 lcd
。由于此对象将在整个程序中使用,因此我们将在 setup()
方法和 loop()
方法之外的全局空间中对其进行初始化。
LiquidCrystal_I2C lcd(0x3F, 20, 4);
该行创建新的 lcd
对象,三个参数是
- I2C 组件的地址 (0x3F)。这将由制造商提供,并且对于您的屏幕,您将始终使用相同的地址。I2C 允许连接多个组件,因为每个组件都有自己的地址。
- 屏幕的宽度(列)以字符数表示。
- 屏幕的高度(行)以字符数表示。
现在我们的 lcd
对象已准备就绪。我们可以调用它的一些方法。
我们将此第一个简单示例的其余所有代码添加到 setup()
方法中。
首先,我们将通过调用 begin()
方法来初始化并告诉 lcd
对象我们已准备好使用它。
接下来,我们使用列和行索引将光标设置到特定位置。最后,我们在屏幕上打印一条消息。
这是我们整个 setup()
方法的代码。
void setup() {
lcd.begin();
lcd.setCursor(2,0);
lcd.print("Hello, LCD!");
}
现在,我们准备好构建代码、上传并运行它。
下载 HelloLCD_v001.zip
继续连接您的 Nano 并尝试一下。您可以下载 HelloLCD_v001.zip 并尝试一下。
运行时,您将看到以下内容
现在,让我们看看如何添加一个电位器来创建一些变化的输入,以便您可以在屏幕上显示它。
将电位器连接到模拟引脚
我有一套不错的、具有各种良好值的基本电位器(电位器),我从亚马逊买的:(https://amzn.to/2lhfxwE)。我正在使用一个最大欧姆额定值为 5000 的电位器。
我标记了引脚,以便您了解我们稍后将如何使用它们。
这些电位器很好,因为(通常)它们的引脚可以直接插入面包板进行实验。然而,在这个特定的面包板上,我发现引脚不太合适,所以我给电位器的引脚加了一些线。
如果您没有 5K 电位器,基本上可以随便拿您手头有的。这是因为 analogRead()
方法有一个 0-1023 的刻度,它会将施加的电压值分成 1024 份,所以无论值是多少,它都会返回一个 0-1023 之间的值。但是,如果您的电位器值很小,例如 100,您只需稍微转动旋钮,值就会急剧变化。
连接:外部引脚可以更改
重要的是以以下方式连接引脚
- 电位器中间引脚连接到 Nano 的模拟 3 (A3) 引脚
- 任一外部引脚连接到 5V
- 另一个外部引脚连接到 GND(地线)
将哪个外部引脚连接到 5V 或接地无关紧要,但每个只能连接一个。
值增加的方向
在上一张图片中,我向您展示了我是如何将我的连接到 5V 和 GND 的,我希望以这种方式连接它们,以便当我向右转动旋钮时,值会增加。如果您将 5V 和 GND 切换到相反的引脚,那么您会发现当您向左转动旋钮时,值会增加。
这是我的所有接线都已连接好并准备就绪的照片。
黄线从电位器连接到 Nano 上的 A3 引脚。
红线从电位器右外侧引脚连接到 Nano 上的 5V 引脚。
绿线从电位器左外侧引脚连接到 Nano 上的 GND(接地)引脚。
现在,我们只需添加代码,就会看到值写入屏幕。
我已经修改了 helloLCD_v001
程序,并将其另存为 helloLCD_v002
,并将其压缩并添加到本文顶部的下载中。
我将只解释主 loop()
中的代码,然后您就可以从中学习了。
首先,我在 sketch 的顶部添加了两个新的全局变量
int analogPin = A3;
char formattedValue[5];
第一行设置了我们将要读取的引脚。
第二行是一个字符数组,我们只是用它来格式化我们的输出。
然后,我将以下代码添加到 loop()
中
void loop() {
int a3Value = analogRead(analogPin); //1
lcd.setCursor(2,1); //2
sprintf(formattedValue, "%04d", a3Value); //3
lcd.print(formattedValue); //4
}
我在每行末尾添加了带数字的注释,以便我可以解释每行。
这是非常简单的代码,最困难的部分只是因为我用前导零格式化输出。
第 1 行:我们使用 analogRead()
方法将值读取到整数变量 (a3Value
) 中。
第 2 行:我们使用 lcd
方法 setCursor()
将光标设置到 LCD 屏幕第 2 行的第 3 个位置(索引 2)。
第 3 行:我们调用 C 函数 sprintf()
(string
print format)来格式化 a3Value
(最后一个参数)并将其复制到 formattedValue
字符数组中。
第 4 行:调用 lcd.print()
将 formattedValue
打印到屏幕上。
这是它运行时显示的样子。
在 Youtube 上观看 30 秒视频
您可以在 youtube 上观看值变化的视频(https://youtu.be/TIrXCCC1IO8)。只有大约 30 秒。
就是这样!就这么简单,如果您获得一个 LCD 并在需要时将其连接到您的项目中,它将帮助您调查您的 sketch。
历史
- 2018-06-18:首次发布