保持Arduino項目的時間并不像您想的那么容易:一旦計算機連接不存在,您沒電的Arduino就會停止運行,包括內(nèi)部代碼。
在為了使Arduino與周圍世界保持同步,您將需要所謂的“實時時鐘模塊”。
實時時鐘(RTC)的意義是什么?
您的計算機最有可能與互聯(lián)網(wǎng)同步時間,但它的內(nèi)部時鐘仍然可以即使沒有互聯(lián)網(wǎng)連接或電源關(guān)閉也能繼續(xù)工作。當您使用Arduino插入計算機時,它可以訪問系統(tǒng)時鐘提供的準確時間。這非常有用,但是大多數(shù)Arduino項目都設(shè)計為不在計算機上使用–到那時,無論何時拔掉電源或Arduino重新啟動,它絕對不知道現(xiàn)在幾點。內(nèi)部時鐘將被重置,并在下一次啟動時從零開始重新計數(shù)。
如果您的項目與需要時間有關(guān),例如我的夜燈和日出鬧鐘,那么這很明顯成為一個問題。在該項目中,我們通過以一種相當粗略的方式手動設(shè)置每晚的時間來解決該問題-用戶在上床睡覺之前將按下重置按鈕,從而提供了手動時間同步。顯然,這不是一個理想的長期解決方案。
RTC模塊是額外的電路,需要一塊小的紐扣電池,即使關(guān)閉Arduino,它也可以繼續(xù)計時。設(shè)置一次–它將使電池的壽命(通常是一年左右)有效。
TinyRTC
Arduino最受歡迎的RTC稱為TinyRTC,可以購買在eBay上大約需要5至10美元。您最有可能需要提供自己的電池(將這些電池運到國外很多地方是違法的)和一些接頭(插入孔中的銷,您需要自己焊接在這些孔中)。
這是我擁有的模塊:
它甚至具有內(nèi)置的溫度傳感器,但是如果您使用以下電池,則電池可以使用更長的時間不使用它。
在那個東西上的孔的數(shù)量看起來很嚇人,但是您只需要四個即可。 GND,VCC,SCL和SDA –您可以使用RTC模塊兩側(cè)的相關(guān)引腳。您使用I2C協(xié)議與時鐘對話,這意味著僅使用了兩個引腳-一個用于“時鐘”(串行通信數(shù)據(jù)時鐘,與時間無關(guān)),另一個用于數(shù)據(jù)。實際上,您甚至可以在相同的兩個引腳上鏈接多達121個I2C設(shè)備-請訪問Adafruit頁面以選擇可以添加的其他I2C設(shè)備,因為還有很多!
入門 strong》
根據(jù)下圖連接TinyRTC模塊–不需要粉紅色的DS線,因為它是用于溫度傳感器的。

下一步,下載Time和DS1307RTC庫,并將生成的文件夾放在您的/libraries 文件夾中。
退出并重新啟動Arduino環(huán)境以加載到庫和示例中。

您將在DS1307RTC菜單中找到兩個示例:首先上傳并運行 SetTime 示例-這會將RTC設(shè)置為正確的時間。實際的代碼不值得詳細介紹,只是知道您需要運行一次才能執(zhí)行初始時間同步。
接下來,請使用 ReadTest 查看示例用法
#include
#include
#include
void setup() {
Serial.begin(9600);
while (!Serial) ; // wait for serial
delay(200);
Serial.println(“DS1307RTC Read Test”);
Serial.println(“-------------------”);
}
void loop() {
tmElements_t tm;
if (RTC.read(tm)) {
Serial.print(“Ok, Time = ”);
print2digits(tm.Hour);
Serial.write(‘:’);
print2digits(tm.Minute);
Serial.write(‘:’);
print2digits(tm.Second);
Serial.print(“, Date (D/M/Y) = ”);
Serial.print(tm.Day);
Serial.write(‘/’);
Serial.print(tm.Month);
Serial.write(‘/’);
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
} else {
if (RTC.chipPresent()) {
Serial.println(“The DS1307 is stopped. Please run the SetTime”);
Serial.println(“example to initialize the time and begin running.”);
Serial.println();
} else {
Serial.println(“DS1307 read error! Please check the circuitry.”);
Serial.println();
}
delay(9000);
}
delay(1000);
}
void print2digits(int number) {
if (number 》= 0 && number 《 10) {
Serial.write(‘0’);
}
Serial.print(number);
}
。請注意,我們還包括了核心 Wire.h 庫–該庫隨Arduino一起提供,用于通過I2C進行通信。上載代碼,以9600波特打開串口控制臺,然后觀察,您的Arduino將每秒輸出當前時間。
該示例中最重要的代碼是創(chuàng)建一個 tmElements_t tm –一種我們將在當前時間填充的結(jié)構(gòu);和 RTC.read(tm)函數(shù),該函數(shù)從RTC模塊獲取當前時間,并將其放入我們的 tm 結(jié)構(gòu),如果一切順利,則返回true。在該“ if”語句中添加調(diào)試或邏輯代碼,例如打印時間或?qū)ζ渥鞒龇磻?yīng)。
現(xiàn)在,您知道如何使用Arduino獲得正確的時間,您可以嘗試重寫日出報警項目或創(chuàng)建一個LED字時鐘–無限的可能性!你會做什么?
責任編輯:wv
-
時鐘
+關(guān)注
關(guān)注
11文章
1964瀏覽量
134699 -
Arduino
+關(guān)注
關(guān)注
190文章
6523瀏覽量
196459
發(fā)布評論請先 登錄
愛普生RTC實時時鐘模塊解析與選型指南
深入解析PCF85053A:一款強大的實時時鐘芯片
芯伯樂PCF8563:0.25μA低功耗實時時鐘解決方案
?bq3285實時時鐘(RTC)芯片技術(shù)文檔總結(jié)
實時時鐘芯片與晶振的不同之處
愛普生RA8804CE實時時鐘模塊在安防監(jiān)控中的應(yīng)用
愛普生RX8111CE實時時鐘模塊在汽車防盜系統(tǒng)中的應(yīng)用
愛普生RX8130CE實時時鐘成為智能家居系統(tǒng)的理想解決方案
愛普生RA4000CE實時時鐘模塊車載BMS系統(tǒng)的理想選擇
愛普生RX8901CE實時時鐘模塊賦能智能監(jiān)控系統(tǒng)的精準
實時時鐘模塊選擇指南和比較表
RA4000CE愛普生RTC實時時鐘模塊:車載BMS系統(tǒng)的理想選擇
愛普生實時時鐘與晶振技術(shù)賦能NIC網(wǎng)絡(luò)接口卡
如何向Arduino添加實時時鐘
評論