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