回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(245)---DS3231高精度时钟模块之将时间居中显示在 OLED 屏幕上 简单

头像 驴友花雕 2025.05.11 9 0

00.jpg
02.jpg
04-.jpg
04--.jpg
05.jpg

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
 项目之十:将时间居中显示在 OLED 屏幕上

安装RTClib.h库 (https://github.com/adafruit/RTClib)
 

 

13.jpg

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
 项目之十:将时间居中显示在 OLED 屏幕上

实验开源代码

 

代码
/*
  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之十:将时间居中显示在 OLED 屏幕上
*/

#include <Wire.h>               // **引入 I2C 通信库**
#include <Adafruit_GFX.h>       // **引入 Adafruit GFX 图形库**
#include <Adafruit_SSD1306.h>   // **引入 Adafruit SSD1306 OLED 显示库**
#include <RTClib.h>             // **引入 DS3231 RTC 库**

#define SCREEN_WIDTH 128  // **OLED 屏幕宽度(单位:像素)**
#define SCREEN_HEIGHT 64  // **OLED 屏幕高度(单位:像素)**

// **创建 SSD1306 OLED 显示对象,使用 I2C 进行通信**
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); 

// **创建 DS3231 RTC 对象**
RTC_DS3231 rtc;

// **用于存储时间字符串**
String time;

void setup() {
    Serial.begin(9600);  // **初始化串口通信**
    
    // **初始化 OLED 显示屏**
    if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {  // **设置 I2C 地址为 0x3C**
        Serial.println(F("SSD1306 显示屏初始化失败"));
        while (true);  // **进入死循环,防止继续执行错误代码**
    }

    delay(2000);  // **等待 2 秒,确保 OLED 组件启动**
    oled.clearDisplay();  // **清空 OLED 屏幕**
    oled.setTextSize(1);  // **设置文本大小**
    oled.setTextColor(WHITE);  // **设置文本颜色**
    oled.setCursor(0, 10);  // **设置文本显示位置**

    // **初始化 DS3231 RTC 模块**
    if (!rtc.begin()) {  
        Serial.println("找不到 RTC 模块");
        Serial.flush();
        while (true);  // **进入死循环,避免继续执行错误代码**
    }

    // **同步 RTC 时间,设置为编译时的日期和时间**
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  

    // **预留 10 个字节内存,优化 String 变量存储,避免碎片化**
    time.reserve(10);  
}

void loop() {
    // **从 RTC 读取当前时间**
    DateTime now = rtc.now();  
    time = "";  // **清空字符串**
    time += now.hour();  // **获取小时**
    time += ':';  
    time += now.minute();  // **获取分钟**
    time += ':';
    time += now.second();  // **获取秒数**

    oledDisplayCenter(time);  // **调用 OLED 显示函数**
}

/*****************************************************************************************************
 * **oledDisplayCenter**
 *  - 计算文本大小,使其居中显示在 OLED 屏幕上
 *  - 然后将时间数据显示在屏幕中央
 *****************************************************************************************************/
void oledDisplayCenter(String text) {
    int16_t x1, y1;
    uint16_t width, height;

    // **获取文本的宽度和高度**
    oled.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);

    // **清屏**
    oled.clearDisplay();

    // **计算居中位置**
    oled.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2);
    
    // **显示时间字符串**
    oled.println(text);
    oled.display();  // **刷新 OLED 屏幕**
}

代码简单解读

这段代码使用 DS3231 实时时钟(RTC)模块 和 OLED 显示屏,通过 I2C 通信 实现 时间显示,核心逻辑如下:

1. 初始化硬件
✅ Wire.begin(); → 启动 I2C 通信 
✅ oled.begin(...); → 初始化 OLED 显示屏(I2C 地址 0x3C) 
✅ rtc.begin(); → 初始化 DS3231 RTC

2. 设置 RTC 时间
✅ rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); → 自动设置 RTC 时间为编译时的系统时间 
✅ 确保 RTC 运行正确,否则进入死循环

3. 获取当前时间
✅ rtc.now(); → 从 RTC 读取当前时间 
✅ 格式化为 "小时:分钟:秒" 形式 并存入 String time

4. 显示时间在 OLED 屏幕上
✅ oledDisplayCenter(time); → 将时间居中显示 
✅ 计算文本大小,确保居中 
✅ 清除屏幕并更新显示

5. 采集间隔
✅ 每秒刷新一次时间,保证实时性

这段代码让 OLED 显示当前时间,并不断更新。

 

实验场景图

 

14.jpg

 

评论

user-avatar
icon 他的勋章
    展开更多