玩命加载中 . . .

Arduino提高篇23—OLED电子时钟


在前篇文章中,我们通过库函数驱动DS1302获取到时间数据并且通过串口输出,而串口只是方便调试,要制作电子时钟,我们需要使用显示模块,本篇结合OLED对时间数据进行展示。

1. 实验材料

  • Uno R3开发板
  • 配套USB数据线
  • 公对母杜邦线
  • 面包板及配套连接线
  • OLED显示屏
  • DS1302模块

2. 实验步骤

1. 根据原理图搭建电路图。

在前篇基础上添加了OLED模块连接。DS1302模块的VCC和GND连接Uno开发板的3.3V和GND。DS1302模块的CLK、DAT、RST对应连接Uno开发板的4、3、2引脚。OLED的VCC和GND分别连接开发板的3.3V和GND,OLED的SDA、SCL分别连接开发板的A4、A5引脚。

实验原理图如下图所示:

实验原理图

实物连接图如下图所示:

实物连接图

2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

#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); //对应DS1302的RST,DAT,CLK

int sec_temp;

void initRTCTime(void)//初始化RTC时钟
{
  rtc.writeProtect(false); //关闭写保护
  rtc.halt(false); //清除时钟停止标志
  Time t(2020, 4, 25, 21, 50, 50, 7); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
  rtc.time(t);//向DS1302设置时间数据
}

void updatTime()//打印时间数据
{
  Time tim = rtc.time(); //从DS1302获取时间数据
  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);//设置显示位置
    oled.println("--CLOCK--");
    oled.setCursor(4, 25);//设置显示位置
    oled.println(date);
    oled.setCursor(18, 50);//设置显示位置
    oled.println(timer);
    oled.display(); // 开显示
  }
  sec_temp = tim.sec;
}

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextColor(WHITE);//开像素点发光
  oled.clearDisplay();//清屏
  oled.setTextSize(2); //设置字体大小

  //新模块上电需要设置一次当前时间,
  //下载完成后需屏蔽此函数再次下载,否则每次上电都会初始化时间数据
  //  initRTCTime();

}

void loop() {
  updatTime();
}

3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

程序下载

3. 实验现象

OLED显示效果如下:

实验现象

4. 程序说明

在DS1302的各种电子时钟制作中,我们经常会遇到时钟走时不准的情况。除了DS1302芯片本身问题,大部分是由晶振精度及匹配电容造成的。对于要求不高的应用,我们可以大概测量每天的误差范围,大概率是走时过快的,然后在程序中加入每天自动校准的操作。

另外会发现秒数变化不均匀,时快时慢,这跟屏幕的刷新频率有关。我们可以使用定时器,一秒获取一次DS1302数据进行刷新。而本篇程序中通过对比前后两次获取到的时间数据中秒的值,当秒数改变后进行一次刷新。


关注公众号「TonyCode」,更多精彩内容分享。

扫码关注


文章作者: Tony
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Tony !