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

在这里插入图片描述

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

** 【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器**

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
实验模块接线示意图

在这里插入图片描述

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

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

在这里插入图片描述

【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 显示当前时间,并不断更新。

实验场景图

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值