“时间不是主要的,它是唯一的。” - 迈尔斯戴维斯。
在大多数项目中使用与时间相关的操作。例如,我们可以随时间自动化我们的户外灯。它会自动从指定时间打开到另一个预设时间。或者我们可以制作一个自动上课铃。还有很多。MCU不能自己做。我们使用 RTC(实时时钟)在 MCU 中设置实时时间。
“数字日历时钟”是 RTC 的基础项目。市场上有很多类型的 RTC 模块。这里我使用 1307 RTC 模块。
在这里,我使用了我之前记录的相同 I2C LCD。如果您之前没有阅读过,请先从这里阅读。
在本文中,
DS1307的引脚排列
这里我们使用“RTClib”库。我们可以得到 24 小时制。对于 12 小时制,我们需要对其进行转换。这种转换的方法很多。这里我使用if,else条件和map()函数。或者,您可以使用任何其他方法。
开始吧!!!!!
步骤1
如果您已经安装了这些库,请跳过步骤。
我们需要安装两个库。
1. 第一个是“RTClib”。这是一个主图书馆。因此,您可以将相同的库用于其他一些 RTC 模块。要安装此库,请打开 Arduino IDE 并转到Sketch > Include Library > Manage Libraries然后在右上角的搜索栏中键入RTClib 。然后点击安装

2.第二个库是“LiquidCrystal-I2C”。转到链接并下载库 Arduino-LiquidCrystal-I2C-library。然后打开 Arduino IDE 并转到Sketch>Include Library> Add.ZIP Library 。接下来选择下载的 ZIP 文件并单击打开。
库安装完成。
第2步
接下来我将创建一个草图。首先添加三个头文件1.RTClib.h、LiquidCrystal_I2C.h和Wire.h。使用 Wire 库是因为这里我们使用 I2C 协议进行通信。RTClib 库将有助于与 RTC 模块进行通信。LiquidCrystal_I2C 库有助于与 I2C LCD 进行通信。
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
步骤 - 3
接下来我声明,我将要使用的 RTC。这里是 DS1307,并为此设备创建一个名为“rtc”的对象。
RTC_DS1307 rtc
第4步
然后我创建另一个对象来调用 I2C LCD。对象名称是 lcd。并设置LCD的地址、列数和行数。这里我的 I2C LCD 的地址是 0x27,列数是 16,行数是 2。这是我的情况。如果您使用不同的 LCD,请使用它的列数和行数。如果您不知道 LCD 的地址,请单击此处,然后转到该文章中的第 1 步。
LiquidCrystal_I2C lcd(0x27, 16, 2);
步骤 - 5
该函数now.dayOfTheWeek()返回整数。例如。0 代表星期日,1 代表星期一,以此类推。所以我们需要将其转换为星期日、星期一、...以便于理解。为此,我声明了一个 2D 字符数组。请多注意数组的大小。我使用数组名称作为“daysOfTheWeek”。名称与功能相似。您可以使用任何其他名称。然后填充数组。这里我使用“Sun”而不是“Sunday”来节省 LCD 上的空间(这里我使用 16x2 I2C LCD)。接下来我声明一个整数类型变量,名为“temp”。这是用于存储有关 AM/PM 的信息。
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
int temp;
步骤 - 6
在设置部分,初始化 LCD 并打开 LCD 的背光。
lcd.begin();
lcd.backlight();
步骤 - 7
当 RTC 未运行时,在 LCD 上打印一条消息。这是出于调试目的。清除 LCD 并将光标设置为 (0, 0)。
if (! rtc.begin()) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RTC Not Working");
}
步骤 - 8
下一行代码用于首次更新到 MCU(此处为 Arduino)。当我们编译代码时,这些行有助于从计算机获取日期和时间。请多注意这些线路。因为在第一次将完整的代码上传到 Arduino 之后,您需要注释这些行并再次将代码上传到 Arduino。
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
步骤 - 9
现在我们需要打印欢迎信息。在这里我要打印“数字日历时钟”。首先将光标设置在 (0, 0) 并打印“数字日历”。然后将光标设置为 (5, 1)。并打印“时钟”。
lcd.setCursor(0, 0);
lcd.print("Digital Calendar");
lcd.setCursor(5, 1);
lcd.print("Clock");
设置部分完成
步骤-10
接下来对循环部分进行编码。使用 RTClib 获取时间的方法几乎只有一种,即调用now()DateTime now().
DateTime now = rtc.now();
步骤 - 11
然后使用 clear() 函数清除 LCD。Next 将光标设置在 (1, 0)。我将以“DD/MM/YYYY”格式打印日期。在这里,我使用now.day()函数来获取当前日期。now.month()用于获取当前月份和当前年份的函数。now.year()首先打印“日”,然后打印“/”,然后打印“月”,然后打印另一个“/”,然后打印“年”。
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(now.day());
lcd.print('/');
lcd.print(now.month());
lcd.print('/');
lcd.print(now.year());
步骤 - 12
接下来将光标设置在 (12, 0) 并打印星期几。函数“ now.dayOfTheWeek()”返回对应于星期几的整数值。我们将把该返回值插入到我们的数组“daysOfTheWeek[]”中并打印当前星期几。
lcd.setCursor(12, 0);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
步骤 - 13
将光标设置为 (2, 1)。现在我要打印小时。在此之前,我们需要将 24 小时制转换为 12 小时制。" now.hour()" 函数返回当前时间。0 代表上午 12 点,23 代表晚上 11 点
在这里,我将把小时分为四个部分。
使用“ if”语句做出决定。如果 now.hour() 为 0,则打印“12”并为 AM 设置 temp=0。
if (now.hour() == 0) {
lcd.print("12");
temp = 0;
}
步骤 - 14
接下来使用“ else if()”语句。仅当 now.hour() 大于或等于 11 时才打印。0 将从该语句中排除。now.hour()因为步骤 - 13 已经在该条件下工作。然后为 AM 设置 temp==1。
else if (now.hour() <= 11) {
lcd.print(now.hour());
temp = 0;
}
步骤 - 15
然后使用另一个else if()语句。这部分主要负责24小时制到12小时制的转换。这里我们使用map() 函数。这个函数有5个属性。首先是“ value”。这里,“ value”是函数“ now.hour()”的返回值。第二个属性是“ FromLow”。这意味着“”的最小值value是13。下一个属性是“ FromHigh”。表示“”的最大值value。第三个属性是“ToLow"这里是 1。最后一个属性是ToHigh”。它是 11。函数map()返回映射的值,我们打印该值。然后为 PM 设置 temp==1。
else if (now.hour() >= 13) {
lcd.print(map(now.hour(), 13, 23, 1, 11));
temp = 1;
}
步骤 - 16
如果 now.hour()==12 则打印 now.hour() 并为 PM 设置 temp==1。
if(now.hour()==12){
lcd.print(now.hour());
temp=1;
}
步骤 - 17
小时将由上述声明之一打印。接下来打印一个冒号,然后通过函数 now.minute() 打印分钟,再次打印一个冒号,然后通过函数 now.second() 打印当前秒。
lcd.print(':');
lcd.print(now.minute());
lcd.print(':');
lcd.print(now.second());
步骤 - 18
然后将光标设置在 (12, 1)。如果 temp==0 则打印 AM,如果 temp==1 则打印 PM。然后添加 1000 毫秒的延迟。
else if (temp == 1) {
lcd.print("PM");
}
delay(1000);
编程完成。完整的代码在代码部分给出。
步骤 - 19
请在上传代码前完成接线。
联系

电路图在图表部分给出。
步骤 - 20
将代码上传到 Arduino Uno。然后评论或删除(我推荐第一个选项)声明
“rtc.adjust(日期时间(F(__DATE__),F(__TIME__)));”
使用“//”,然后再次上传代码。
数字日历时钟完成。您还可以获得数字日历时钟
请不要复制粘贴我的代码。理解每一行代码并创建自己的草图
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !