[第四課] RTC動起來與時間顯示 (I2C)
『拋棄時間的人,時間也會拋棄他。』Abandoning time person time to abandon him. ~莎士比亞嵌入式系統的設計,除了必須選定執行效能C/P值高的核心處理器之外,還必須考慮其擴充連接性與互動性。Seeed XIAO與其擴充板的功能,正好符合NFC ACCP的需求。之前常用的Arduino NANO算是十分容易上手的主板,對於控制NFC Reader 模組來說,還是能游刃有餘。但自從某些需要帶OLED顯示的應用:如TagEncoder編碼機…,就發現可用的程式與記憶空間開始顯得侷促,如果再加上其他無線模組就會捉襟見肘了!
如果,『聲活良伴』作為陪伴是一個必須的特色,能夠有時間的觀念就可以達到計時、適時調整音量大小...,這些比較有智慧的設計就變得可能。剛好,XIAO擴充板裡,RTC已經是標配,所以裝上CR1220電池,做個不被時間拋棄的人吧!
//------Module Connection
/* RTC via I2C*/
/* 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;
}
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",請自行參考。
留言
張貼留言