Arduino Uno 使用 ADC采集电压显示在LCD上
前言
在本教程中,我们将在 ARDUINO UNO 中介绍 ADC(模数转换)的概念。Arduino 板有六个 ADC 通道,如下图所示。其中任何一个或全部都可以用作模拟电压的输入。Arduino Uno ADC具有10 位分辨率(因此整数值来自 (0-(2^10) 1023))。这意味着它将 0 到 5 伏之间的输入电压映射为 0 到 1023 之间的整数值。因此,对于每单位 (5/1024= 4.9mV)。
在所有这些中,我们将把一个电位器或电位器连接到“A0”通道,我们将在一个简单的显示器上显示 ADC 结果。简单的显示器是 16x1 和 16x2 显示单元。16x1 显示单元将有 16 个字符并且在一行中。16x2 共有 32 个字符,第 1行 16 个字符,第2行另外 16个字符。这里必须明白,每个字符有 5x10=50 个像素,所以要显示一个字符,所有 50 个像素必须一起工作,但我们不必担心,因为显示单元中有另一个控制器 (HD44780)控制像素的工作(您可以在LCD单元中看到它,它是背面的黑眼圈)。
所需组件
硬件: ARDUINO UNO,电源(5v),JHD_162ALCD(16x2LCD),100uF电容,100KΩ电位器或电位器,100nF电容。
软件: arduino IDE
电路图及说明
在 16x2 LCD 中,如果有背光,则总共有 16 个引脚,如果没有背光,则总共有 14 个引脚。一个可以为背光引脚供电或留下。现在在 14 个引脚中有 8 个数据引脚(7-14 或 D0-D7),2 个电源引脚(1&2 或 VSS&VDD 或 GND&+5v),第 3 个用于对比度控制的引脚(VEE-控制字符的厚度如图所示)和 3 个控制引脚(RS&RW&E)。
在电路中,您可以观察到我只接了两个控制引脚,对比度位和 READ/WRITE 不经常使用,因此可以将它们短接到地。这使 LCD 处于最高对比度和读取模式。我们只需要控制 ENABLE 和 RS 引脚来相应地发送字符和数据。
下面给出了为 LCD 完成的连接:
PIN1 或 VSS 接地
PIN2 或 VDD 或 VCC 到 +5v 电源
PIN3 或 VEE 接地(为初学者提供最佳对比度)
PIN4 或 RS(寄存器选择)到 ARDUINO UNO 的 PIN8
PIN5 或 RW(读/写)接地(将 LCD 置于读取模式,便于用户通信)
PIN6 或 E(启用)到 ARDUINO UNO 的 PIN9
ARDUINO UNO 的 PIN11 或 D4 到 PIN10
PIN12 或 D5 转 ARDUINO UNO 的 PIN11
ARDUINO UNO 的 PIN13 或 D6 到 PIN12
ARDUINO UNO 的 PIN14 或 D7 转 PIN13
ARDUINO IDE 允许用户在 4 位模式下使用 LCD。这种类型的通信使用户能够减少 ARDUINO 上的引脚使用率,不像其他 ARDUINO 不需要单独编程以在 4 it 模式下使用它,因为默认情况下 ARDUINO 设置为在 4 位模式下通信。在电路中,您可以看到我们使用了 4 位通信(D4-D7)。
因此,仅从上表观察,我们将 LCD 的 6 个引脚连接到控制器,其中 4 个引脚是数据引脚,2 个引脚用于控制。
Arduino使用ADC
analogRead(pin);
analogReference();
analogReadResolution(bits);
首先,UNO ADC 通道的默认参考值为 5V。这意味着我们可以为任何输入通道的 ADC 转换提供 5V 的最大输入电压。由于某些传感器提供 0-2.5V 的电压,使用 5V 参考我们得到的精度较低,所以我们有一个指令可以让我们更改这个参考值。所以为了改变我们的参考值(“analogReference();”)
默认情况下,我们得到的最大板 ADC 分辨率为 10 位,可以使用指令 (“analogReadResolution(bits);”) 更改此分辨率。在某些情况下,此分辨率更改可能会派上用场。
现在如果上述条件设置为默认值,我们可以直接调用函数“analogRead(pin);”从通道’0’的ADC读取值,这里“pin”代表我们连接模拟信号的引脚,在这种情况下它会为“A0”。来自 ADC 的值可以取整为“int ADCVALUE = analogRead(A0); ”,通过该指令将ADC后的值存储在整数“ADCVALUE”中。
现在让我们谈谈 16x2 LCD。首先,我们需要启用头文件(‘#include <LiquidCrystal.h>’),该头文件中写入了指令,使用户能够以 4 位模式将 LCD 连接到 UNO,而不会产生任何模糊。有了这个头文件,我们不必逐位向 LCD 发送数据,这一切都将得到处理,我们不必编写程序来逐位向 LCD 发送数据或命令。
其次,我们需要告诉开发板我们在这里使用的是哪种类型的 LCD。由于我们有许多不同类型的 LCD(如 20x4、16x2、16x1 等)。在这里,我们将连接一个 16x2 LCD 到 UNO,因此我们得到“lcd.begin(16, 2);”。对于 16x1,我们得到 ‘lcd.begin(16, 1);’。
在本指令中,我们将告诉电路板我们将引脚连接到何处,连接的引脚将按顺序表示为“RS、En、D4、D5、D6、D7”。这些引脚应正确表示。由于我们将 RS 连接到 PIN0 等,如电路图所示,我们将板上的引脚号表示为“LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”。
上面剩下的就是发送数据了,需要在LCD上显示的数据写成“cd.print(“hello, world!”);”。使用此命令,LCD 会显示“你好,世界!”。
正如你所看到的,我们不需要担心其他任何事情,我们只需要初始化,UNO 就会准备好显示数据。我们不必在这里编写程序循环来逐字节发送数据。
在下面给出的 C 程序中逐步解释了使用 Arduino Uno 的 ADC 。
代码
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN
char ADCSHOW[5]; //initializing a character of size 5 for showing the ADC result
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
}
void loop()
{
// set the cursor to column 0, line 1
lcd.print(" CIRCUIT DIGEST"); //print name
lcd.setCursor(0, 1); // set the cursor to column 0, line
lcd.print("ADC RESULT:"); //print name
String ADCVALUE = String(analogRead(A0)); //intailizing a string and storing ADC value in it
ADCVALUE.toCharArray(ADCSHOW, 5); // convert the reading to a char array
lcd.print(ADCSHOW); //showing character of ADCSHOW
lcd.print(" ");
lcd.setCursor(0, 0); // set the cursor to column 0, line1
}