如何讓AMEBA使用RTC時鐘模組

作者:曹永忠

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 時鐘模組

Tiny RTC I2C 時鐘模組

如下圖所示,我們可以參考時鐘模組之電路連接圖,先將電路連接完善後,撰寫與測試下列Tiny RTC I2C 時鐘模組測試程式。

時鐘模組電路連接方式

時鐘模組電路連接方式

在完成上圖所示之時鐘模組之電路連接後,如下圖所示,完成時鐘模組電路實際組裝的工作。

時鐘模組電路實際組裝圖

時鐘模組電路實際組裝圖

透過RTC時鐘模組管理時間

我們使用下表所示之「RTC 1307時鐘模組測試程式一」,進行時鐘模組程式的撰寫與測試,會得到如下圖所示之執行畫面,可以知道目前日期與時間的資料。

RTC 1307 時鐘模組測試程式一.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#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 DS1307 時鐘模組測試程式一執行畫面

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

使用RTC取得正確的日期與時間

在完成時鐘模組之電路連接後,因為RTC DS1307 時鐘模組會幫我們管理好時間,所以我們並不需要每次都重新設定,接下來,我們使用下表所示之「RTC 1307 時鐘模組測試程式二」,進行時鐘模組測試程式的撰寫與測試,可以得到如下圖所示之執行畫面,得到目前日期與時間的資料。

RTC 1307 時鐘模組測試程式二.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#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 ;
}
 RTC DS1307 時鐘模組測試程式二執行畫面

RTC DS1307 時鐘模組測試程式二執行畫面

小結

本文主要介紹Ameba開發板,透過RTC DS1307 時鐘模組取得正確時間,以及維持時間的驅動,相信透過本文的解說,讀者更可以應用Ameba在許多產業、工業上,甚至實務使用在物聯網上;後續筆者還會繼續發表智慧家庭相關的文章,讓我們在未來可以創造出更優質、智慧化的生活。

Author: 曹永忠

目前為自由作家,已有二十多年的開發資訊系統經驗,專長為於軟體工程、軟體開發與設計、物件導向程式設計、Arduino/Ameba/LinkIt 等開發版開發與應用、嵌入式系統開發,同時也喜歡商品攝影及人像攝影,並持續發表作品及相關專業著作。 原始碼網址:https://github.com/brucetsao/

Share This Post On
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x