保持Arduino項(xiàng)目的時(shí)間并不像您想的那么容易:一旦計(jì)算機(jī)連接不存在,您沒電的Arduino就會(huì)停止運(yùn)行,包括內(nèi)部代碼。
在為了使Arduino與周圍世界保持同步,您將需要所謂的“實(shí)時(shí)時(shí)鐘模塊”。
實(shí)時(shí)時(shí)鐘(RTC)的意義是什么?
您的計(jì)算機(jī)最有可能與互聯(lián)網(wǎng)同步時(shí)間,但它的內(nèi)部時(shí)鐘仍然可以即使沒有互聯(lián)網(wǎng)連接或電源關(guān)閉也能繼續(xù)工作。當(dāng)您使用Arduino插入計(jì)算機(jī)時(shí),它可以訪問系統(tǒng)時(shí)鐘提供的準(zhǔn)確時(shí)間。這非常有用,但是大多數(shù)Arduino項(xiàng)目都設(shè)計(jì)為不在計(jì)算機(jī)上使用–到那時(shí),無論何時(shí)拔掉電源或Arduino重新啟動(dòng),它絕對(duì)不知道現(xiàn)在幾點(diǎn)。內(nèi)部時(shí)鐘將被重置,并在下一次啟動(dòng)時(shí)從零開始重新計(jì)數(shù)。
如果您的項(xiàng)目與需要時(shí)間有關(guān),例如我的夜燈和日出鬧鐘,那么這很明顯成為一個(gè)問題。在該項(xiàng)目中,我們通過以一種相當(dāng)粗略的方式手動(dòng)設(shè)置每晚的時(shí)間來解決該問題-用戶在上床睡覺之前將按下重置按鈕,從而提供了手動(dòng)時(shí)間同步。顯然,這不是一個(gè)理想的長期解決方案。
RTC模塊是額外的電路,需要一塊小的紐扣電池,即使關(guān)閉Arduino,它也可以繼續(xù)計(jì)時(shí)。設(shè)置一次–它將使電池的壽命(通常是一年左右)有效。
TinyRTC
Arduino最受歡迎的RTC稱為TinyRTC,可以購買在eBay上大約需要5至10美元。您最有可能需要提供自己的電池(將這些電池運(yùn)到國外很多地方是違法的)和一些接頭(插入孔中的銷,您需要自己焊接在這些孔中)。
這是我擁有的模塊:
它甚至具有內(nèi)置的溫度傳感器,但是如果您使用以下電池,則電池可以使用更長的時(shí)間不使用它。
在那個(gè)東西上的孔的數(shù)量看起來很嚇人,但是您只需要四個(gè)即可。 GND,VCC,SCL和SDA –您可以使用RTC模塊兩側(cè)的相關(guān)引腳。您使用I2C協(xié)議與時(shí)鐘對(duì)話,這意味著僅使用了兩個(gè)引腳-一個(gè)用于“時(shí)鐘”(串行通信數(shù)據(jù)時(shí)鐘,與時(shí)間無關(guān)),另一個(gè)用于數(shù)據(jù)。實(shí)際上,您甚至可以在相同的兩個(gè)引腳上鏈接多達(dá)121個(gè)I2C設(shè)備-請(qǐng)?jiān)L問Adafruit頁面以選擇可以添加的其他I2C設(shè)備,因?yàn)檫€有很多!
入門 strong》
根據(jù)下圖連接TinyRTC模塊–不需要粉紅色的DS線,因?yàn)樗怯糜跍囟葌鞲衅鞯摹?/p>
下一步,下載Time和DS1307RTC庫,并將生成的文件夾放在您的/libraries 文件夾中。
退出并重新啟動(dòng)Arduino環(huán)境以加載到庫和示例中。
您將在DS1307RTC菜單中找到兩個(gè)示例:首先上傳并運(yùn)行 SetTime 示例-這會(huì)將RTC設(shè)置為正確的時(shí)間。實(shí)際的代碼不值得詳細(xì)介紹,只是知道您需要運(yùn)行一次才能執(zhí)行初始時(shí)間同步。
接下來,請(qǐng)使用 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);
}
。請(qǐng)注意,我們還包括了核心 Wire.h 庫–該庫隨Arduino一起提供,用于通過I2C進(jìn)行通信。上載代碼,以9600波特打開串口控制臺(tái),然后觀察,您的Arduino將每秒輸出當(dāng)前時(shí)間。
該示例中最重要的代碼是創(chuàng)建一個(gè) tmElements_t tm –一種我們將在當(dāng)前時(shí)間填充的結(jié)構(gòu);和 RTC.read(tm)函數(shù),該函數(shù)從RTC模塊獲取當(dāng)前時(shí)間,并將其放入我們的 tm 結(jié)構(gòu),如果一切順利,則返回true。在該“ if”語句中添加調(diào)試或邏輯代碼,例如打印時(shí)間或?qū)ζ渥鞒龇磻?yīng)。
現(xiàn)在,您知道如何使用Arduino獲得正確的時(shí)間,您可以嘗試重寫日出報(bào)警項(xiàng)目或創(chuàng)建一個(gè)LED字時(shí)鐘–無限的可能性!你會(huì)做什么?
責(zé)任編輯:wv
-
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1901瀏覽量
133242 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192207
發(fā)布評(píng)論請(qǐng)先 登錄
愛普生RA4000CE實(shí)時(shí)時(shí)鐘模塊車載BMS系統(tǒng)的理想選擇

實(shí)時(shí)時(shí)鐘模塊選擇指南和比較表
基于FPGA的實(shí)時(shí)時(shí)鐘設(shè)計(jì)

LinkedSemi凌思微:DD3225TR實(shí)時(shí)時(shí)鐘模塊

LinkedSemi凌思微:DD3225TS實(shí)時(shí)時(shí)鐘模塊

TPS65950實(shí)時(shí)時(shí)鐘時(shí)序補(bǔ)償分析

使用實(shí)時(shí)時(shí)鐘庫

適用于智能門鎖的低功耗RTC實(shí)時(shí)時(shí)鐘模塊RX8010SJ

bq32000實(shí)時(shí)時(shí)鐘(RTC)數(shù)據(jù)表

BQ32002實(shí)時(shí)時(shí)鐘(RTC)數(shù)據(jù)表

bq3285E/L實(shí)時(shí)時(shí)鐘(RTC)數(shù)據(jù)表

bq3285實(shí)時(shí)時(shí)鐘(RTC)數(shù)據(jù)表

bq4802Y/bq4802LY實(shí)時(shí)時(shí)鐘數(shù)據(jù)表

TCXO RTC實(shí)時(shí)時(shí)鐘模塊的特性

評(píng)論