Arduino 記事本 06 : Read-Time Clock(RTC)模組

網頁筆記本-006

Arduino 記事本 06 : Read-Time Clock(RTC)模組


  • RTC:時鐘,可於系統端無電力供應狀態下,使用電池持續計數時間。
  • 硬體&接線:


RTC模組


Tiny RTC I2C Modules (DS1307)


  1. 使用DS1307晶片。
  2. 電池使用LIR2032(3.6V),消耗少於500nA。
  3. 電池如改用CR2032(3.0V)需拆除D1、R4、R5、R6後,並短路R6接點。
    未改裝會爆電池。
  4. VCC電壓使用5V。
  5. 二線式I2C介面(SDA、SCL)。
  6. 準確日曆至2100年
  7. 輸出:年/月/日,時:分:秒,具閏年補償。
  8. 提供4kBit EEPROM。

接線


  1. VCC => 5V
  2. GND => 0V
  3. SDA => SDA
  4. SCL => SCL

  • LIB

安裝程式庫(LIB)


  • 選擇草稿碼 => 匯入程式庫 => 管理程式庫...
  • 尋找DS1307RTC => 安裝LIB(DS1307RTC by Michael Margolis),可以有<DS1307RTC.h>
  • 尋找RTC => 安裝LIB(Time by Michael Margolis),可以有<TimeLib.h>

  • Code


 // RTC寫入/讀出時間
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>

tmElements_t tmTime;
tmElements_t tmRTime;
/* tmElements_t 定義在TimeLib.h內,內容如下
 * uint8_t Second; 
 * uint8_t Minute; 
 * uint8_t Hour; 
 * uint8_t Wday;   // day of week, sunday is day 1
 * uint8_t Day;
 * uint8_t Month; 
 * uint8_t Year;   // offset from 1970;  
*/
void setup() {
  // 設定 COM Port
  Serial.begin(9600);   // Debug Port

  // 設定要寫入RTC的時間
  tmTime.Year  = CalendarYrToTm(2017);
  tmTime.Month = 11; 
  tmTime.Day   = 30;
  tmTime.Hour  = 11;
  tmTime.Minute  = 11;
  tmTime.Second  = 30;
  Serial.print(tmYearToCalendar(tmTime.Year));
  Serial.print(".");
  Serial.print(tmTime.Month);
  Serial.print(".");
  Serial.print(tmTime.Day);
  Serial.print("_");
  Serial.print(tmTime.Hour);
  Serial.print(":");
  Serial.print(tmTime.Minute);
  Serial.print(":");
  Serial.println(tmTime.Second);

  Serial.print("RTC 寫入時間");
  if (RTC.write(tmTime)) {
    Serial.println("...OK!");
  }
  else{
    Serial.println("...NG!");
  }

  delay(2000);
  Serial.print("RTC 讀出時間");
  if (RTC.read(tmRTime)) {
    Serial.println("...OK!");
    Serial.print(tmYearToCalendar(tmRTime.Year));
    Serial.print(".");
    Serial.print(tmRTime.Month);
    Serial.print(".");
    Serial.print(tmRTime.Day);
    Serial.print("_");
    Serial.print(tmRTime.Hour);
    Serial.print(":");
    Serial.print(tmRTime.Minute);
    Serial.print(":");
    Serial.println(tmRTime.Second);
  }
  else{
    Serial.println("...NG!");
  }
}

void loop() {
  Serial.print("RTC 讀出時間");
  if (RTC.read(tmRTime)) {
    Serial.println("...OK!");
    Serial.print(tmYearToCalendar(tmRTime.Year));
    Serial.print(".");
    Serial.print(tmRTime.Month);
    Serial.print(".");
    Serial.print(tmRTime.Day);
    Serial.print("_");
    Serial.print(tmRTime.Hour);
    Serial.print(":");
    Serial.print(tmRTime.Minute);
    Serial.print(":");
    Serial.println(tmRTime.Second);
  }
  else{
    Serial.println("...NG!");
  }
  delay(5000);
}



第一次寫入正確後就必須刪除Setup()內寫入時間的內容,否則啟動重新執行一次程式就會重置一次時間。

 // RTC 讀出時間
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>

tmElements_t tmRTime;
/* tmElements_t 定義在TimeLib.h內,內容如下
 * uint8_t Second; 
 * uint8_t Minute; 
 * uint8_t Hour; 
 * uint8_t Wday;   // day of week, sunday is day 1
 * uint8_t Day;
 * uint8_t Month; 
 * uint8_t Year;   // offset from 1970;  
*/
void setup() {
  // 設定 COM Port
  Serial.begin(9600);   // Debug Port
}

void loop() {
  Serial.print("RTC 讀出時間");
  if (RTC.read(tmRTime)) {
    Serial.println("...OK!");
    Serial.print(tmYearToCalendar(tmRTime.Year));
    Serial.print(".");
    Serial.print(tmRTime.Month);
    Serial.print(".");
    Serial.print(tmRTime.Day);
    Serial.print("_");
    Serial.print(tmRTime.Hour);
    Serial.print(":");
    Serial.print(tmRTime.Minute);
    Serial.print(":");
    Serial.println(tmRTime.Second);
  }
  else{
    Serial.println("...NG!");
  }
  delay(5000);
}







留言

這個網誌中的熱門文章

Arduino 記事本 07 : 發出聲音(無源蜂鳴器)控制

Arduino 記事本 04 : 使用內建提升電阻