概述
这是一个出色的电池支持实时时钟(RTC),即使重新编程或断电,您的微控制器项目也可以跟踪时间。 DS1307是最流行的RTC,最适合与基于5V的芯片(如Arduino)配合使用。
可快速组装和使用
将插头插入任何面包板,也可以使用电线
我们提供了带有Arduino的示例代码和库我们的文档页面上的演练
两个安装孔
将保持5年或更长时间
此分线板是一个套件,需要一些只需15分钟即可完成。
什么是RTC?
实时时钟基本上就像手表一样-它依靠电池供电,即使断电也能为您节省时间!使用RTC,即使您对微控制器进行重新编程或将其与USB或电源插头断开连接,您也可以跟踪较长的时间线。
大多数微控制器(包括Arduino)都具有称为“ millis(),并且芯片中还内置了计时器,可以跟踪更长的时间段,例如分钟或几天。那么,为什么要有单独的RTC芯片呢?好吧,最大的原因是 millis()仅跟踪时间,因为Arduino上次供电是- 。这意味着打开电源后,毫秒计时器将设置为0。Arduino不知道它是“星期二”还是“ 3月8日”,它只能告诉我“自从我上次离开以来已经过了14,000毫秒”
确定,如果要在Arduino上设置时间怎么办?您必须编程日期和时间,从那时起您就可以算上它了。但是,如果失去电源,则必须重新设置时间。就像非常便宜的闹钟一样:每当他们掉电时,它们都会闪烁 12:00
尽管这种基本的计时功能在某些项目中是可行的,但在某些项目中,例如数据记录器,时钟等必须保持一致的计时,当Arduino电池耗尽或重新编程时,计时不会重置。因此,我们包括一个单独的RTC! RTC芯片是一种专门的芯片,可以跟踪时间。它可以计算leap年,并且知道一个月中有多少天,但是它不考虑夏时制(因为它在不同的地方有所不同)
https://en.wikipedia.org/wiki/Real-time_clock#/media/File :上图显示的是带有实时时钟DS1387的计算机主板。其中有一个锂电池,这就是为什么它这么大。
我们将使用的RTC是DS1307。它价格低廉,易于焊接,并且可以在非常小的硬币电池上运行数年。
备份
只要它有一个可运行的纽扣电池,即使Arduino断电或被重新编程,RTC也会在很长的时间内运行。
使用任何CR1220 3V锂金属纽扣电池:
CR1220 12mm直径-3V锂币电池电池
产品编号:380
这些是最高质量的电池。容量的电池,与iCufflinks,iNecklace,Datalogging和GPS Shields,GPS HAT等产品随附的电池相同。每笔订购一个电池。..
$ 0.95
入库
添加到购物车
您必须安装纽扣电池才能使RTC正常工作,如果没有纽扣电池,则应将电池引脚拉低。
零件列表
如果您有组装版本,请跳过此步骤,即为您完成!
ImageName说明零件信息数量
IC2实时时钟芯片DS13071
Q132.768 KHz,12.5 pF手表晶体通用32.768KHz晶体1
R1,R21/4W 5%2.2K电阻
红色,红色,红色,金色通用2
C10.1uF陶瓷电容器(104)通用1
5针公头(1x5)通用1
BATT12mm 3V锂纽扣电池(截至2015年10月15日,产品不再配备纽扣电池-尽管我们建议您购买纽扣电池!)CR12201
BATT‘12mm硬币电池座Keystone 30011
PCB电路板Adafruit Industries1
组装
如果您有组装版本,请跳过此步骤,即完成为您服务!
将电阻,晶体和电容器的引线短路。
通过检查零件清单并确认您拥有一切,准备组装套件!
下一步,加热烙铁并清理办公桌。
将电路板放在虎钳中,以便您可以轻松地对其进行操作。
通过在电池负极上焊接一个小凸起开始:这样可以更好地接触!
放置两个2.2K电阻和一个陶瓷电容器。它们是对称的,因此无需担心方向。 如果您打算与Raspberry Pi(具有3.3V逻辑并内置上拉电阻)一起使用,请跳过2.2K电阻!
然后放置晶体(也是对称的),电池座(继续,以便电池可以在侧面滑动)和RTC芯片。必须放置RTC芯片,使末端的凹口/圆点与丝印相匹配。看左图,缺口指向下。在焊接芯片之前,请仔细检查,因为它很难撤消!
为防止电池座掉落,您可能需要从顶部“点焊”它。
然后在板上翻转并焊接所有引脚。
如果您愿意要使用插头将分线板插入某些东西,请将插头插入面包板,长边朝下放置,使短路针穿过焊盘。
将其焊接到位。
插入电池,使+面平UP。 电池可以使用5年或更长时间,因此无需拆卸或更换电池。
您必须安装纽扣电池才能使RTC正常工作,如果没有纽扣电池,它将被扼杀并可能挂起Arduino,因此请务必确保已安装电池,即使电池没电也是如此。
接线
只有5个引脚: 5V GND SCL SDA SQW 。
5V 用于为RTC芯片供电以查询时间。如果没有5V信号,则芯片会通过纽扣电池进入休眠状态。
将 GND 连接到公共电源/数据地
SCL 引脚连接到Arduino上的I2C时钟 SCL 引脚。在基于UNO和’328的Arduino上,这也称为 A5 ,在Mega上也称为 digital 21 ,在Leonardo/Micro上,也称为数字3
将 SDA 引脚连接到Arduino上的I2C数据 SDA 引脚。在基于UNO和‘328的Arduino上,这也称为 A4 ;在Mega上,其也称为 digital 20 ;在Leonardo/Micro上,这也称为数字2
SQW 是RTC可选的方波输出(如果已配置的话)。大多数人不需要或使用此图钉
用于Arduino UNO的有趣插件
如果将模拟引脚 A3 设置为OUTPUT和HIGH,将 A2 设置为OUTPUT和LOW,则可以直接从引脚为RTC供电!
将Arduino UNO A4连接到SDA。将Arduino模拟引脚A5连接到SCL。
这仅适用于UNO和其他基于ATmega328的Arduino!
Arduino库
与RTC对话
RTC是i2c设备,这意味着它使用2条线进行通信。这两条线用于设置时间并进行检索。在Arduino UNO上,这些引脚还连接到模拟4 和 5 引脚。这有点烦人,因为我们当然希望最多有6个模拟输入来读取数据,而现在我们已经丢失了2个。
对于RTC库,我们将使用JeeLab卓越的分叉器可以在GitHub上找到RTC库 。您可以通过访问github存储库并手动下载来实现此目的,或者只需单击此按钮即可下载zip
安装Adafruit_RTCLib库
对于RTC库,我们将要使用JeeLab出色的RTC库的分支。
要开始对RTC进行读写,您需要安装Adafruit_RTClib库(在github存储库中的代码)。可以从Arduino库管理器中获得它,因此我们建议使用它。
从IDE中打开库管理器。..
,然后输入 RTClib 来查找库。
查找 Adafruit RTClib (可能还有其他!)
单击安装
我们在Arduino上也有很棒的教程在以下位置安装库:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
完成后,重新启动IDE
了解代码
首次RTC测试我们将演示的第一件事是一个测试草图,它将每秒从RTC读取时间。我们还将显示如果您卸下电池并更换电池会发生什么,因为这会导致RTC停止。因此,要开始使用,请在未给Arduino供电或未将其插入USB的情况下从电池座中取出电池。等待3秒钟,然后更换电池。这将重置RTC芯片。现在加载下面的草图(也可以在示例→RTClib→ds1307 中找到),并在数据记录器防护罩打开的情况下将其上传到Arduino!(别忘了安装DS1307库)在运行下面的代码之前)
现在打开串行控制台,并确保将波特率正确设置为 57600波特,您应该看到以下内容:
只要RTC芯片失去所有电源(包括备用电池) ),它将以0:0:0的形式报告时间,并且不会计数秒(停止)。无论何时设置时间,它都会开始计时。因此,基本上,这样做的结果是,一旦设置了时间,就永远不要卸下电池。您不需要,电池座也非常贴合,因此除非面板被压碎,否则电池不会“掉落”
设置时间加载相同的草图后,取消注释以 RTC开始的行。调整 像这样:
下载:文件
复制代码
if (! rtc.initialized()) {
Serial.println(“RTC is NOT running!”);
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); if (! rtc.initialized()) {
Serial.println(“RTC is NOT running!”);
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
这行很可爱,它的作用是根据您使用的计算机获取日期和时间(当您编译代码)并将其用于对RTC进行编程。如果您的计算机时间设置不正确,则应首先解决该问题。然后,您必须按上传按钮进行编译,然后立即上传。如果您先编译然后再上传,则时钟将在该时间段内关闭。
然后打开“串行”监视器窗口以显示时间已设置。
从现在开始,您将不再再次设置时间:电池将使用5年或以上。
读取时间 现在RTC快活了,我们想查询一下时间。让我们再次查看草图以了解其操作方法。
下载:文件
复制代码
void loop () {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print(’/‘);
Serial.print(now.month(), DEC);
Serial.print(’/‘);
Serial.print(now.day(), DEC);
Serial.print(“ (”);
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(“) ”);
Serial.print(now.hour(), DEC);
Serial.print(’:‘);
Serial.print(now.minute(), DEC);
Serial.print(’:‘);
Serial.print(now.second(), DEC);
Serial.println(); void loop () {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print(’/‘);
Serial.print(now.month(), DEC);
Serial.print(’/‘);
Serial.print(now.day(), DEC);
Serial.print(“ (”);
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(“) ”);
Serial.print(now.hour(), DEC);
Serial.print(’:‘);
Serial.print(now.minute(), DEC);
Serial.print(’:‘);
Serial.print(now.second(), DEC);
Serial.println();
使用RTClib获得时间的方法几乎只有一种,即调用 now(),该函数将返回一个DateTime对象,该对象描述您在调用 now()时的年,月,日,时,分和秒。
》
有些RTC库可以让您调用诸如 RTC.year()和 RTC.hour()之类的东西来获取当前的年份和小时。但是,存在一个问题,如果您碰巧在下一分钟滚动之前在 3:14:59 询问分钟,然后在分钟滚动之后的第二分钟问(所以在 3:15:00 ),您会看到时间为 3:14:00 ,该时间需要一分钟。如果您以其他方式进行操作,则可能会得到 3:15:59 -在另一方向上间隔一分钟。
因为这种情况发生的可能性不大-特别是如果您经常查询时间-我们会一次从RTC中获取时间的“快照”,然后将其拆分为 day()或 second() 如上所示。花费更多的精力,但是我们认为避免错误是值得的!
我们还可以通过调用 unixtime 来从DateTime对象中获取“时间戳”,该计数会计数自1970年1月1日午夜以来的秒数(不计算leap秒)
下载:文件
复制代码
Serial.print(“ since 1970 = ”);
Serial.print(now.unixtime());
Serial.print(“s = ”);
Serial.print(now.unixtime() / 86400L);
Serial.println(“d”); Serial.print(“ since 1970 = ”);
Serial.print(now.unixtime());
Serial.print(“s = ”);
Serial.print(now.unixtime() / 86400L);
Serial.println(“d”);
由于一天中有60 * 60 * 24 = 86400秒,因此我们可以很容易地算出好。当您想要跟踪自上次查询以来已经过去了多少时间,使一些数学变得容易得多时(例如检查是否在5分钟后,只需查看 unixtime()),这可能会很有用。 增加了300,您不必担心小时变化。
下载
数据表和文件您可以在GitHub上找到strong》
EagleCAD PCB文件
Adafruit Fritzing库中可用的Fritzing对象
DS1307产品页面
示意图
构造打印
责任编辑:wv
-
时钟
+关注
关注
10文章
1733浏览量
131469 -
DS1307
+关注
关注
1文章
34浏览量
14126
发布评论请先 登录
相关推荐
评论