【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 模块精准管理时间,并格式化输出到串口。
实验串口返回情况

评论