2014年8月18日 星期一

Arduino RTC I2C 時鐘模組

本實驗為了設計時間功能,並且為了斷電時依然可以保留時間,因為Arduino開發板並沒有內置時鐘(Internal Clock)的功能,所以引入了外部的時間模組。本實驗引入了Arduino Tiny RTC I2C 時鐘模組, 24,可以見到Tiny RTC I2C 時鐘模組的外觀圖,本模組採用DS1307晶片,為了驅動它,請參考附錄中DS1307函式庫(Jeelab, 2013),並在下列Tiny RTC I2C 時鐘模組測試程式(DS1307_test1),讀出時間資料並且列印到Arduino開發板之監控通訊埠。


24 Tiny RTC I2C 時鐘模組
在寫時鐘程式之前,我們可以參考 25時鐘模組之電路連接圖,先將電路連接完善後,方能進行下列Tiny RTC I2C 時鐘模組測試程式的攥寫與測試。



25 時鐘模組電路連接方式

DS1307_test1(Tiny RTC I2C 時鐘模組測試程式)
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  Serial.print("System Date Time:(");
  Serial.print(__DATE__);
  Serial.print("^");
  Serial.print(__TIME__);
  Serial.println(")");
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    Serial.print("(");
    Serial.print(__DATE__);
    Serial.print("^");
    Serial.print(__TIME__);
    Serial.println(")");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {
  DateTime now = RTC.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
  Serial.print(" since midnight 1/1/1970 = ");
  Serial.print(now.unixtime());
  Serial.print("s = ");
  Serial.print(now.unixtime() / 86400L);
  Serial.println("d");
  // calculate a date which is 7 days and 30 seconds into the future
  DateTime future (now.unixtime() + 7 * 86400L + 30);
  Serial.print(" now + 7d + 30s: ");
  Serial.print(future.year(), DEC);
  Serial.print('/');
  Serial.print(future.month(), DEC);
  Serial.print('/');
  Serial.print(future.day(), DEC);
  Serial.print(' ');
  Serial.print(future.hour(), DEC);
  Serial.print(':');
  Serial.print(future.minute(), DEC);
  Serial.print(':');
  Serial.print(future.second(), DEC);
  Serial.println();
  Serial.println();
  delay(1000);
}

由上述程式Arduino開發板就可以做到讀取時間,並且透過該時間模組可以達到儲存目前時間並且可以自動達到時鐘的功能(就是Arduoino停電休息時,時間仍然會繼續計算且不失誤),對於工業上的應用,可以說是更加完備,因為企業不營業時,所有設備是關機不用的,但是營業時,所有設備開機時,不需要再次重新設定時間。

沒有留言:

張貼留言