概述
這是一個(gè)出色的電池支持實(shí)時(shí)時(shí)鐘(RTC),即使重新編程或斷電,您的微控制器項(xiàng)目也可以跟蹤時(shí)間。 DS1307是最流行的RTC,最適合與基于5V的芯片(如Arduino)配合使用。
可快速組裝和使用
將插頭插入任何面包板,也可以使用電線
我們提供了帶有Arduino的示例代碼和庫(kù)我們的文檔頁(yè)面上的演練
兩個(gè)安裝孔
將保持5年或更長(zhǎng)時(shí)間
此分線板是一個(gè)套件,需要一些只需15分鐘即可完成。
什么是RTC?
實(shí)時(shí)時(shí)鐘基本上就像手表一樣-它依靠電池供電,即使斷電也能為您節(jié)省時(shí)間!使用RTC,即使您對(duì)微控制器進(jìn)行重新編程或?qū)⑵渑cUSB或電源插頭斷開(kāi)連接,您也可以跟蹤較長(zhǎng)的時(shí)間線。
大多數(shù)微控制器(包括Arduino)都具有稱為“ millis(),并且芯片中還內(nèi)置了計(jì)時(shí)器,可以跟蹤更長(zhǎng)的時(shí)間段,例如分鐘或幾天。那么,為什么要有單獨(dú)的RTC芯片呢?好吧,最大的原因是 millis()僅跟蹤時(shí)間,因?yàn)锳rduino上次供電是- 。這意味著打開(kāi)電源后,毫秒計(jì)時(shí)器將設(shè)置為0。Arduino不知道它是“星期二”還是“ 3月8日”,它只能告訴我“自從我上次離開(kāi)以來(lái)已經(jīng)過(guò)了14,000毫秒”
確定,如果要在Arduino上設(shè)置時(shí)間怎么辦?您必須編程日期和時(shí)間,從那時(shí)起您就可以算上它了。但是,如果失去電源,則必須重新設(shè)置時(shí)間。就像非常便宜的鬧鐘一樣:每當(dāng)他們掉電時(shí),它們都會(huì)閃爍 12:00
盡管這種基本的計(jì)時(shí)功能在某些項(xiàng)目中是可行的,但在某些項(xiàng)目中,例如數(shù)據(jù)記錄器,時(shí)鐘等必須保持一致的計(jì)時(shí),當(dāng)Arduino電池耗盡或重新編程時(shí),計(jì)時(shí)不會(huì)重置。因此,我們包括一個(gè)單獨(dú)的RTC! RTC芯片是一種專門的芯片,可以跟蹤時(shí)間。它可以計(jì)算leap年,并且知道一個(gè)月中有多少天,但是它不考慮夏時(shí)制(因?yàn)樗诓煌牡胤接兴煌?/p>
https://en.wikipedia.org/wiki/Real-time_clock#/media/File :上圖顯示的是帶有實(shí)時(shí)時(shí)鐘DS1387的計(jì)算機(jī)主板。其中有一個(gè)鋰電池,這就是為什么它這么大。
我們將使用的RTC是DS1307。它價(jià)格低廉,易于焊接,并且可以在非常小的硬幣電池上運(yùn)行數(shù)年。
備份
只要它有一個(gè)可運(yùn)行的紐扣電池,即使Arduino斷電或被重新編程,RTC也會(huì)在很長(zhǎng)的時(shí)間內(nèi)運(yùn)行。
使用任何CR1220 3V鋰金屬紐扣電池:
CR1220 12mm直徑-3V鋰幣電池電池
產(chǎn)品編號(hào):380
這些是最高質(zhì)量的電池。容量的電池,與iCufflinks,iNecklace,Datalogging和GPS Shields,GPS HAT等產(chǎn)品隨附的電池相同。每筆訂購(gòu)一個(gè)電池。..
$ 0.95
入庫(kù)
添加到購(gòu)物車
您必須安裝紐扣電池才能使RTC正常工作,如果沒(méi)有紐扣電池,則應(yīng)將電池引腳拉低。
零件列表
如果您有組裝版本,請(qǐng)?zhí)^(guò)此步驟,即為您完成!
ImageName說(shuō)明零件信息數(shù)量
IC2實(shí)時(shí)時(shí)鐘芯片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日,產(chǎn)品不再配備紐扣電池-盡管我們建議您購(gòu)買紐扣電池?。〤R12201
BATT‘12mm硬幣電池座Keystone 30011
PCB電路板Adafruit Industries1
組裝
如果您有組裝版本,請(qǐng)?zhí)^(guò)此步驟,即完成為您服務(wù)!
將電阻,晶體和電容器的引線短路。
通過(guò)檢查零件清單并確認(rèn)您擁有一切,準(zhǔn)備組裝套件!
下一步,加熱烙鐵并清理辦公桌。
將電路板放在虎鉗中,以便您可以輕松地對(duì)其進(jìn)行操作。
通過(guò)在電池負(fù)極上焊接一個(gè)小凸起開(kāi)始:這樣可以更好地接觸!
放置兩個(gè)2.2K電阻和一個(gè)陶瓷電容器。它們是對(duì)稱的,因此無(wú)需擔(dān)心方向。 如果您打算與Raspberry Pi(具有3.3V邏輯并內(nèi)置上拉電阻)一起使用,請(qǐng)?zhí)^(guò)2.2K電阻!
然后放置晶體(也是對(duì)稱的),電池座(繼續(xù),以便電池可以在側(cè)面滑動(dòng))和RTC芯片。必須放置RTC芯片,使末端的凹口/圓點(diǎn)與絲印相匹配??醋髨D,缺口指向下。在焊接芯片之前,請(qǐng)仔細(xì)檢查,因?yàn)樗茈y撤消!
為防止電池座掉落,您可能需要從頂部“點(diǎn)焊”它。
然后在板上翻轉(zhuǎn)并焊接所有引腳。
如果您愿意要使用插頭將分線板插入某些東西,請(qǐng)將插頭插入面包板,長(zhǎng)邊朝下放置,使短路針穿過(guò)焊盤。
將其焊接到位。
插入電池,使+面平UP。 電池可以使用5年或更長(zhǎng)時(shí)間,因此無(wú)需拆卸或更換電池。
您必須安裝紐扣電池才能使RTC正常工作,如果沒(méi)有紐扣電池,它將被扼殺并可能掛起Arduino,因此請(qǐng)務(wù)必確保已安裝電池,即使電池沒(méi)電也是如此。
接線
只有5個(gè)引腳: 5V GND SCL SDA SQW 。
5V 用于為RTC芯片供電以查詢時(shí)間。如果沒(méi)有5V信號(hào),則芯片會(huì)通過(guò)紐扣電池進(jìn)入休眠狀態(tài)。
將 GND 連接到公共電源/數(shù)據(jù)地
SCL 引腳連接到Arduino上的I2C時(shí)鐘 SCL 引腳。在基于UNO和’328的Arduino上,這也稱為 A5 ,在Mega上也稱為 digital 21 ,在Leonardo/Micro上,也稱為數(shù)字3
將 SDA 引腳連接到Arduino上的I2C數(shù)據(jù) SDA 引腳。在基于UNO和‘328的Arduino上,這也稱為 A4 ;在Mega上,其也稱為 digital 20 ;在Leonardo/Micro上,這也稱為數(shù)字2
SQW 是RTC可選的方波輸出(如果已配置的話)。大多數(shù)人不需要或使用此圖釘
用于Arduino UNO的有趣插件
如果將模擬引腳 A3 設(shè)置為OUTPUT和HIGH,將 A2 設(shè)置為OUTPUT和LOW,則可以直接從引腳為RTC供電!
將Arduino UNO A4連接到SDA。將Arduino模擬引腳A5連接到SCL。
這僅適用于UNO和其他基于ATmega328的Arduino!
Arduino庫(kù)
與RTC對(duì)話
RTC是i2c設(shè)備,這意味著它使用2條線進(jìn)行通信。這兩條線用于設(shè)置時(shí)間并進(jìn)行檢索。在Arduino UNO上,這些引腳還連接到模擬4 和 5 引腳。這有點(diǎn)煩人,因?yàn)槲覀儺?dāng)然希望最多有6個(gè)模擬輸入來(lái)讀取數(shù)據(jù),而現(xiàn)在我們已經(jīng)丟失了2個(gè)。
對(duì)于RTC庫(kù),我們將使用JeeLab卓越的分叉器可以在GitHub上找到RTC庫(kù) 。您可以通過(guò)訪問(wèn)github存儲(chǔ)庫(kù)并手動(dòng)下載來(lái)實(shí)現(xiàn)此目的,或者只需單擊此按鈕即可下載zip
安裝Adafruit_RTCLib庫(kù)
對(duì)于RTC庫(kù),我們將要使用JeeLab出色的RTC庫(kù)的分支。
要開(kāi)始對(duì)RTC進(jìn)行讀寫,您需要安裝Adafruit_RTClib庫(kù)(在github存儲(chǔ)庫(kù)中的代碼)。可以從Arduino庫(kù)管理器中獲得它,因此我們建議使用它。
從IDE中打開(kāi)庫(kù)管理器。..
,然后輸入 RTClib 來(lái)查找?guī)臁?/p>
查找 Adafruit RTClib (可能還有其他?。?/p>
單擊安裝
我們?cè)贏rduino上也有很棒的教程在以下位置安裝庫(kù):
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
完成后,重新啟動(dòng)IDE
了解代碼
首次RTC測(cè)試我們將演示的第一件事是一個(gè)測(cè)試草圖,它將每秒從RTC讀取時(shí)間。我們還將顯示如果您卸下電池并更換電池會(huì)發(fā)生什么,因?yàn)檫@會(huì)導(dǎo)致RTC停止。因此,要開(kāi)始使用,請(qǐng)?jiān)谖唇oArduino供電或未將其插入U(xiǎn)SB的情況下從電池座中取出電池。等待3秒鐘,然后更換電池。這將重置RTC芯片?,F(xiàn)在加載下面的草圖(也可以在示例→RTClib→ds1307 中找到),并在數(shù)據(jù)記錄器防護(hù)罩打開(kāi)的情況下將其上傳到Arduino?。▌e忘了安裝DS1307庫(kù))在運(yùn)行下面的代碼之前)
現(xiàn)在打開(kāi)串行控制臺(tái),并確保將波特率正確設(shè)置為 57600波特,您應(yīng)該看到以下內(nèi)容:
只要RTC芯片失去所有電源(包括備用電池) ),它將以0:0:0的形式報(bào)告時(shí)間,并且不會(huì)計(jì)數(shù)秒(停止)。無(wú)論何時(shí)設(shè)置時(shí)間,它都會(huì)開(kāi)始計(jì)時(shí)。因此,基本上,這樣做的結(jié)果是,一旦設(shè)置了時(shí)間,就永遠(yuǎn)不要卸下電池。您不需要,電池座也非常貼合,因此除非面板被壓碎,否則電池不會(huì)“掉落”
設(shè)置時(shí)間加載相同的草圖后,取消注釋以 RTC開(kāi)始的行。調(diào)整 像這樣:
下載:文件
復(fù)制代碼
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__)));
這行很可愛(ài),它的作用是根據(jù)您使用的計(jì)算機(jī)獲取日期和時(shí)間(當(dāng)您編譯代碼)并將其用于對(duì)RTC進(jìn)行編程。如果您的計(jì)算機(jī)時(shí)間設(shè)置不正確,則應(yīng)首先解決該問(wèn)題。然后,您必須按上傳按鈕進(jìn)行編譯,然后立即上傳。如果您先編譯然后再上傳,則時(shí)鐘將在該時(shí)間段內(nèi)關(guān)閉。
然后打開(kāi)“串行”監(jiān)視器窗口以顯示時(shí)間已設(shè)置。
從現(xiàn)在開(kāi)始,您將不再再次設(shè)置時(shí)間:電池將使用5年或以上。
讀取時(shí)間 現(xiàn)在RTC快活了,我們想查詢一下時(shí)間。讓我們?cè)俅尾榭床輬D以了解其操作方法。
下載:文件
復(fù)制代碼
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獲得時(shí)間的方法幾乎只有一種,即調(diào)用 now(),該函數(shù)將返回一個(gè)DateTime對(duì)象,該對(duì)象描述您在調(diào)用 now()時(shí)的年,月,日,時(shí),分和秒。
》
有些RTC庫(kù)可以讓您調(diào)用諸如 RTC.year()和 RTC.hour()之類的東西來(lái)獲取當(dāng)前的年份和小時(shí)。但是,存在一個(gè)問(wèn)題,如果您碰巧在下一分鐘滾動(dòng)之前在 3:14:59 詢問(wèn)分鐘,然后在分鐘滾動(dòng)之后的第二分鐘問(wèn)(所以在 3:15:00 ),您會(huì)看到時(shí)間為 3:14:00 ,該時(shí)間需要一分鐘。如果您以其他方式進(jìn)行操作,則可能會(huì)得到 3:15:59 -在另一方向上間隔一分鐘。
因?yàn)檫@種情況發(fā)生的可能性不大-特別是如果您經(jīng)常查詢時(shí)間-我們會(huì)一次從RTC中獲取時(shí)間的“快照”,然后將其拆分為 day()或 second() 如上所示?;ㄙM(fèi)更多的精力,但是我們認(rèn)為避免錯(cuò)誤是值得的!
我們還可以通過(guò)調(diào)用 unixtime 來(lái)從DateTime對(duì)象中獲取“時(shí)間戳”,該計(jì)數(shù)會(huì)計(jì)數(shù)自1970年1月1日午夜以來(lái)的秒數(shù)(不計(jì)算leap秒)
下載:文件
復(fù)制代碼
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秒,因此我們可以很容易地算出好。當(dāng)您想要跟蹤自上次查詢以來(lái)已經(jīng)過(guò)去了多少時(shí)間,使一些數(shù)學(xué)變得容易得多時(shí)(例如檢查是否在5分鐘后,只需查看 unixtime()),這可能會(huì)很有用。 增加了300,您不必?fù)?dān)心小時(shí)變化。
下載
數(shù)據(jù)表和文件您可以在GitHub上找到strong》
EagleCAD PCB文件
Adafruit Fritzing庫(kù)中可用的Fritzing對(duì)象
DS1307產(chǎn)品頁(yè)面
示意圖
構(gòu)造打印
責(zé)任編輯:wv
-
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1704瀏覽量
131207 -
DS1307
+關(guān)注
關(guān)注
1文章
34瀏覽量
14094
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論