“时间不是主要的,它是唯一的。” - 迈尔斯戴维斯。
在大多数项目中使用与时间相关的操作。例如,我们可以随时间自动化我们的户外灯。它会自动从指定时间打开到另一个预设时间。或者我们可以制作一个自动上课铃。还有很多。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条评论
快来发表一下你的评论吧 !