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

【花雕学编程】Arduino动手做(245)---DS3231高精度时钟模块之OLED 显示日期、时间、星期和温度 简单

头像 驴友花雕 2025.05.11 8 0

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
 项目之十一:OLED 显示日期、时间、星期和温度

 

模块参考电原理图

 

15.jpg

实验开源代码

代码
/*
  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之十一:OLED 显示日期、时间、星期和温度
*/

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

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

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

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

// **定义星期数组**
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

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

    // **清除 OLED 屏幕并显示空白**
    display.clearDisplay();
    display.display();

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

    // **如果 RTC 断电,自动设置时间**
    if (rtc.lostPower()) {
        Serial.println("RTC 断电!正在设置时间...");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // **设置 RTC 时间为编译时系统时间**
    }

    // **如果需要手动设置时间,请取消注释以下代码**
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop() {
    // **从 RTC 获取当前时间**
    DateTime now = rtc.now();  

    // **清除 OLED 显示缓冲区**
    display.clearDisplay();

    // **显示日期**
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("Date: ");
    display.print(now.year());  // **打印年份**
    display.print("-");
    if (now.month() < 10) display.print("0");  // **补零**
    display.print(now.month());  // **打印月份**
    display.print("-");
    if (now.day() < 10) display.print("0");  // **补零**
    display.print(now.day());  // **打印日期**

    // **显示时间**
    display.setCursor(0, 15);
    display.print("Time: ");
    if (now.hour() < 10) display.print("0");  // **补零**
    display.print(now.hour());  // **打印小时**
    display.print(":");
    if (now.minute() < 10) display.print("0");  // **补零**
    display.print(now.minute());  // **打印分钟**
    display.print(":");
    if (now.second() < 10) display.print("0");  // **补零**
    display.print(now.second());  // **打印秒数**

    // **显示星期**
    display.setCursor(0, 30);
    display.print("Day: ");
    display.print(daysOfTheWeek[now.dayOfTheWeek()]);  // **获取星期名称**

    // **显示 DS3231 传感器温度**
    display.setCursor(0, 45);
    display.print("Temp: ");
    display.print(rtc.getTemperature());  // **读取温度**
    display.cp437(true);
    display.write(167);  // **显示摄氏度符号**
    display.print("C");

    // **刷新 OLED 显示**
    display.display();

    delay(1000);  // **每秒更新数据**
}

代码简单解读

这段代码使用 DS3231 实时时钟(RTC)模块 和 OLED 显示屏 通过 I2C 通信 显示 当前日期、时间、星期和温度,核心逻辑如下:

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

2. 设置 RTC 时间
✅ rtc.lostPower(); → 如果 RTC 断电,则恢复默认时间 
✅ rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); → 自动设置 RTC 时间为编译时的系统时间

3. 读取当前时间
✅ rtc.now(); → 从 RTC 获取当前时间 
✅ 格式化时间为 "YYYY-MM-DD" 和 "HH:MM:SS" 形式

4. 显示内容在 OLED 屏幕上
✅ 日期 → display.print(now.year()); 等显示格式 
✅ 时间 → display.print(now.hour()); 等格式化 
✅ 星期 → display.print(daysOfTheWeek[now.dayOfTheWeek()]); 
✅ 温度 → display.print(rtc.getTemperature());

5. 采集间隔
✅ delay(1000); → 每秒更新一次时间

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


实验场景图

 

15- (1).jpg
15- (2).jpg

评论

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