相關文章

Be1f6c8d221937372503be5e1191b2e9 智慧家庭的核心就是人,而人的最重視的事是時間,所以如何讓創客神器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",
  "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停電休息時,時間仍然會繼續計算且不失誤),對於工業上的應用,可以更加完備,因為企業不營業時,所有設備是關機不用的,但是營業時,所有設備開機時,不需要再次重新設定時間。

 
圖 3 RTC DS1307 時鐘模組測試程式一執行畫面

後面還有更多內容!

使用 Facebook 留言

發表回應

謹慎發言,尊重彼此。按此展開留言規則