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 
#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);
}

最终运行效果如图:
Arduino_OLED电子时钟_第1张图片

Arduino_OLED电子时钟_第2张图片

Arduino_OLED电子时钟_第3张图片

你可能感兴趣的:(Arduino)