电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>使用1307 RTC、I2C LCD和Arduino Uno的数字日历时钟

使用1307 RTC、I2C LCD和Arduino Uno的数字日历时钟

2022-12-15 | zip | 1.35 MB | 次下载 | 免费

资料介绍

描述

使用 1307 RTC、I2C LCD 和 Arduino Uno 的数字日历时钟

时间不是主要的,它是唯一的。” - 迈尔斯戴维斯。

在大多数项目中使用与时间相关的操作。例如,我们可以随时间自动化我们的户外灯。它会自动从指定时间打开到另一个预设时间。或者我们可以制作一个自动上课铃。还有很多。MCU不能自己做。我们使用 RTC(实时时钟)在 MCU 中设置实时时间。

“数字日历时钟”是 RTC 的基础项目。市场上有很多类型的 RTC 模块。这里我使用 1307 RTC 模块。

在这里,我使用了我之前记录的相同 I2C LCD。如果您之前没有阅读过,请先从这里阅读

在本文中,

  • DS1307 RTC简介
  • 在 Arduino IDE 中安装库。
  • 创建 Arduino Sketch 的关键点
  • Arduino代码解释。
  • 最后制作“数字时钟日历。

DS1307 实时时钟

  • DS1307 是一款 RTC IC,有助于跟踪时间。这是一个8针IC
  • 在 DS1307 中,数据以二进制十进制编码的位模式传输。DS1307 的数据传输率为 56 字节。
  • I2C 是用于与 MCU 通信的协议
  • DS1307 RTC Module主要由DS1307 IC、3V纽扣电池、2个上拉电阻和一个32.768 kHz晶振组成。
  • 我们可以得到当前的时、分、秒、星期、日、月和年。

DS1307的引脚排列

  • 引脚 1、2:这些引脚用于标准 32.768 石英晶体。
  • 引脚 3:该引脚用于连接 DS1307 的电池。
  • 引脚 4:我们必须在此引脚上应用接地。
  • PIN 5:此引脚标记为 SDA,是串行数据线的缩写。
  • PIN 6:用于串行时钟输入(SCL)和数据同步。
  • 引脚 7:该引脚用于输出方波获取器(SQW)。
  • 引脚 8:在此引脚,我们提供外部电源 (Vcc)。

创建 Arduino Sketch 的关键点

这里我们使用“RTClib”库。我们可以得到 24 小时制。对于 12 小时制,我们需要对其进行转换。这种转换的方法很多。这里我使用if,else条件和map()函数。或者,您可以使用任何其他方法。

开始吧!!!!!

步骤1

在 Arduino IDE 中安装库

如果您已经安装了这些库,请跳过步骤。

我们需要安装两个库。

1. 第一个是“RTClib”。这是一个主图书馆。因此,您可以将相同的库用于其他一些 RTC 模块。要安装此库,请打开 Arduino IDE 并转到Sketch > Include Library > Manage Libraries然后在右上角的搜索栏中键入RTClib 然后点击安装

 
 
 
pYYBAGOYDC-AcE_WAACNxGzMrhk492.jpg
 
1 / 2
 

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 点

在这里,我将把小时分为四个部分。

  • 0
  • 1 到 11
  • 12
  • 13 至 23

使用“ 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

请在上传代码前完成接线。

联系

poYBAGOYDDGAcnsUAAAUs6caZdg063.jpg
 

电路图在图表部分给出。

步骤 - 20

将代码上传到 Arduino Uno。然后评论或删除(我推荐第一个选项)声明

“rtc.adjust(日期时间(F(__DATE__),F(__TIME__)));”

使用“//”,然后再次上传代码。

数字日历时钟完成。您还可以获得数字日历时钟

请不要复制粘贴我的代码。理解每一行代码并创建自己的草图

 


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费