在前篇文章中,我們通過庫函數(shù)驅(qū)動(dòng)DS1302獲取到時(shí)間數(shù)據(jù)并且通過串口輸出,而串口只是方便調(diào)試,要制作電子時(shí)鐘,我們需要使用顯示模塊,本篇結(jié)合OLED對時(shí)間數(shù)據(jù)進(jìn)行展示。
1
實(shí)驗(yàn)材料
- Uno R3開發(fā)板
- 配套USB數(shù)據(jù)線
- 公對母杜邦線
- 面包板及配套連接線
- OLED顯示屏
- DS1302模塊
2
實(shí)驗(yàn)步驟
1. 根據(jù)原理圖搭建電路圖。
在前篇基礎(chǔ)上添加了OLED模塊連接。DS1302模塊的VCC和GND連接Uno開發(fā)板的3.3V和GND。DS1302模塊的CLK、DAT、RST對應(yīng)連接Uno開發(fā)板的4、3、2引腳。OLED的VCC和GND分別連接開發(fā)板的3.3V和GND,OLED的SDA、SCL分別連接開發(fā)板的A4、A5引腳。
實(shí)驗(yàn)原理圖如下圖所示:
實(shí)驗(yàn)原理圖
2. 新建sketch,拷貝如下代碼替換自動(dòng)生成的代碼并進(jìn)行保存。
#include < DS1302.h >
#include < Wire.h >
#include < Adafruit_GFX.h >
#include < Adafruit_SSD1306.h >
#define OLED_RESET 4
Adafruit_SSD1306 oled(128, 64, &Wire, OLED_RESET);
DS1302 rtc(2, 3, 4); //對應(yīng)DS1302的RST,DAT,CLK
int sec_temp;
void initRTCTime(void)//初始化RTC時(shí)鐘
{
rtc.writeProtect(false); //關(guān)閉寫保護(hù)
rtc.halt(false); //清除時(shí)鐘停止標(biāo)志
Time t(2020, 4, 25, 21, 50, 50, 7); //新建時(shí)間對象 最后參數(shù)位星期數(shù)據(jù),周日為1,周一為2以此類推
rtc.time(t);//向DS1302設(shè)置時(shí)間數(shù)據(jù)
}
void updatTime()//打印時(shí)間數(shù)據(jù)
{
Time tim = rtc.time(); //從DS1302獲取時(shí)間數(shù)據(jù)
char date[20];
char timer[20];
snprintf(date, sizeof(date), "%04d-%02d-%02d",
tim.yr, tim.mon, tim.date);
snprintf(timer, sizeof(timer), "%02d:%02d:%02d",
tim.hr, tim.min, tim.sec);
if (tim.sec != sec_temp) { //一秒刷新一次
oled.clearDisplay();//清屏
oled.setCursor(15, 2);//設(shè)置顯示位置
oled.println("--CLOCK--");
oled.setCursor(4, 25);//設(shè)置顯示位置
oled.println(date);
oled.setCursor(18, 50);//設(shè)置顯示位置
oled.println(timer);
oled.display(); // 開顯示
}
sec_temp = tim.sec;
}
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setTextColor(WHITE);//開像素點(diǎn)發(fā)光
oled.clearDisplay();//清屏
oled.setTextSize(2); //設(shè)置字體大小
//新模塊上電需要設(shè)置一次當(dāng)前時(shí)間,
//下載完成后需屏蔽此函數(shù)再次下載,否則每次上電都會(huì)初始化時(shí)間數(shù)據(jù)
// initRTCTime();
}
void loop() {
updatTime();
}