【花雕学编程】Arduino动手做(245)--DS3231模块12个小实验
本帖最后由 驴友花雕 于 2025-5-13 19:03 编辑37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之八:通过 I2C 通信 接收用户输入的时间数据并更新时钟
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之八:通过 I2C 通信 接收用户输入的时间数据并更新时钟
*/
#include <DS3231.h>// 引入 DS3231 RTC 库
#include <Wire.h> // 引入 I2C 通信库
// **创建 DS3231 RTC 对象**
DS3231 myRTC;
// **定义时间变量**
byte year, month, date, dow;// 年、月、日、星期
byte hour, minute, second; // 时、分、秒
bool century = false;// 用于跨世纪判断
bool h12Flag; // 12 小时制标志
bool pmFlag; // PM 标志(仅用于 12 小时制)
/*****************************************************************************************************
* **初始化**
*- 开启串口和 I2C 通信
*- 解释程序的使用方法
*****************************************************************************************************/
void setup() {
Serial.begin(57600);// **初始化串口,波特率 57600**
Wire.begin();// **启动 I2C 通信**
// **等待 4 秒,确保 RTC 启动稳定**
delay(4000);
// **向用户解释时间格式**
Serial.println("时间格式:YYMMDDwhhmmssx");
Serial.println("其中:");
Serial.println("YY = 年(如 20 表示 2020 年)");
Serial.println("MM = 月(如 04 表示 4 月)");
Serial.println("DD = 日期(如 09 表示 9 号)");
Serial.println("w= 星期(1-7,1=星期天,5=星期四)");
Serial.println("hh = 24 小时制小时数(如 09 表示上午 9 点,21 表示晚上 9 点)");
Serial.println("mm = 分钟(如 02)");
Serial.println("ss = 秒(如 42)");
Serial.println("例如输入:2004095090242x");
Serial.println("-----------------------------------------------------------------------------");
Serial.println("请在串口输入时间,并以 'x' 结尾以设置 DS3231 的时间:");
}
/*****************************************************************************************************
* **主循环**
*- 监听串口输入的时间校正数据
*- 根据输入设置 DS3231 的时钟
*- 在 5 秒内回显 DS3231 时间
*****************************************************************************************************/
void loop() {
// **如果串口收到输入数据,则进行时间校正**
if (Serial.available()) {
inputDateFromSerial();// 读取串口数据并解析时间
myRTC.setClockMode(false);// **设置 24 小时模式**
// **将输入的时间写入 DS3231**
myRTC.setYear(year);
myRTC.setMonth(month);
myRTC.setDate(date);
myRTC.setDoW(dow);
myRTC.setHour(hour);
myRTC.setMinute(minute);
myRTC.setSecond(second);
// **连续 5 秒,每秒打印 DS3231 当前时间**
for (uint8_t i = 0; i < 5; i++) {
delay(1000);
Serial.print(myRTC.getYear(), DEC);
Serial.print("-");
Serial.print(myRTC.getMonth(century), DEC);
Serial.print("-");
Serial.print(myRTC.getDate(), DEC);
Serial.print(" ");
Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);// 24 小时制
Serial.print(":");
Serial.print(myRTC.getMinute(), DEC);
Serial.print(":");
Serial.println(myRTC.getSecond(), DEC);
}
// **提示用户输入新时间**
Serial.println("请在串口输入新的时间,并以 'x' 结尾以设置 DS3231:");
}
delay(1000);// 每秒刷新一次
}
/*****************************************************************************************************
* **inputDateFromSerial**
*- 读取用户串口输入的时间数据
*- 解析并存储到全局变量
*****************************************************************************************************/
void inputDateFromSerial() {
// **检查串口数据是否完整(结束字符为 'x')**
boolean isStrComplete = false;
char inputChar;
byte temp1, temp2;
char inputStr;// 存储输入的时间字符串
uint8_t currentPos = 0;
while (!isStrComplete) {
if (Serial.available()) {
inputChar = Serial.read();
inputStr = inputChar;
currentPos += 1;
// **检查输入是否以 'x' 结尾**
if (inputChar == 'x') {
isStrComplete = true;
}
}
}
Serial.println(inputStr);// **打印用户输入的数据**
// **查找字符串中的 'x' 位置**
int posX = -1;
for (uint8_t i = 0; i < 20; i++) {
if (inputStr == 'x') {
posX = i;
break;
}
}
// **ASCII 码 '0' 的值(用于转换字符为数字)**
uint8_t zeroAscii = '0';
// **解析年**
temp1 = (byte)inputStr - zeroAscii;
temp2 = (byte)inputStr - zeroAscii;
year = temp1 * 10 + temp2;
// **解析月**
temp1 = (byte)inputStr - zeroAscii;
temp2 = (byte)inputStr - zeroAscii;
month = temp1 * 10 + temp2;
// **解析日期**
temp1 = (byte)inputStr - zeroAscii;
temp2 = (byte)inputStr - zeroAscii;
date = temp1 * 10 + temp2;
// **解析星期**
dow = (byte)inputStr - zeroAscii;
// **解析小时**
temp1 = (byte)inputStr - zeroAscii;
temp2 = (byte)inputStr - zeroAscii;
hour = temp1 * 10 + temp2;
// **解析分钟**
temp1 = (byte)inputStr - zeroAscii;
temp2 = (byte)inputStr - zeroAscii;
minute = temp1 * 10 + temp2;
// **解析秒**
temp1 = (byte)inputStr - zeroAscii;
temp2 = (byte)inputStr - zeroAscii;
second = temp1 * 10 + temp2;
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之九:读取当前时间、温度和闹钟状态
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之九:读取当前时间、温度和闹钟状态
*/
#include <DS3231.h>// 引入DS3231时钟库
#include <Wire.h> // 引入I2C通信库
DS3231 myRTC; // 创建DS3231对象
bool century = false; // 世纪标志位(20xx年为false,21xx年为true)
bool h12Flag; // 12小时制标志
bool pmFlag; // 下午标志(仅在12小时制下有效)
byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits; // 闹钟参数
bool alarmDy, alarmH12Flag, alarmPmFlag; // 闹钟日期/星期标志和12小时制标志
void setup() {
// 初始化I2C通信(SDA:A4, SCL:A5)
Wire.begin();
// 初始化串口通信,波特率57600
Serial.begin(57600);
}
void loop() {
// 向串口监视器发送当前时钟信息
// 显示年份(20xx格式)
Serial.print("2");
if (century) { // 21世纪(此标志在未来89年内不会用到)
Serial.print("1");
} else {
Serial.print("0");
}
Serial.print(myRTC.getYear(), DEC);// 显示年份后两位
Serial.print(' ');
// 显示月份
Serial.print(myRTC.getMonth(century), DEC);
Serial.print(" ");
// 显示日期
Serial.print(myRTC.getDate(), DEC);
Serial.print(" ");
// 显示星期(1-7对应周日到周六)
Serial.print(myRTC.getDoW(), DEC);
Serial.print(" ");
// 显示时分秒
Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
Serial.print(" ");
Serial.print(myRTC.getMinute(), DEC);
Serial.print(" ");
Serial.print(myRTC.getSecond(), DEC);
// 添加AM/PM指示(仅在12小时制下有效)
if (h12Flag) {
if (pmFlag) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" 24h ");// 24小时制显示
}
// 显示温度(DS3231内置高精度温度传感器)
Serial.print("T=");
Serial.print(myRTC.getTemperature(), 2);// 显示温度,保留两位小数
// 显示振荡器状态(O+表示正常,O-表示振荡器可能停止)
if (myRTC.oscillatorCheck()) {
Serial.print(" O+");// 振荡器正常工作
} else {
Serial.print(" O-");// 振荡器可能停止,时间可能不准确
}
// 显示闹钟触发状态
if (myRTC.checkIfAlarm(1)) {
Serial.print(" A1!");// 闹钟1触发
}
if (myRTC.checkIfAlarm(2)) {
Serial.print(" A2!");// 闹钟2触发
}
// 换行
Serial.println();
// 显示闹钟1设置信息
Serial.print("Alarm 1: ");
myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");// 按星期触发
} else {
Serial.print(" Date"); // 按日期触发
}
Serial.print(' ');
Serial.print(alarmHour, DEC);
Serial.print(' ');
Serial.print(alarmMinute, DEC);
Serial.print(' ');
Serial.print(alarmSecond, DEC);
Serial.print(' ');
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm ");
} else {
Serial.print("am ");
}
}
if (myRTC.checkAlarmEnabled(1)) {
Serial.print("enabled");// 闹钟1已启用
}
Serial.println();
// 显示闹钟2设置信息
Serial.print("Alarm 2: ");
myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");// 按星期触发
} else {
Serial.print(" Date"); // 按日期触发
}
Serial.print(" ");
Serial.print(alarmHour, DEC);
Serial.print(" ");
Serial.print(alarmMinute, DEC);
Serial.print(" ");
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm");
} else {
Serial.print("am");
}
}
if (myRTC.checkAlarmEnabled(2)) {
Serial.print("enabled");// 闹钟2已启用
}
// 显示闹钟触发条件位(二进制格式)
Serial.println();
Serial.print("Alarm bits: ");
Serial.println(alarmBits, BIN);
// 空行分隔,每秒更新一次
Serial.println();
delay(1000);
}
【花雕学编程】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);// **每秒更新数据**
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验模块接线示意图【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
库安装为了在我们的项目中使用 DS3231 模块,我们将使用一个名为 uRTCLib 的特殊库。该库使从 RTC 读取时间数据变得超级简单。
尽管 uRTCLib 易于使用,但它也非常强大。与许多其他 RTC 库不同,它支持昼夜闹钟,并允许您控制 SQW(方波)输出。
要安装库
1. 首先打开您的 Arduino IDE 程序。然后点击 库管理器 左侧边栏上的图标。
2. 在搜索框中键入 “urtclib” 以筛选结果。
3. 查找 Naguissa 的 uRTCLib 库。
4. 单击 Install 按钮将其添加到您的 Arduino IDE。
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之一:读取日期、时间和温度
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之一:读取日期、时间和温度
*/
#include "Arduino.h"
#include "uRTCLib.h"
// 初始化 RTC 模块(I2C 地址 0x68)
uRTCLib rtc(0x68);
// 定义星期名称数组
char daysOfTheWeek = {
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"
};
void setup() {
Serial.begin(9600);// 初始化串口通讯
URTCLIB_WIRE.begin();// 初始化 I2C
// 设置 RTC 时间(仅需要设置一次,设置后可注释掉)
// 例如:2025年5月11日 12:56
rtc.set(0, 00, 6, 7, 11, 5, 25);
// rtc.set(秒, 分钟, 小时, 星期, 日期, 月份, 年份)
// 星期: 1=星期天, 7=星期六
}
void loop() {
rtc.refresh();// 更新 RTC 数据
// 打印当前日期和时间
Serial.print("Current Date & Time: ");
Serial.print(rtc.year());
Serial.print('/');
Serial.print(rtc.month());
Serial.print('/');
Serial.print(rtc.day());
Serial.print(" (");
Serial.print(daysOfTheWeek);// 显示星期
Serial.print(") ");
Serial.print(rtc.hour());
Serial.print(':');
Serial.print(rtc.minute());
Serial.print(':');
Serial.println(rtc.second());
// 打印温度数据
Serial.print("Temperature: ");
Serial.print(rtc.temp() / 100);// 温度除以 100 获取实际值
Serial.println("°C");
Serial.println();
delay(1000);// 每秒更新一次
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
代码简单解读这段代码使用 RTC(实时时钟)模块 获取 当前日期、时间和温度数据,并通过 串口输出,核心逻辑如下:
1. 初始化 RTC
✅ uRTCLib rtc(0x68); → 创建 RTC 对象,使用 I2C 地址 0x68
✅ URTCLIB_WIRE.begin(); → 初始化 I2C 通信
✅ rtc.set(0, 56, 12, 2, 14, 4, 25); → 设置 RTC 初始时间(只需运行一次)
2. 读取数据
✅ rtc.refresh(); → 从 RTC 读取最新数据
✅ rtc.year(), rtc.month(), rtc.day() → 获取年、月、日
✅ rtc.hour(), rtc.minute(), rtc.second() → 获取小时、分钟、秒
✅ daysOfTheWeek → 从数组获取星期名称
3. 打印时间与温度
✅ Serial.print() → 格式化打印日期、时间和星期
✅ Serial.print(rtc.temp() / 100); Serial.println("°C"); → 转换并输出温度
4. 采集间隔
✅ delay(1000); → 每秒更新一次数据
这段代码让 RTC 模块不断采集时间和温度,并在串口监视器显示。
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验串口返回情况【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验场景图【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
读取和写入板载 24C32 EEPROM 芯片,还需要安装另一个名为 uEEPROMLib 的库。【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之二:读取和写入 24C32 EEPROM
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之二:读取和写入 24C32 EEPROM
*/
#include "Arduino.h"
#include "Wire.h"
#include "uEEPROMLib.h"
// 创建 EEPROM 实例,I2C 地址为 0x57
uEEPROMLib eeprom(0x57);
void setup() {
Serial.begin(9600);// 初始化串口通信
Wire.begin();// 初始化 I2C 通信
// 定义存储的数据
int inttmp = 32123;// 整型数据
float floattmp = 3.1416;// 浮点型数据
char chartmp = 'A';// 单个字符
char c_string[] = "https://mc.dfrobot.com.cn";// 长字符串
int string_length = strlen(c_string);// 计算字符串长度
Serial.println("写进存储记忆......");
// **存储整型数据**
if (!eeprom.eeprom_write(0, inttmp)) {
Serial.println("Failed to store int.");
} else {
Serial.println("int was stored correctly.");
}
// **存储浮点型数据**
if (!eeprom.eeprom_write(4, floattmp)) {
Serial.println("Failed to store float.");
} else {
Serial.println("float was stored correctly.");
}
// **存储单字符**
if (!eeprom.eeprom_write(8, chartmp)) {
Serial.println("Failed to store char.");
} else {
Serial.println("char was stored correctly.");
}
// **存储长字符串**(从地址 33 开始,未对齐 EEPROM 32 字节页)
if (!eeprom.eeprom_write(33, (byte *)c_string, string_length)) {
Serial.println("Failed to store string.");
} else {
Serial.println("string was stored correctly.");
}
Serial.println("\nReading memory...");
// **读取并打印存储数据**
Serial.print("int: ");
eeprom.eeprom_read(0, &inttmp);
Serial.println(inttmp);
Serial.print("float: ");
eeprom.eeprom_read(4, &floattmp);
Serial.println((float)floattmp);
Serial.print("char: ");
eeprom.eeprom_read(8, &chartmp);
Serial.println(chartmp);
Serial.print("string: ");
eeprom.eeprom_read(33, (byte *)c_string, string_length);
Serial.println(c_string);
Serial.println();
}
void loop() {
// EEPROM 只需在 setup() 进行读写,loop() 为空
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
本帖最后由 驴友花雕 于 2025-5-11 08:09 编辑代码简单解读
这段代码使用 EEPROM(电子可擦除存储器) 通过 I2C 读取和存储数据,核心逻辑如下:
1. 初始化 EEPROM
✅ uEEPROMLib eeprom(0x57); → 创建 EEPROM 实例,I2C 地址为 0x57
✅ Wire.begin(); → 初始化 I2C 通信
✅ Serial.begin(9600); → 启动串口通信
2. 写入数据
✅ eeprom.eeprom_write(address, data); → 将数据存入 EEPROM
✅ 存储不同类型的数据(整型、浮点数、字符、字符串)
✅ 字符串存储 → (byte *)c_string, strlen(c_string) 确保正确写入
3. 读取数据
✅ eeprom.eeprom_read(address, &data); → 从 EEPROM 读取数据
✅ 按照原地址读出 int、float、char、string
✅ 格式化输出,确保数据存储正确
4. 循环结构
✅ loop() 为空 → 仅在 setup() 进行读写操作
这段代码让 EEPROM 通过 I2C 存储和读取数据,并在串口输出结果。
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
本帖最后由 驴友花雕 于 2025-5-11 08:09 编辑实验串口返回情况
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之三:使用 DS3231.h 库的应用案例
安装DS3231.h 库(https://github.com/NorthernWidget/DS3231/tree/master)
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之三:使用 DS3231.h 库的应用案例
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之三:使用 DS3231.h 库的应用案例
*/
#include <Wire.h>
#include <DS3231.h>// 使用 DS3231 库
// 创建 DS3231 RTC 对象
DS3231 rtc;
void setup() {
Serial.begin(115200);// 初始化串口通信
Wire.begin();// 启动 I2C
}
void loop() {
rtc.getTemperature();// 确保数据更新
// 读取时间(确保传入参数)
bool h12, PM_time;
Serial.print("时间: ");
Serial.print(rtc.getHour(h12, PM_time));
Serial.print(":");
Serial.print(rtc.getMinute());
Serial.print(":");
Serial.println(rtc.getSecond());
// 读取日期
bool centuryFlag;
Serial.print("日期: ");
Serial.print(rtc.getYear());
Serial.print("/");
Serial.print(rtc.getMonth(centuryFlag));
Serial.print("/");
Serial.println(rtc.getDate());
// 获取 DS3231 内部温度
Serial.print("温度: ");
Serial.print(rtc.getTemperature());
Serial.println("°C");
Serial.println();// 美化输出
delay(1000);// 每秒刷新
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
简单解读这段代码使用 DS3231 实时时钟(RTC)模块 通过 I2C 通信 获取 当前时间、日期和温度,核心逻辑如下:
1. 初始化 RTC
✅ DS3231 rtc; → 创建 DS3231 实例(I2C 默认地址)
✅ Wire.begin(); → 启动 I2C 通信
2. 读取时间
✅ rtc.getHour(h12, PM_time); → 获取小时(24小时制)
✅ rtc.getMinute(); → 获取分钟
✅ rtc.getSecond(); → 获取秒
3. 读取日期
✅ rtc.getYear(); → 获取年份
✅ rtc.getMonth(centuryFlag); → 获取月份(需要参数)
✅ rtc.getDate(); → 获取当天日期
4. 读取温度
✅ rtc.getTemperature(); → 获取 DS3231 内置温度传感器的值
5. 串口输出
✅ 格式化打印时间、日期、星期和温度,确保显示清晰
6. 采集间隔
✅ delay(1000); → 每秒更新一次数据
这段代码让 DS3231 RTC 模块不断读取当前时间、日期和温度,并在串口显示。