作者:曹永忠
drive ameba time function by RTC module
智慧家庭的核心為人,而人最重視的是時間,如何讓「創客神器-Ameba」來顯示出時間,且時間是連續、不可磨滅的,Ameba開發版的確缺少這個非常重要的核心功能,雖然可以自己計時,但是在關機或重開機後,所有的時間又重來了,還儘管可以使用EEPROM或SD Card記憶卡來當作解決方案,但是終究不是一個很完善的解決方案,針對此問題,可以利用下列方式補足Ameba時間模組需求:
RTC時鐘模組的介紹與描述
我們首先介紹RTC時鐘模組,其模組具備了時間功能,且為了斷電時依然能保留時間,補足了Ameba開發板所沒有的內置時鐘(Internal Clock),正好可以使用它。如圖所示,可見到 Tiny RTC I2C 時鐘模組的外觀圖,模組採用DS1307晶片,若讀者需要更詳盡的資料,請參考『Arduino投幣計時器(網路篇)』,內容皆相關於RTC時鐘模組。
如下圖所示,我們可以參考時鐘模組之電路連接圖,先將電路連接完善後,撰寫與測試下列Tiny RTC I2C 時鐘模組測試程式。
在完成上圖所示之時鐘模組之電路連接後,如下圖所示,完成時鐘模組電路實際組裝的工作。
透過RTC時鐘模組管理時間
我們使用下表所示之「RTC 1307時鐘模組測試程式一」,進行時鐘模組程式的撰寫與測試,會得到如下圖所示之執行畫面,可以知道目前日期與時間的資料。
RTC 1307 時鐘模組測試程式一.
#include // AmebaIDE 內建
// LCD I2C Library,從這裡可以下載:
#include "RTClib.h"
RTC_DS1307 RTC;
int mYear = 2016 ;
int mMonth = 1 ;
int mDay = 1 ;
int mHour = 12 ;
int mMinute = 12 ;
int mSecond = 12 ;
void setup() {
Serial.begin(9600);
initRTC() ;
RTC.adjust(DateTime(mYear,mMonth,mDay,mHour,mMinute,mSecond));
}
void loop() {
Serial.print("Now Data and Time is :") ;
Serial.print(ShowDateTime()) ;
Serial.print("\n") ;
delay(1000) ;
}
void initRTC()
{
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
}
}
String ShowDateTime()
{
return StrDate() + " " +StrTime() ;
}
String StrDate() {
String ttt ;
//nowT = now;
DateTime now = RTC.now();
ttt = print4digits(now.year()) + "-" + print2digits(now.month()) + "-" + print2digits(now.day()) ;
//ttt = print4digits(NDPyear) + "/" + print2digits(NDPmonth) + "/" + print2digits(NDPday) ;
return ttt ;
}
String StringDate(int yyy,int mmm,int ddd) {
String ttt ;
//nowT = now;
ttt = print4digits(yyy) + "-" + print2digits(mmm) + "-" + print2digits(ddd) ;
return ttt ;
}
String StrTime() {
String ttt ;
// nowT = RTC.now();
DateTime now = RTC.now();
ttt = print2digits(now.hour()) + ":" + print2digits(now.minute()) + ":" + print2digits(now.second()) ;
// ttt = print2digits(NDPhour) + ":" + print2digits(NDPminute) + ":" + print2digits(NDPsecond) ;
return ttt ;
}
String StringTime(int hhh,int mmm,int sss) {
String ttt ;
ttt = print2digits(hhh) + ":" + print2digits(mmm) + ":" + print2digits(sss) ;
return ttt ;
}
String print2digits(int number) {
String ttt ;
if (number >= 0 && number < 10)
{
ttt = String("0") + String(number);
}
else
{
ttt = String(number);
}
return ttt ;
}
String print4digits(int number) {
String ttt ;
ttt = String(number);
return ttt ;
由上述程式的使用,Ameba開發板就可以做到讀取時間,並且透過該時間模組,可以達到儲存目前時間,及自動達到時鐘的功能(指當Ameba停電休息時,時間仍然會繼續計算且不失誤),對於工業上的應用,可以更加完備,因為當企業不營業時,所有設備是關機不用的,但是當營業時,所有設備開機,就不需要再次重新設定時間。
使用RTC取得正確的日期與時間
在完成時鐘模組之電路連接後,因為RTC DS1307 時鐘模組會幫我們管理好時間,所以我們並不需要每次都重新設定,接下來,我們使用下表所示之「RTC 1307 時鐘模組測試程式二」,進行時鐘模組測試程式的撰寫與測試,可以得到如下圖所示之執行畫面,得到目前日期與時間的資料。
RTC 1307 時鐘模組測試程式二.
#include // Arduino IDE 內建
// LCD I2C Library,從這裡可以下載:
#include "RTClib.h"
RTC_DS1307 RTC;
void setup() {
Serial.begin(9600);
initRTC() ;
}
void loop() {
Serial.print("Now Data and Time is :") ;
Serial.print(ShowDateTime()) ;
Serial.print("\n") ;
delay(1000) ;
}
void initRTC()
{
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
// RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
String ShowDateTime()
{
return StrDate() + " " +StrTime() ;
}
String StrDate() {
String ttt ;
//nowT = now;
DateTime now = RTC.now();
ttt = print4digits(now.year()) + "-" + print2digits(now.month()) + "-" + print2digits(now.day()) ;
//ttt = print4digits(NDPyear) + "/" + print2digits(NDPmonth) + "/" + print2digits(NDPday) ;
return ttt ;
}
String StringDate(int yyy,int mmm,int ddd) {
String ttt ;
//nowT = now;
ttt = print4digits(yyy) + "-" + print2digits(mmm) + "-" + print2digits(ddd) ;
return ttt ;
}
String StrTime() {
String ttt ;
// nowT = RTC.now();
DateTime now = RTC.now();
ttt = print2digits(now.hour()) + ":" + print2digits(now.minute()) + ":" + print2digits(now.second()) ;
// ttt = print2digits(NDPhour) + ":" + print2digits(NDPminute) + ":" + print2digits(NDPsecond) ;
return ttt ;
}
String StringTime(int hhh,int mmm,int sss) {
String ttt ;
ttt = print2digits(hhh) + ":" + print2digits(mmm) + ":" + print2digits(sss) ;
return ttt ;
}
String print2digits(int number) {
String ttt ;
if (number >= 0 && number < 10)
{
ttt = String("0") + String(number);
}
else
{
ttt = String(number);
}
return ttt ;
}
String print4digits(int number) {
String ttt ;
ttt = String(number);
return ttt ;
}
小結
本文主要介紹Ameba開發板,透過RTC DS1307 時鐘模組取得正確時間,以及維持時間的驅動,相信透過本文的解說,讀者更可以應用Ameba在許多產業、工業上,甚至實務使用在物聯網上;後續筆者還會繼續發表智慧家庭相關的文章,讓我們在未來可以創造出更優質、智慧化的生活。
- 【大氣監控站台開發案例(下)】環境監控即時監控看板 - 2021/11/25
- 【大氣監控站台開發案例(中)】環境監控雲端平台系統介紹 - 2021/11/02
- 【大氣監控站台開發案例(上)】 大氣監控站建置實例介紹 - 2021/10/18
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!