DS1302, LCD 時鐘實驗


http://wp.me/ph3BR-1Zj

 

抄來的DS1302 LIBRARY 用起來還是不順手, 特別是月份英文全寫顯示有BUG, 沒有短寫月份英文等容易混淆日子, 例如12-10 是12月10日還是10月12日? 乾脆都一起改了.

用 COM PORT, 115200 BAUD, N81格式, 發送設定時間的字串, ARDUINO 收到後就設定好 DS1302. 改過的全部源碼,

https://drive.google.com/drive/folders/0B3YrRYrhHTqzNGlfRzRTM3NXSmM

設定用的字串, 源碼裡面寫的比較詳細.

簡單提要, 例子 “S,2017-06-11,21:46:00,7\r\n"

含意, S 開頭要設定RTC, 2017年6月11日, 21:46:00, 星期天, 最後的數字, 1- 7 分別代表 星期一 到 星期天

一共25個字符, 包括 \r\n = 0x0d, 0x0a

樣子看來長這樣,

xiaolaba_RTC.ino.jpg DS1302

 

 

 

 

初版的, 日月難分.

h_ttps://youtu.be/odHoNn7Ij50

 

 

RTC, Real Time Clock, 用一個鈕扣電池, 保證在系統斷電或不使用時, 依然繼續計時和年月日等等, 就是一個一直走但是看不到時鐘, 只要上電後設定一次, 就好了, 直到備份的電池幾年後耗盡電力.

用途, Temperature logger, 套加一顆 RTC 的話就可以隨時開機關機, 只要查詢 RTC, 就可以得到現在的年月日星期時間等等, 當然, 用MCU自帶的低功耗 RTC 模組, 自己寫一個 RTC 也可以, 不過懶惰也不值得花之間.

DS1302 是其中一種 RTC 的 IC, 懶惰不要自己焊接, 買幾個模組樣品就好.

實驗的源碼繼續東抄西湊, 不用多久就可以做出一個很耗電的電子鐘, 不過這只是插麵包板的實驗品, 最終設計不會這樣耗電.

DS1302 的 LIBRARY 用起來不太合意, 例如, 日月年的輸出, 會出現 09-12-2017, 英美的寫法解讀各有不同, 到底看了解讀為 SEP/12/2017 還是 09/DEC/2017, 一直對這種標示法很感冒, 因為不只一次碰到溝通誤會的事情, 有閒暇的就慢慢改, 沒空就這樣試加減用, 最後加上單獨讀取完整月份, 例如這樣,


// 完整月份
Serial.println(rtc.getMonthStr());

lcd.print(rtc.getMonthStr());

顯示會出現英文全寫的月份, 起碼就有點依據判斷真確的月份.

 

 

當然, 這個方法有點瑕疵的, 時鐘設定模式, 必須開啟, 燒錄一次, 然後解除, 禁止時間設定, 再燒一次, 不然……


// 時鐘設定模式
//setDS1302();

 

 

完整的源碼, serial port 115200 BAUD, CPU 不用太耗時間, 趕快睡覺去.

用ARDUINO IDE 的 COM PORT 監視可以看到時間, LCD 也會顯示時間.


//REF:
//http://blog.geeks.tw/post/148525684793/ds1302
//https://xiaolaba.wordpress.com/2013/05/13/dscf5143-lcd-char-map-test/
//http://www.rinkydinkelectronics.com/library.php?id=5, DS1302 library used
/*
顯示RTC模組時間
*/

#include <DS1302.h>
#include <LiquidCrystal.h>

// 初始化DS1302
// DS1302 rtc([RST], [DAT], [CLOCK]); 三個pin的接法
DS1302 rtc(12, 11, 10);

//modified 2013/may/11, xiaolaba, LCD1602, HD44780 compatible
// change D12, D11 to D7, D6, because Atmega328p D12 = MISO, D11 = MOSI, may interfere with max6675 SPI, test ok
// LCD pins ===== RS,E,D4,D5,D6,D7
// | | | | | |
// Arduino pins = 7, 6,5, 4, 3, 2
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setupLCD(){

// set up number of columns and rows
lcd.begin(16, 2);

//default position 0, line 0
// Print a message to the LCD.
lcd.print("hello, xiaolaba");

//move to position 0, line 1
lcd.setCursor(0, 1);
// print the custom char to the lcd
//lcd.write((uint8_t) 0);
// why typecast? see: http://arduino.cc/forum/index.php?topic=74666.0
//lcd.print((uint8_t) 0);
//lcd.print("2106-NOV-04, 2nd line");
lcd.print("hello, 2nd line");
delay(5000);
lcd.clear();
}



void setDS1302 (){
//取消寫入保護,設定日期時要這行
rtc.writeProtect(false);
// 以下是設定時間的方法,在電池用完之前,只要設定一次就行了
rtc.setDOW(SUNDAY); // 設定週幾,如FRIDAY
rtc.setTime(1, 11, 00); // 設定時間 時,分,秒 (24hr format)
rtc.setDate(04, 06, 2017); // 設定日期 日,月,年
}

void setup() {
// 時鐘正常執行模式
rtc.halt(false);

// 時鐘設定模式
setDS1302();

setupLCD();

// 設定Serial
Serial.begin(115200);
}



void loop() {
//將得到的日期時間顯示在Serial視窗
// 週幾
Serial.print(rtc.getDOWStr()); Serial.print(" ");
// 日期
Serial.print(rtc.getDateStr()); Serial.print(" -- ");
// 時間
Serial.print(rtc.getTimeStr()); Serial.print(" -- ");
// 完整月份
Serial.println(rtc.getMonthStr());

//顯示在 lcd1602
//lcd.clear();
lcd.setCursor(0, 0); // index 0, lcd line 1
lcd.print(rtc.getTimeStr()); //time
lcd.setCursor(13, 0); // index 9, lcd line 1
lcd.print(rtc.getDOWStr()); // week day
lcd.setCursor(0, 1); // index 0, lcd line2
lcd.print(rtc.getDateStr());
lcd.setCursor(12, 1); // index 0, lcd line2
lcd.print(rtc.getMonthStr());

// 每次更新延遲1秒
delay (1000);
}

 

抄來用的DS1302 LIBRARY

http://www.rinkydinkelectronics.com/library.php?id=5

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s