好久之前入手了一個高精度時鐘模塊DS3231,之後就一直閒置着。國慶實在是太閒,收拾東西的時候找出來了,就想着做一個電子時鐘測試一下這個時鐘模塊準不準吧。
材料:Arduino Uno, 麪包板, DS3231, 12864的OLED屏
原理什麼的就不細講了,很簡單的。先初始化DS3231,這個時鐘模塊斷電以後還可以計時,先用串口給一個精確的時間,然後加上OLED,每隔500ms(考慮到程序運行時間不能設置爲1000ms,否則不一定每秒都會更新,不過還是會有一丟丟的顯示誤差)讀取一次時間,並輸出在OLED上。
DS3231的使用方法可見賣家的資料,在DS3231.c和DS3231.h上有會用到的函數,簡單易懂。
OLED的使用方法網上很多的,而且這次只是顯示字符而已,請自行查閱。
連線的話(OLED與DS3231接線相同):
5V —— VCC
GND —— GND
A4 —— SDA
A5 —— SCL
另:
本人使用的DS3231和OLED均使用IIC通信,IIC通信是可以串聯多個設備的,但一定要保證各個設備的地址是不一樣的。地址可以在對應的庫文件裏面找到,一般是一個名爲 xxx_ADDRESS的宏定義。找不到的話可自行百度“Arduino IIC 地址掃描”。
代碼如下
#include <DS3231.h>
#include "U8glib.h"
DS3231 rtc(SDA, SCL);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
void Init(int y,int mmon,int d,int h,int mmin,int s)
{
rtc.setTime(h,mmin,s);
rtc.setDate(d,mmon,y);
rtc.setDOW();
}
void draw()
{
/*char data[10];
char week[10];
char t[8];
data = rtc.getDateStr(FORMAT_LONG,FORMAT_BIGENDIAN,'.');
week = rtc.getDOWStr(FORMAT_SHORT);
t = rtc.getTimeStr(FORMAT_LONG);*/
u8g.setFont(u8g_font_unifont);
u8g.setFontPosTop();
u8g.setPrintPos(0, 0);
u8g.print(rtc.getDateStr(FORMAT_LONG,FORMAT_BIGENDIAN,'.') );
u8g.setPrintPos(100, 0);
u8g.print(rtc.getDOWStr(FORMAT_SHORT) );
u8g.setPrintPos(35, 40);
u8g.print(rtc.getTimeStr(FORMAT_LONG) );
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
rtc.begin();
// Init(2019,10,6,20,1,50);
}
void loop() {
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
delay(500);
}
最終運行效果如圖: