驴友花雕 发表于 2025-5-11 18:30:42

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

代码简单解读

这段代码使用 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 显示当前时间,并不断更新。




驴友花雕 发表于 2025-5-11 18:35:38

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验场景图


驴友花雕 发表于 2025-5-11 18:38:55

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验模块接线示意图


驴友花雕 发表于 2025-5-11 19:03:53

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

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

模块参考电原理图



驴友花雕 发表于 2025-5-11 19:06:28

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验开源代码

/*
【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 = {"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);// **获取星期名称**

    // **显示 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);// **每秒更新数据**
}

驴友花雕 发表于 2025-5-11 19:08:41

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

代码简单解读

这段代码使用 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);
✅ 温度 → display.print(rtc.getTemperature());

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

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





驴友花雕 发表于 2025-5-11 19:12:52

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验场景图




驴友花雕 发表于 2025-5-12 05:26:41

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验


驴友花雕 发表于 2025-5-13 11:01:56

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验


驴友花雕 发表于 2025-5-13 11:58:10

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

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

实验模块接线示意图





驴友花雕 发表于 2025-5-13 12:00:47

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

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

实验开源代码

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

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

#define LCD_ADDRESS 0x27    // LCD I2C 地址
#define LCD_COLUMNS 16      // LCD 显示屏的列数
#define LCD_ROWS 2          // LCD 显示屏的行数

LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);// 创建 LCD 显示对象
RTC_DS3231 rtc;// 使用 Adafruit RTClib 创建 DS3231 RTC 实例

void setup() {
    Serial.begin(9600);    // 初始化串口通信
    Wire.begin();          // 启动 I2C 通信
    lcd.init();            // 初始化 LCD 显示屏
    lcd.backlight();       // 开启 LCD 背光
    lcd.clear();         // 清屏

    // 初始化 RTC
    if (!rtc.begin()) {
      Serial.println("RTC 初始化失败!");
      while (1);// 停止执行
    }

    // 如果 RTC 断电,则恢复默认时间
    if (rtc.lostPower()) {
      Serial.println("RTC 断电!正在设置时间...");
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
}

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

    // 显示时间
    lcd.setCursor(4, 0);
    lcd.print(dt.hour());
    lcd.print(":");
    lcd.print(dt.minute());
    lcd.print(":");
    lcd.print(dt.second());

    // 显示日期
    lcd.setCursor(3, 1);
    lcd.print(dt.year());
    lcd.print("-");
    lcd.print(dt.month());
    lcd.print("-");
    lcd.print(dt.day());

    // 串口输出时间
    Serial.print("当前时间: ");
    Serial.print(dt.year()); Serial.print("-");
    Serial.print(dt.month()); Serial.print("-");
    Serial.print(dt.day()); Serial.print(" ");
    Serial.print(dt.hour()); Serial.print(":");
    Serial.print(dt.minute()); Serial.print(":");
    Serial.println(dt.second());

    delay(500);// 每 500 毫秒更新一次
}

驴友花雕 发表于 2025-5-13 12:06:14

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

代码简单解读

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

1. 初始化硬件
✅ Wire.begin(); → 启动 I2C 通信
✅ rtc.begin(); → 初始化 DS3231 RTC
✅ lcd.init(); → 初始化 LCD 显示屏
✅ lcd.backlight(); → 开启 LCD 背光

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

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

4. 显示内容在 LCD 屏幕上
✅ 时间 → lcd.print(dt.hour()); 等格式化
✅ 日期 → lcd.print(dt.year()); 等格式化

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

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

驴友花雕 发表于 2025-5-13 12:09:51

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验串口返回情况



驴友花雕 发表于 2025-5-13 12:12:25

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验场景图




驴友花雕 发表于 2025-5-13 19:07:19

【花雕学编程】Arduino动手做(245)--DS3231模块12个小实验

电原理图


页: 1 2 [3]
查看完整版本: 【花雕学编程】Arduino动手做(245)--DS3231模块12个小实验