智慧家庭 :ARDUINO 永遠的時間 靈魂 -RTC 時鐘模組 2016 年 1 月 15 日 一月, 2016 文 \ 曹永忠 前言 智慧家庭的核心就是人, 而人的最重視的事是時間, 所以如何讓創客神器 Arduino 來顯示出時間, 並且時間是連續 不可磨滅的一件事, 但是創客神器 Arduino 開發版的確缺少這個非常重要的核心功能, 雖然創客神器 Arduino 可以自己計時, 但是關機或重開機後, 所有的時間又重來了, 雖然可以使用 EEPROM 或 SD Card 記憶卡來當作解決方案, 但是終究不是一個很完善的解決方案 RTC 時鐘模組 本文中我們介紹 RTC 時鐘模組, 該模組具備時間功能, 並且為了斷電時依然可以保留時間, 補足了 Arduino 開發板並沒有內置時鐘 (Internal Clock) 的功能, 正好可以使用該時間模組 如下圖所示, 可以見到 Tiny RTC I2C 時鐘模組的外觀圖, 模組採用 DS1307 晶片, 若讀者需要更詳盡的資料, 請參考拙作 Arduino 投幣計時器 ( 網路篇 ):Using Arduino to Develop a Timing Controlling Device via Internet ( 曹永忠, 許智誠, & 蔡英德, 2015a, 2015b, 2015c, 2015d; 曹永忠, 許碩芳, 許智誠, & 蔡英德, 2015a, 2015b) 內容關於 RTC 時鐘模組
圖 1 Tiny RTC I2C 時鐘模組 如下圖所示, 我們可以參考時鐘模組之電路連接圖, 先將電路連接完善後, 攥寫與測試下列 Tiny RTC I2C 時鐘模組測試程式 圖 2 時鐘模組電路連接方式 在完成上圖所示之時鐘模組之電路連接之後, 我們進行下表所示之 RTC 1307 時鐘模組測試程式一, 進行時鐘模組測試程式的攥寫與測試, 可以得到如下圖所示之執行畫面, 我們可以得到目前日期與時間的資料 表 1 RTC 1307 時鐘模組測試程式一 RTC DS1307 時鐘模組測試程式一 (SetTime) #include <DS1307RTC.h> #include <Time.h> #include <Wire.h> const char *monthname[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
RTC DS1307 時鐘模組測試程式一 (SetTime) ; "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" tmelements_t tm; void setup() { bool parse=false; bool config=false; // get the date and time the compiler was run if (getdate( DATE ) && gettime( TIME )) { parse = true; // and configure the RTC with this info if (RTC.write(tm)) { config = true; Serial.begin(9600); while (!Serial) ; // wait for Arduino Serial Monitor delay(200); if (parse && config) { Serial.print("DS1307 configured Time="); Serial.print( TIME ); Serial.print(", Date="); Serial.println( DATE ); else if (parse) { Serial.println("DS1307 Communication Error :-{"); Serial.println("Please check your circuitry"); else { Serial.print("Could not parse info from the compiler, Time=\""); Serial.print( TIME ); Serial.print("\", Date=\""); Serial.print( DATE ); Serial.println("\"");
RTC DS1307 時鐘模組測試程式一 (SetTime) void loop() { bool gettime(const char *str) { int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec)!= 3) return false; tm.hour = Hour; tm.minute = Min; tm.second = Sec; return true; bool getdate(const char *str) { char Month[12]; int Day, Year; uint8_t monthindex; if (sscanf(str, "%s %d %d", Month, &Day, &Year)!= 3) return false; for (monthindex = 0; monthindex < 12; monthindex++) { if (strcmp(month, monthname[monthindex]) == 0) break; if (monthindex >= 12) return false; tm.day = Day; tm.month = monthindex + 1; tm.year = CalendarYrToTm(Year); return true; 下載網址 :https://github.com/brucetsao/techbang/tree/master/201601 由上述程式 Arduino 開發板就可以做到讀取時間, 並且透過該時間模組可以達到儲存目前時間並且可以自動達到時鐘的功能 ( 就是 Arduoino 停電休息時, 時
間仍然會繼續計算且不失誤 ), 對於工業上的應用, 可以更加完備, 因為企業不營業時, 所有設備是關機不用的, 但是營業時, 所有設備開機時, 不需要再次重新設定時間 圖 3 RTC DS1307 時鐘模組測試程式一執行畫面 在完成時鐘模組之電路連接之後, 我們進行下表所示之 RTC 1307 時鐘模組測試程式二, 進行時鐘模組測試程式的攥寫與測試, 可以得到如下圖所示之執行畫面, 我們可以得到目前日期與時間的資料 表 2 RTC 1307 時鐘模組測試程式二 RTC DS1307 時鐘模組測試程式二 (ReadTime) #include <DS1307RTC.h> #include <Time.h> #include <Wire.h> void setup() { Serial.begin(9600); while (!Serial) ; // wait for serial delay(200); Serial.println("DS1307RTC Read Test");
RTC DS1307 時鐘模組測試程式二 (ReadTime) 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);
RTC DS1307 時鐘模組測試程式二 (ReadTime) void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); Serial.print(number); 下載網址 :https://github.com/brucetsao/techbang/tree/master/201601 圖 4 RTC DS1307 時鐘模組測試程式二執行畫面 本文主要介紹之 Arduino 開發板, 透過 RTC DS1307 時鐘模組取得正確時間與維持時間的驅動, 相信透過本文的解說, 讀者更可以應用創客神器 Arduino 在許多產業上 工業上, 甚至在物聯網的實務應用 後續筆者還會繼續發表智慧家庭相關的文章, 讓我們在未來可以創造出更優質 智慧化的家庭 敬請期待更多的文章 筆者介紹曹永忠 (Yung-Chung Tsao): 目前為自由作家, 專注於軟體工程 軟體開發與設計 物件導向程式設計 Arduino 開發 嵌入式系統開發, 商品攝影及人像攝影 長期投入資訊系統設計與開發 企業應用系統開發 軟體工程 新產品開發管理 商品及人像攝影等領域, 並持續發表作品及相關專業著作
Email:prgbruce@gmail.com,Line ID:dr.brucetsao Arduino 部落格 :http://taiwanarduino.blogspot.tw/ 臉書社群 (Arduino.Taiwan): https://www.facebook.com/groups/arduino.taiwan/ 活動官網 :http://arduino.kktix.cc/ Youtube:https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ 參考文獻 : 曹永忠, 許智誠, & 蔡英德. (2015a). Arduino 投币定时器 ( 网络篇 ):Using Arduino to Develop a Timing Controlling Device via Internet ( 初版 ed.). 台湾 彰化 : 渥瑪數位有限公司. 曹永忠, 許智誠, & 蔡英德. (2015b). Arduino 投幣計時器 ( 網路篇 ):Using Arduino to Develop a Timing Controlling Device via Internet ( 初版 ed.). 台湾 彰化 : 渥瑪數位有限公司. 曹永忠, 許智誠, & 蔡英德. (2015c). Arduino 程式教學 ( 常用模組篇 ):Arduino Programming (37 Sensor Modules) ( 初版 ed.). 台湾 彰化 : 渥玛数位有限公司. 曹永忠, 許智誠, & 蔡英德. (2015d). Arduino 编程教学 ( 常用模块篇 ):Arduino Programming (37 Sensor Modules) ( 初版 ed.). 台湾 彰化 : 渥玛数位有限公司. 曹永忠, 許碩芳, 許智誠, & 蔡英德. (2015a). Arduino 程式教學 (RFID 模組篇 ):Arduino Programming (RFID Sensors Kit) ( 初版 ed.). 台湾 彰化 : 渥瑪數位有限公司. 曹永忠, 許碩芳, 許智誠, & 蔡英德. (2015b). Arduino 編程教学 (RFID 模块篇 ):Arduino Programming (RFID Sensors Kit) ( 初版 ed.). 台湾 彰化 : 渥瑪數位有限公司.