风筝
发表于: 2020-10-3 12:53:11 | 显示全部楼层

当我们在制作一个有趣的硬件项目时,可能会需要使用到一款显示屏,但选择显示屏的尺寸和控制它所需的引脚都令人困惑。在上一篇文章中,我们介绍了0.96寸I2C OLED显示屏,在本篇文章中,我们将介绍使用I2C 20×4字符显示屏。


所需的零件

本文将介绍如何在Arduino上使用20 x 4 LCD显示屏来打印实时时钟和日期。

20 x 4字符LCD显示模块.jpg


液晶显示器有4行,每行20个字符,不能用于显示图形。该显示器的主要功能是使用I2C接口,这意味着您只需要两条线即可与Arduino连接。屏幕背面有一块焊接在显示屏上的小PCB,该电路是一个串行LCD 20 x 4模块,它还具有一个用于调节LCD对比度的小电位器,显示屏的背光为蓝色,文本为白色。它与Arduino完全兼容,并具有5​​V输入电压。它的I2C地址可以是0x27或0x3F。

DS3231.jpg


DS3231是一款低成本、精确的I2C实时时钟(RTC),具有集成的温度补偿晶体振荡器(TCXO)和晶体。该设备具有电池输入,因此,如果断开电源,则可以保持准确的时间。RTC可以保持秒、分钟、小时、日期、月份和年份的信息。在每月不到31天的情况下,将自动调整结束日期,包括润年的更正。时钟以24小时或12小时格式的带/ AM / PM指示运行。提供两个可配置的闹钟,并且日历可以设置为方波输出。地址和数据通过I2C双向总线串行传输。此RTC模块的工作电压范围为3.3V至5.5V,因此可以与3.3V或5V引脚连接。


LCD与ARDUINO UNO的连接

首先,我们将LCD与Arduino连接以显示一些文本并学习其工作原理。

连接.jpg


电路

将GND与Arduino的GND连接,将VCC与Arduino上的5V引脚连接,将SDA与A4引脚连接,最后将SCL与A5引脚连接。

20x4LCD.png


代码

首先,我们需要下载显示器的库,其中包括配置和写入显示屏所需的所有函数。您可以在此处找到它。

解压缩该库并将其添加到Arduino库文件夹,然后运行Arduino IDE并复制以下代码。前两行代码包括I2C和LCD库。

lcd.setCursor(3,0)将LCD的光标设置在指定位置,第一个参数用于列,第二个参数从0开始。 lcd.print(“”)将在当前光标位置打印给定的文本,请注意,溢出的字符将被丢弃。

  1. //Written by Nick Koumaris
  2. //info@educ8s.tv
  3. //educ8s.tv
  4. #include <Wire.h>
  5. #include <LiquidCrystal_I2C.h>
  6. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
  7. void setup()  
  8. {
  9.   lcd.begin(20,4); // Initialize LCD
  10.   lcd.setCursor(3,0); // Set the cursor at the 4th column and 1st row
  11.   lcd.print("Hello YouTube!");
  12.   lcd.setCursor(8,1);  // Set the cursor at the 9th column and 2nd row
  13.   lcd.print("****");
  14.   lcd.setCursor(0,2);  // Set the cursor at the 1st column and 3rd row
  15.   lcd.print("This is a demo text");
  16.   lcd.setCursor(8,3);  // Set the cursor at the 9th column and 4th row
  17.   lcd.print("****");
  18. }
  19. void loop()
  20. {
  21.   
  22. }
复制代码

在液晶显示屏上打印日期和时间

现在,我们将使用带有LCD的RTC模块来打印当前日期和时间,每个日期和时间都排成一行,并在其周围带有虚线边框。

RTC.jpg


电路

在这里,我们将使用一块小面包板连接RTC模块,并通过Arduino的I2C引脚(A4和A5)进行显示。 SCL引脚与模拟5引脚相连,SDA引脚与模拟6引脚相连。面包板的顶部导轨用作I2C总线,而底部的导轨则是电源总线,将显示器和RTC模块都连接到5 V和GND引脚,现在电路已准备就绪。

Schematic.png


代码

在开始之前,我们必须下载RTC库并设置其时间。所需的库可在github上找到。下载它并将其解压缩到Arduino库文件夹,然后打开Arduino IDE,然后从示例中从DS1307库中选择“ setTime”。最后在RTC模块与Arduino连接时上传它,并将其时间设置为计算机时间。

Capture-1.png


除了setup和loop函数外,我们还将创建其他四个函数来组织代码。由于框架的角和垂直线是特殊字符,因此我们必须手动创建它们。因此,我们将使用一个函数来创建它们,并使用另一个函数在LCD上打印它们。在loop函数中,将从实时时钟模块读取时间,并使用自定义函数针对时间和日期将其打印到LCD。现在,让我们描述一下代码的每个部分。


首先,我们必须包括三个库:I2C、LCD和RTC,然后设置LCD地址。 在setup函数中,将初始化显示,然后我们将调用createCustomCharacters()函数并进行打印。

  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. #include <DS1307RTC.h>
  4. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
  5. void setup()  
  6. {
  7.   lcd.begin(20,4);
  8.   
  9.   createCustomCharacters();

  10.   printFrame();
  11. }
复制代码

每个字符的宽度可以是5像素长,高度可以是8像素。 因此,要创建自定义字符,我们需要创建一个新的字节。 我们需要5个字符,垂直线和四个角。 黄色图案显示了如何在LCD上显示字符。

createCustomCharacters()函数内部,我们调用了lcd.createChar(#,byte array)函数。 LCD最多支持8个自定义字符,编号从0到7。它将在第一个参数中将索引分配给字节数组给定的字符。 要打印此字符,我们可以使用lcd.write(byte(#))函数。

  1. byte verticalLine[8] = {
  2.   B00100,
  3.   B00100,
  4.   B00100,
  5.   B00100,
  6.   B00100,
  7.   B00100,
  8.   B00100,
  9.   B00100
  10. };  
  11. byte char2[8] = {
  12.   B00000,
  13.   B00000,
  14.   B00000,
  15.   B11100,
  16.   B00100,
  17.   B00100,
  18.   B00100,
  19.   B00100
  20. };
  21. byte char1[8] = {
  22.   B00000,
  23.   B00000,
  24.   B00000,
  25.   B00111,
  26.   B00100,
  27.   B00100,
  28.   B00100,
  29.   B00100
  30. };
  31. byte char3[8] = {
  32.   B00100,
  33.   B00100,
  34.   B00100,
  35.   B00111,
  36.   B00000,
  37.   B00000,
  38.   B00000,
  39.   B00000
  40. };
  41. byte char4[8] = {
  42.   B00100,
  43.   B00100,
  44.   B00100,
  45.   B11100,
  46.   B00000,
  47.   B00000,
  48.   B00000,
  49.   B00000
  50. };
  51. void createCustomCharacters()
  52. {
  53.   lcd.createChar(0, verticalLine);
  54.   lcd.createChar(1, char1);
  55.   lcd.createChar(2, char2);
  56.   lcd.createChar(3, char3);
  57.   lcd.createChar(4, char4);
  58. }
复制代码

现在,准备好字符后,我们就可以打印框架了。

此函数非常简单,它使用lcd.setCursor(#,#)移动光标,并使用lcd.print(“”)打印给定的字符串。 该函数将打印顶部和底部水平线,然后打印其他自定义字符。

  1. void printFrame()
  2. {
  3.   lcd.setCursor(1,0);
  4.   lcd.print("------------------");
  5.   lcd.setCursor(1,3);
  6.   lcd.print("------------------");
  7.   lcd.setCursor(0,1);
  8.   lcd.write(byte(0));
  9.   lcd.setCursor(0,2);
  10.   lcd.write(byte(0));
  11.   lcd.setCursor(19,1);
  12.   lcd.write(byte(0));
  13.   lcd.setCursor(19,2);
  14.   lcd.write(byte(0));
  15.   lcd.setCursor(0,0);
  16.   lcd.write(byte(1));
  17.   lcd.setCursor(19,0);
  18.   lcd.write(byte(2));
  19.   lcd.setCursor(0,3);
  20.   lcd.write(byte(3));
  21.   lcd.setCursor(19,3);
  22.   lcd.write(byte(4));
  23. }
复制代码

如前所述,loop函数将每秒获取当前时间和日期,并在显示屏上刷新它们。 首先,我们定义一个具有当前时间数据的时间元素“ tm”,然后,如果时间正确并且RTC模块可以正常工作,则将打印时间和日期。

我们可以添加一些说明,以便在DS1307停止或出现故障时,我们可以点亮LED来指示问题。 循环将等待1秒钟,然后再开始下一次迭代。

  1. void loop()
  2. {
  3.    tmElements_t tm;
  4.   if (RTC.read(tm)) {
  5.     printDate(5,1,tm);
  6.     printTime(6,2,tm);  
  7.    
  8.   } else {
  9.     if (RTC.chipPresent()) {
  10.       //The DS1307 is stopped. Please run the SetTime
  11.     } else {
  12.       //DS1307 read error! Please check the circuitry
  13.     }
  14.     delay(9000);
  15.   }
  16.   delay(1000);
  17. }
复制代码

PrintTime函数使用三个参数,列和行将在其中打印时间,以及time元素。 lcd.print(tm.Hour)将打印小时,然后如果分钟和秒小于10,我们将在左侧添加0。 并且使用相同的方法来打印日期。

  1. void printTime(int character,int line, tmElements_t tm)
  2. {
  3.   String seconds,minutes;
  4.   lcd.setCursor(character,line);
  5.   lcd.print(tm.Hour);
  6.   lcd.print(":");
  7.   if(tm.Minute<10)
  8.   {
  9.     minutes = "0"+String(tm.Minute);
  10.     lcd.print(minutes);
  11.   }else
  12.   {
  13.     lcd.print(tm.Minute);
  14.   }
  15.   lcd.print(":");
  16.   if(tm.Second<10)
  17.   {
  18.     seconds = "0"+String(tm.Second);
  19.     lcd.print(seconds);
  20.   }else
  21.   {
  22.     lcd.print(tm.Second);
  23.   }
  24. }
  25. void printDate(int character,int line, tmElements_t tm)
  26. {
  27.   lcd.setCursor(character,line);
  28.   lcd.print(tm.Month);
  29.   lcd.print("/");
  30.   lcd.print(tm.Day);
  31.   lcd.print("/");
  32.   lcd.print(tmYearToCalendar(tm.Year));
  33. }
复制代码

现在一切准备就绪,将代码上传到Arduino,然后可以欣赏新时钟了。 您可以在下面的附件中找到完整的Arduino草图和库。 RTC.zip (946 Bytes, 下载次数: 12)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-29 07:07 , Processed in 0.108915 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表