2018年4月17日 星期二

RTC DS1302 與 TM1637 四位數顯示器


即時時鐘 RTC DS1302 與 TM1637 四位數顯示器
[2017/03/19]
通常電腦關機之後重開機,能夠正確知道現在的時間,主要原因是主機板上有一個實時時鐘(RTC,real-time clock)晶片,搭配一顆電池;當電源關閉後,這個電池能持續提供時鐘運作。Arduino 為了成本考量,並沒有內建 RTC 晶片及電池,如果安裝 Arduino 網路擴展板,於開機時,可向網際網路的時間伺服器進行校時。如果沒有網路時,可以安裝 RTC 模組來校正時間,這也是我們今天要介紹的主題:RTC DS1302模組。

有一個額外的插曲:我兩三年前買的 RTC DS1302模組,換過新的電池後,依照線路圖接上,一點反應也沒有,在三確認了好幾次,還是不行,不知道是哪裡壞了,只好放棄。今天到光華商場再買一個新的,花了 50元,總算可以正常取得 RTC 的時間了。

[名詞]

實時時鐘(Real-time clock)是指可以像時鐘一樣輸出實際時間的電子裝置,一般會是積體電路,因此也稱為時鐘晶片。此名詞常用來表示在個人電腦、伺服器或嵌入式系統中有此機能的裝置,不過許多需要精確時的系統都會有此功能。
實時時鐘和定時器訊號(Clock signal)不同,後者只是數位電路中一個表示時間的方波訊號,而且不會以日常使用的時間單位表示。[維基百科]

網路時間協定(Network Time Protocol,簡稱NTP)是在資料網路潛伏時間可變的電腦系統之間通過封包交換進行時鐘同步的一個網路協定。自1985年以來,NTP是目前仍在使用的最古老的網際網路協定之一。[維基百科]

[材料]

• Arduino Uno  x 1
• DS1302 RTC 模組  x1
• TM1637 四位數七段顯示器模組 x1
• 連接線 x 11條

[接線圖]


• DS1302 與TM1637 模組連接線路 
DS-1302模組
Arduino
 TM 1637四位數段顯示器
GND Ground
GND
 GND
VCC +5V
5V
 VCC
RST
Pin 2
 -
DAT
Pin 3
 -
CLK
Pin 4
 -
-
Pin 8
 DIO
-
Pin 9
 CLK

[程式]

#include <ds1302.h>
#include <tm1637display.h>

// DS1302 初始化設定
DS1302 rtc(2, 3, 4);

// 設定 TM1637 接腳
#define CLK 9
#define DIO 8

TM1637Display display(CLK, DIO);
boolean colon = true ;

String dw = "";
String hh = "";
String mm = "";
String ss = ""; 
float t = 0; 
  
void setup()
{
  // 設定時鐘執行模式,取消寫入保護
  rtc.halt(false);
  rtc.writeProtect(false);
  
  // Setup Serial connection
  Serial.begin(9600);
  display.setBrightness(0xA);
  
// 第一次設定寫入 DS1302 RTC時鐘,之後可以加上註解
//  rtc.setDOW(SUNDAY);         // 設定每週星期幾?
//  rtc.setTime(20, 16, 30);     // 設定24小時時間 20:16:30 
//  rtc.setDate(19, 3, 2017);   // 設定日期(日, 月, 年)
}

void loop()
{
  // 取得星期幾
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // 取得日期
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // 取得時間
  dw = rtc.getTimeStr();
  Serial.println(dw);
  
  hh = dw.substring(0,2);          // 時數
  mm = dw.substring(3,5);          // 分鐘數
  ss = dw.substring(6,8);          // 秒數 

  // 顯示四位數中間的冒號
  uint8_t segto;
  int value = 1000;
  // 顯示 時:分
  int  t =  hh.toInt()*100  + mm.toInt();
  // 顯示 分:秒
  //  int t =  mm.toInt() *100 +ss.toInt();
  segto = 0x80 | display.encodeDigit((t / 100)%10);
  display.setSegments(&segto, 1, 1);
  delay(500);

  // 顯示時間
  display.showNumberDec(t, true);
  delay(500);
}

[參考資料]

•  Rinky Dink Electronics:DS1302 Library
•  Github:avishorp/Arduino library for TM1637 (LED Driver)
•  TMP1637 技術手冊

沒有留言:

張貼留言