智慧家庭實作:ARDUINO 永遠的時間靈魂-RTC時鐘模組

智慧家庭實作:ARDUINO 永遠的時間靈魂-RTC時鐘模組

智慧家庭的核心就是人,而人的最重視的事是時間,所以如何讓創客神器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 時鐘模組。  

智慧家庭實作:ARDUINO 永遠的時間靈魂-RTC時鐘模組
圖 1 Tiny RTC I2C 時鐘模組 

如下圖所示,我們可以參考時鐘模組之電路連接圖,先將電路連接完善後,攥寫與測試下列Tiny RTC I2C 時鐘模組測試程式。

智慧家庭實作:ARDUINO 永遠的時間靈魂-RTC時鐘模組
圖 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",
  "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("\"");
  }
}

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停電休息時,時間仍然會繼續計算且不失誤),對於工業上的應用,可以更加完備,因為企業不營業時,所有設備是關機不用的,但是營業時,所有設備開機時,不需要再次重新設定時間。

 智慧家庭實作:ARDUINO 永遠的時間靈魂-RTC時鐘模組
圖 3 RTC DS1307 時鐘模組測試程式一執行畫面

後面還有更多內容!

曹永忠
作者

曹永忠,國立中央大學資訊管理學系博士,目前在暨南大學電機工程學系兼任助理教授與自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計......並持續發表作相關專業著作。

使用 Facebook 留言
發表回應
謹慎發言,尊重彼此。按此展開留言規則