|
当我们在制作一个有趣的硬件项目时,可能会需要使用到一款显示屏,但选择显示屏的尺寸和控制它所需的引脚都令人困惑。在上一篇文章中,我们介绍了0.96寸I2C OLED显示屏,在本篇文章中,我们将介绍使用I2C 20×4字符显示屏。
所需的零件 本文将介绍如何在Arduino上使用20 x 4 LCD显示屏来打印实时时钟和日期。
该液晶显示器有4行,每行20个字符,不能用于显示图形。该显示器的主要功能是使用I2C接口,这意味着您只需要两条线即可与Arduino连接。屏幕背面有一块焊接在显示屏上的小PCB,该电路是一个串行LCD 20 x 4模块,它还具有一个用于调节LCD对比度的小电位器,显示屏的背光为蓝色,文本为白色。它与Arduino完全兼容,并具有5V输入电压。它的I2C地址可以是0x27或0x3F。
DS3231是一款低成本、精确的I2C实时时钟(RTC),具有集成的温度补偿晶体振荡器(TCXO)和晶体。该设备具有电池输入,因此,如果断开电源,则可以保持准确的时间。RTC可以保持秒、分钟、小时、日期、月份和年份的信息。在每月不到31天的情况下,将自动调整结束日期,包括润年的更正。时钟以24小时或12小时格式的带/ AM / PM指示运行。提供两个可配置的闹钟,并且日历可以设置为方波输出。地址和数据通过I2C双向总线串行传输。此RTC模块的工作电压范围为3.3V至5.5V,因此可以与3.3V或5V引脚连接。
LCD与ARDUINO UNO的连接 首先,我们将LCD与Arduino连接以显示一些文本并学习其工作原理。
电路 将GND与Arduino的GND连接,将VCC与Arduino上的5V引脚连接,将SDA与A4引脚连接,最后将SCL与A5引脚连接。
代码 首先,我们需要下载显示器的库,其中包括配置和写入显示屏所需的所有函数。您可以在此处找到它。 解压缩该库并将其添加到Arduino库文件夹,然后运行Arduino IDE并复制以下代码。前两行代码包括I2C和LCD库。 lcd.setCursor(3,0)将LCD的光标设置在指定位置,第一个参数用于列,第二个参数从0开始。 lcd.print(“”)将在当前光标位置打印给定的文本,请注意,溢出的字符将被丢弃。
- //Written by Nick Koumaris
- //info@educ8s.tv
- //educ8s.tv
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
- void setup()
- {
- lcd.begin(20,4); // Initialize LCD
- lcd.setCursor(3,0); // Set the cursor at the 4th column and 1st row
- lcd.print("Hello YouTube!");
- lcd.setCursor(8,1); // Set the cursor at the 9th column and 2nd row
- lcd.print("****");
- lcd.setCursor(0,2); // Set the cursor at the 1st column and 3rd row
- lcd.print("This is a demo text");
- lcd.setCursor(8,3); // Set the cursor at the 9th column and 4th row
- lcd.print("****");
- }
- void loop()
- {
-
- }
复制代码
在液晶显示屏上打印日期和时间 现在,我们将使用带有LCD的RTC模块来打印当前日期和时间,每个日期和时间都排成一行,并在其周围带有虚线边框。
电路 在这里,我们将使用一块小面包板连接RTC模块,并通过Arduino的I2C引脚(A4和A5)进行显示。 SCL引脚与模拟5引脚相连,SDA引脚与模拟6引脚相连。面包板的顶部导轨用作I2C总线,而底部的导轨则是电源总线,将显示器和RTC模块都连接到5 V和GND引脚,现在电路已准备就绪。
代码 在开始之前,我们必须下载RTC库并设置其时间。所需的库可在github上找到。下载它并将其解压缩到Arduino库文件夹,然后打开Arduino IDE,然后从示例中从DS1307库中选择“ setTime”。最后在RTC模块与Arduino连接时上传它,并将其时间设置为计算机时间。
除了setup和loop函数外,我们还将创建其他四个函数来组织代码。由于框架的角和垂直线是特殊字符,因此我们必须手动创建它们。因此,我们将使用一个函数来创建它们,并使用另一个函数在LCD上打印它们。在loop函数中,将从实时时钟模块读取时间,并使用自定义函数针对时间和日期将其打印到LCD。现在,让我们描述一下代码的每个部分。
首先,我们必须包括三个库:I2C、LCD和RTC,然后设置LCD地址。 在setup函数中,将初始化显示,然后我们将调用createCustomCharacters()函数并进行打印。 - #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include <DS1307RTC.h>
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
- void setup()
- {
- lcd.begin(20,4);
-
- createCustomCharacters();
-
- printFrame();
- }
复制代码
每个字符的宽度可以是5像素长,高度可以是8像素。 因此,要创建自定义字符,我们需要创建一个新的字节。 我们需要5个字符,垂直线和四个角。 黄色图案显示了如何在LCD上显示字符。 在createCustomCharacters()函数内部,我们调用了lcd.createChar(#,byte array)函数。 LCD最多支持8个自定义字符,编号从0到7。它将在第一个参数中将索引分配给字节数组给定的字符。 要打印此字符,我们可以使用lcd.write(byte(#))函数。 - byte verticalLine[8] = {
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- B00100
- };
- byte char2[8] = {
- B00000,
- B00000,
- B00000,
- B11100,
- B00100,
- B00100,
- B00100,
- B00100
- };
- byte char1[8] = {
- B00000,
- B00000,
- B00000,
- B00111,
- B00100,
- B00100,
- B00100,
- B00100
- };
- byte char3[8] = {
- B00100,
- B00100,
- B00100,
- B00111,
- B00000,
- B00000,
- B00000,
- B00000
- };
- byte char4[8] = {
- B00100,
- B00100,
- B00100,
- B11100,
- B00000,
- B00000,
- B00000,
- B00000
- };
- void createCustomCharacters()
- {
- lcd.createChar(0, verticalLine);
- lcd.createChar(1, char1);
- lcd.createChar(2, char2);
- lcd.createChar(3, char3);
- lcd.createChar(4, char4);
- }
复制代码
现在,准备好字符后,我们就可以打印框架了。 此函数非常简单,它使用lcd.setCursor(#,#)移动光标,并使用lcd.print(“”)打印给定的字符串。 该函数将打印顶部和底部水平线,然后打印其他自定义字符。 - void printFrame()
- {
- lcd.setCursor(1,0);
- lcd.print("------------------");
- lcd.setCursor(1,3);
- lcd.print("------------------");
- lcd.setCursor(0,1);
- lcd.write(byte(0));
- lcd.setCursor(0,2);
- lcd.write(byte(0));
- lcd.setCursor(19,1);
- lcd.write(byte(0));
- lcd.setCursor(19,2);
- lcd.write(byte(0));
- lcd.setCursor(0,0);
- lcd.write(byte(1));
- lcd.setCursor(19,0);
- lcd.write(byte(2));
- lcd.setCursor(0,3);
- lcd.write(byte(3));
- lcd.setCursor(19,3);
- lcd.write(byte(4));
- }
复制代码
如前所述,loop函数将每秒获取当前时间和日期,并在显示屏上刷新它们。 首先,我们定义一个具有当前时间数据的时间元素“ tm”,然后,如果时间正确并且RTC模块可以正常工作,则将打印时间和日期。 我们可以添加一些说明,以便在DS1307停止或出现故障时,我们可以点亮LED来指示问题。 循环将等待1秒钟,然后再开始下一次迭代。 - void loop()
- {
- tmElements_t tm;
- if (RTC.read(tm)) {
- printDate(5,1,tm);
- printTime(6,2,tm);
-
- } else {
- if (RTC.chipPresent()) {
- //The DS1307 is stopped. Please run the SetTime
- } else {
- //DS1307 read error! Please check the circuitry
- }
- delay(9000);
- }
- delay(1000);
- }
复制代码
PrintTime函数使用三个参数,列和行将在其中打印时间,以及time元素。 lcd.print(tm.Hour)将打印小时,然后如果分钟和秒小于10,我们将在左侧添加0。 并且使用相同的方法来打印日期。 - void printTime(int character,int line, tmElements_t tm)
- {
- String seconds,minutes;
- lcd.setCursor(character,line);
- lcd.print(tm.Hour);
- lcd.print(":");
- if(tm.Minute<10)
- {
- minutes = "0"+String(tm.Minute);
- lcd.print(minutes);
- }else
- {
- lcd.print(tm.Minute);
- }
- lcd.print(":");
- if(tm.Second<10)
- {
- seconds = "0"+String(tm.Second);
- lcd.print(seconds);
- }else
- {
- lcd.print(tm.Second);
- }
- }
- void printDate(int character,int line, tmElements_t tm)
- {
- lcd.setCursor(character,line);
- lcd.print(tm.Month);
- lcd.print("/");
- lcd.print(tm.Day);
- lcd.print("/");
- lcd.print(tmYearToCalendar(tm.Year));
- }
复制代码
现在一切准备就绪,将代码上传到Arduino,然后可以欣赏新时钟了。 您可以在下面的附件中找到完整的Arduino草图和库。
RTC.zip
(946 Bytes, 下载次数: 19)
|