保持Arduino項目的時間并不像您想的那么容易:一旦計算機連接不存在,您沒電的Arduino就會停止運行,包括內部代碼。
在為了使Arduino與周圍世界保持同步,您將需要所謂的“實時時鐘模塊”。
實時時鐘(RTC)的意義是什么?
您的計算機最有可能與互聯網同步時間,但它的內部時鐘仍然可以即使沒有互聯網連接或電源關閉也能繼續工作。當您使用Arduino插入計算機時,它可以訪問系統時鐘提供的準確時間。這非常有用,但是大多數Arduino項目都設計為不在計算機上使用–到那時,無論何時拔掉電源或Arduino重新啟動,它絕對不知道現在幾點。內部時鐘將被重置,并在下一次啟動時從零開始重新計數。
如果您的項目與需要時間有關,例如我的夜燈和日出鬧鐘,那么這很明顯成為一個問題。在該項目中,我們通過以一種相當粗略的方式手動設置每晚的時間來解決該問題-用戶在上床睡覺之前將按下重置按鈕,從而提供了手動時間同步。顯然,這不是一個理想的長期解決方案。
RTC模塊是額外的電路,需要一塊小的紐扣電池,即使關閉Arduino,它也可以繼續計時。設置一次–它將使電池的壽命(通常是一年左右)有效。
TinyRTC
Arduino最受歡迎的RTC稱為TinyRTC,可以購買在eBay上大約需要5至10美元。您最有可能需要提供自己的電池(將這些電池運到國外很多地方是違法的)和一些接頭(插入孔中的銷,您需要自己焊接在這些孔中)。
這是我擁有的模塊:
它甚至具有內置的溫度傳感器,但是如果您使用以下電池,則電池可以使用更長的時間不使用它。
在那個東西上的孔的數量看起來很嚇人,但是您只需要四個即可。 GND,VCC,SCL和SDA –您可以使用RTC模塊兩側的相關引腳。您使用I2C協議與時鐘對話,這意味著僅使用了兩個引腳-一個用于“時鐘”(串行通信數據時鐘,與時間無關),另一個用于數據。實際上,您甚至可以在相同的兩個引腳上鏈接多達121個I2C設備-請訪問Adafruit頁面以選擇可以添加的其他I2C設備,因為還有很多!
入門 strong》
根據下圖連接TinyRTC模塊–不需要粉紅色的DS線,因為它是用于溫度傳感器的。
下一步,下載Time和DS1307RTC庫,并將生成的文件夾放在您的/libraries 文件夾中。
退出并重新啟動Arduino環境以加載到庫和示例中。
您將在DS1307RTC菜單中找到兩個示例:首先上傳并運行 SetTime 示例-這會將RTC設置為正確的時間。實際的代碼不值得詳細介紹,只是知道您需要運行一次才能執行初始時間同步。
接下來,請使用 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將每秒輸出當前時間。
該示例中最重要的代碼是創建一個 tmElements_t tm –一種我們將在當前時間填充的結構;和 RTC.read(tm)函數,該函數從RTC模塊獲取當前時間,并將其放入我們的 tm 結構,如果一切順利,則返回true。在該“ if”語句中添加調試或邏輯代碼,例如打印時間或對其作出反應。
現在,您知道如何使用Arduino獲得正確的時間,您可以嘗試重寫日出報警項目或創建一個LED字時鐘–無限的可能性!你會做什么?
責任編輯:wv
-
時鐘
+關注
關注
10文章
1721瀏覽量
131378 -
Arduino
+關注
關注
187文章
6464瀏覽量
186681
發布評論請先 登錄
相關推薦
評論