Arduino_OLED電子時鐘

好久之前入手了一個高精度時鐘模塊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);
}

最終運行效果如圖:
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章