资料介绍
描述
使用 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](https://file.elecfans.com/web2/M00/83/A7/pYYBAGOYDC-AcE_WAACNxGzMrhk492.jpg)
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](https://file.elecfans.com/web2/M00/83/1E/poYBAGOYDDGAcnsUAAAUs6caZdg063.jpg)
电路图在图表部分给出。
步骤 - 20
将代码上传到 Arduino Uno。然后评论或删除(我推荐第一个选项)声明
“rtc.adjust(日期时间(F(__DATE__),F(__TIME__)));”
使用“//”,然后再次上传代码。
数字日历时钟完成。您还可以获得数字日历时钟
请不要复制粘贴我的代码。理解每一行代码并创建自己的草图
- 使用Visuino在I2C LCD显示屏上显示DS1307的日期
- 使用Arduino和I2C LCD制作带按钮的简单菜单
- 如何在Arduino中使用20x4 I2C字符LCD显示器
- 使用Arduino的LCD I2C闪烁文本
- 带有I2C的LCD的数字面具
- Arduino DS1307 RTC时钟
- 如何在arduino中使用I2c LCD模块
- 带Arduino Uno的I2C 16x2 LCD接口(仅4线)
- Arduino和_LCD1602A液晶_I2C实验(附bug解析)
- 单片机应用系统设计技术——串行日历时钟
- I2C LCD 器件通过驱动带有 I2C 接口的 2 线式 16 字符 LCD 13次下载
- PCF8563 I2C 实时时钟/日历芯片 30次下载
- Arduino uno驱动I2C接口12864LCD屏幕程序及使用手册 99次下载
- DS1339A低电流I2C串行实时时钟 70次下载
- I2C总线接口时钟芯片DS1307在坦克半主动悬挂电控单元中
- I2C通信协议及其工作原理 4991次阅读
- Linux I2C驱动入门知识科普 1734次阅读
- 如何使用MAX7219和DS1307制作7段数字时钟 3564次阅读
- 如何利用Arduino UNO设计无RTC模块简单时钟 4425次阅读
- 什么是I2C通信协议? 7829次阅读
- i2c总线用来做什么_i2c总线数据传输过程 7305次阅读
- 微雪电子RTC时钟模块PCF8563 PCF8563T介绍 7739次阅读
- dfrobotI2C DS1307 RTC实时时钟模块介绍 5135次阅读
- digilent实时时钟日历模块简介 1556次阅读
- I2C总线技术在HDTV数字地面接收机中的应用解析 1057次阅读
- I2C总线的工作原理解析 6718次阅读
- AT89C52单片机实现日历时钟芯片DS12C887显示的设计 5371次阅读
- LPC2124开发板I2C总线接口的应用 1943次阅读
- 日历时钟和存储电路及键盘和显示电路介绍分析 4722次阅读
- 基于FPGA的I2C SLAVE模式总线的设计方案 1.3w次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论