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

【花雕学编程】Arduino动手做(245)---DS3231 高精度时钟模块之通过 Unix 时间戳设置 DS3231 时间 简单

头像 驴友花雕 2025.05.11 10 0

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器

  项目之七:通过 Unix 时间戳设置 DS3231 时间

 

实验开源代码

 


 

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

#include <Wire.h>  // 引入 I2C 通信库
#include <DS3231.h>  // 引入 DS3231 RTC 库

// **格式化时间并输出**
void showTimeFormated(time_t t) {
#if defined (__AVR__)  // 如果是 AVR 平台,调整时间戳
  t -= 946684800UL;  // 修正 Unix 时间(基于 2000 年)
#endif

  char buffer[50];  // 创建存储格式化时间的字符数组
  struct tm *ptm;
  ptm = gmtime(&t);  // 将时间转换为 UTC 时间结构
  const char *timeformat = "%a %F %X - weekday %w; CW %W";  // 时间格式
  strftime(buffer, sizeof(buffer), timeformat, ptm);  // 格式化时间
  Serial.print(buffer);
  Serial.print("\n");
}

// **Unix 时间戳(1660644000 对应 2022-08-16 10:00:00 UTC)**
constexpr time_t tstmp {1660644000UL};

// **创建 RTC 实例**
RTClib myRTC;
DS3231 Clock;

void setup() {
  Serial.begin(115200);  // 初始化串口通信,波特率 115200
  Wire.begin();  // 启动 I2C 通信
  delay(500);  // 确保 RTC 启动稳定
  Serial.println("\n\n\n测试 DS3231 - setEpoch()\n\n\n");

#if defined (__AVR__)
  Serial.println("AVR 微控制器就绪!");
  Wire.begin();
  //#elif defined (ESP8266)
  //Serial.println("ESP8266 微控制器就绪!");
  //Wire.begin(0U, 2U);  // 设置 ESP8266 的 I2C 连接:SDA = GPIO0,SCL = GPIO2
#endif

  // **设置 DS3231 的时间**
  Serial.println("设置 DS3231 的时间为:2022-08-16 10:00:00 (UTC)");
  Serial.println("Unix 时间戳 - 1660644000");

  Clock.setEpoch(tstmp, false);  // 通过 Unix 时间戳设置 DS3231 时间
  Clock.setClockMode(false);  // 设定为 24 小时制

  // **验证 DS3231 数据**
  bool century = false;
  bool h12Flag;
  bool pmFlag;
  DateTime now = myRTC.now();  // 获取当前 RTC 时间

  Serial.print("\n\n");
  Serial.print(" DS3231 的当前时间:     ");
  Serial.print(Clock.getYear(), DEC);
  Serial.print("-");
  Serial.print(Clock.getMonth(century), DEC);
  Serial.print("-");
  Serial.print(Clock.getDate(), DEC);
  Serial.print(" ");
  Serial.print(Clock.getHour(h12Flag, pmFlag), DEC);
  Serial.print(":");
  Serial.print(Clock.getMinute(), DEC);
  Serial.print(":");
  Serial.print(Clock.getSecond(), DEC);
  Serial.print("  -  星期 ");
  Serial.print(Clock.getDoW(), DEC);
  Serial.println();

  Serial.print("\n\n");
  Serial.print(" RTC 当前时间:          ");
  Serial.print(now.year(), DEC);
  Serial.print("-");
  Serial.print(now.month(), DEC);
  Serial.print("-");
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.print(now.second(), DEC);
  Serial.println();

  Serial.print("\n\n **格式化 Struct tm 输出:  ");
  showTimeFormated(tstmp);  // 以格式化方式输出时间
}

void loop() {
  // 该代码仅在 setup() 运行一次,因此 loop() 不执行任何操作
}

代码简单解读

这段代码使用 DS3231 实时时钟(RTC)模块 通过 I2C 通信 设置并读取时间,核心逻辑如下:

1. 初始化 RTC
✅ DS3231 Clock; → 创建 DS3231 RTC 对象 
✅ Wire.begin(); → 启动 I2C 通信 
✅ Serial.begin(115200); → 初始化串口通信,波特率 115200

2. 设置时间
✅ Clock.setEpoch(tstmp, false); → 使用 Unix 时间戳设置 DS3231 时间 
✅ Clock.setClockMode(false); → 设定为 24 小时制

3. 读取并打印时间
✅ Clock.getYear(), Clock.getMonth(century), Clock.getDate(); → 获取年月日 
✅ Clock.getHour(h12Flag, pmFlag), Clock.getMinute(), Clock.getSecond(); → 获取小时、分钟、秒 
✅ Clock.getDoW(); → 获取星期

4. 格式化时间
✅ showTimeFormated(tstmp); → 格式化时间并打印

5. 采集间隔
✅ loop() 为空 → 代码只在 setup() 运行一次,不循环执行

这段代码让 DS3231 模块精准管理时间,并格式化输出到串口。


实验串口返回情况

 

10.jpg

08-1.jpg

评论

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