Arduino 記事本 06 : Read-Time Clock(RTC)模組
網頁筆記本-006
Arduino 記事本 06 : Read-Time Clock(RTC)模組
- RTC:時鐘,可於系統端無電力供應狀態下,使用電池持續計數時間。
- 硬體&接線:
RTC模組
Tiny RTC I2C Modules (DS1307)
- 使用DS1307晶片。
- 電池使用LIR2032(3.6V),消耗少於500nA。
- 電池如改用CR2032(3.0V)需拆除D1、R4、R5、R6後,並短路R6接點。
未改裝會爆電池。 - VCC電壓使用5V。
- 二線式I2C介面(SDA、SCL)。
- 準確日曆至2100年
- 輸出:年/月/日,時:分:秒,具閏年補償。
- 提供4kBit EEPROM。
接線
- VCC => 5V
- GND => 0V
- SDA => SDA
- 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);
}
留言
張貼留言