[第四課] RTC動起來與時間顯示 (I2C)

『拋棄時間的人,時間也會拋棄他。』Abandoning time person time to abandon him. ~莎士比亞
嵌入式系統的設計,除了必須選定執行效能C/P值高的核心處理器之外,還必須考慮其擴充連接性與互動性。Seeed XIAO與其擴充板的功能,正好符合NFC ACCP的需求。之前常用的Arduino NANO算是十分容易上手的主板,對於控制NFC Reader 模組來說,還是能游刃有餘。但自從某些需要帶OLED顯示的應用:如TagEncoder編碼機…,就發現可用的程式與記憶空間開始顯得侷促,如果再加上其他無線模組就會捉襟見肘了!

如果,『聲活良伴』作為陪伴是一個必須的特色,能夠有時間的觀念就可以達到計時、適時調整音量大小...,這些比較有智慧的設計就變得可能。剛好,XIAO擴充板裡,RTC已經是標配,所以裝上CR1220電池,做個不被時間拋棄的人吧!


PCF8563 是一Real-time clock/calendar的晶片,可在極低功耗下正常運作;並具有低電源的偵測,當給它的電源低於1.0V時,其暫存器的VL會設定為“1",即表示其內的時間與日曆已經失準或有錯誤了。

啟動RTC的設定方式:

    #include <PCF8563.h>
    //------Module Connection
    /* RTC via I2C*/
    PCF8563 pcf;

    pcf.init();//initialize the clock
    if (pcf.checkClockIntegrity()) {//Check clock integrity. 
      sl2 = "-RTC=OK";
      smartVol();
    } else {
      sl2 = "-RTC=NG";
      f_validRTC = false;
      ss = "System is some fault...";
    } 

上面檢查RTC時間的可靠性是在 setup() 裡進行的,萬一RTC曾發生失電或第一次啟動,勢必得重新設定日曆與時間。可是問題來了,NFC ACCP除了NFC介面之外,並沒有其他GPIO的輸入設計,要如何調整日期與時間呢?如何設定休眠計時器呢?難道還是要『拋棄時間』嗎?!

你一定也可以猜到,解決的方法還是用NFC的標籤來進行RTC的設定。還記得X-DISC的曲目索引資訊嗎?專輯必須使用目錄/01到/99,所以ACCP用目錄/100(0x64),來判斷此Tag是否為設定用的標籤,其格式如下: 

ACCP在掃描到此類的CONFIG標籤時,主程式會進入“CONFIG" 狀態,然後根據Func.Code進行相關的RTC設定;

        case CONFIG: {
       if (t_mem[1] == 0x44) {
          f_validRTC = true;
          st = "Setting RTC";
          ss = "Hold you tag a while..";
          switch (t_mem[2]) {
             case 0xA0: {
                if (t2_ReadPage(addrTkt-3, t_mem)) { //讀取日期與時間資訊
                   resetRTC(); //set RTC
                }
                state = NOP;
                sysDelay = 2000; 
                break;
             }
             case 0xA1: {
                if (f_newTag) delay(500); 
                fastRTC();
                sysDelay = 0;
                state = SCAN;
                break;
             }
             case 0xA2: {
                if (f_newTag) delay(500); 
                slowRTC();
                sysDelay = 0;
                state = SCAN;
                break;
             }
            ......
      }

而RTC的相關設定程式在 "SetRTC.ino",請自行參考。


留言

熱門文章