0、结果
说明:先来看看串口调试助手显示的结果,包含了年月日和时分秒,如果是你想要的,可以接着往下看。
![](https://img-blog.csdnimg.cn/24bb5e49b4f34004b906199a434ff7d2.png)
1、外观
说明:虽然ds3231时钟模块形态各异,但是原理和代码都是适用的。
![](https://img-blog.csdnimg.cn/53301ed6e4db426eab63efed9c3fc172.png)
2、连线
说明:只需要连接四根线。
- uno————ds3231时钟模块
- 5V--------------VCC
- GND--------------GND
- SCL--------------SCL
- SDA--------------SDA
3、源程序
说明:采用非阻塞方式编写,一定时间检测一次时间和日期信息,并将对应功能进行函数化,方便移植。
/****************************************ds3231 part****************************************/
/*
注意:第一遍设置好时间之后,需要第二次把设置 初始时间的程序注释掉,不然设备重启,会一直从之前设置的时间开始计时。
接线:
VCC------VCC
GND------GND
SCL------SCL
SDA------SDA
*/
#include <RTClib.h> //调用库文件
#include <Wire.h> //调用库文件
RTC_DS3231 rtc; //实例化对象
#define ds3231TimeInterval 1000 //检测一次的时间间隔
unsigned long ds3231Times = 0; //记录设备运行时间
int yearVal = 0; //定义一个变量
int monthVal = 0; //定义一个变量
int dayVal = 0; //定义一个变量
int hourVal = 0; //定义一个变量
int minuteVal = 0; //定义一个变量
int secondVal = 0; //定义一个变量
/****************************************set up and loop part*********************************/
void setup()
{
Serial.begin(9600); //设置串口波特率为9600
Wire.begin(); //IIC初始化
rtc.begin(); //传感器通讯初始化
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //跟随电脑系统的时间。和下面的只能二选一。
//rtc.adjust(DateTime(2023, 5, 10, 0, 0, 0)); //手动设置时间
Serial.println("设备上线!"); //串口打印对应的值
}
void loop()
{
getDs3231Times(); //获取时间数据
}
/****************************************ds3231 part****************************************/
/*获取时间数据*/
void getDs3231Times() {
if (millis() - ds3231Times >= ds3231TimeInterval) { //一定时间执行一次
ds3231Times = millis();
DateTime now = rtc.now(); //用来获取时间
yearVal = now.year();
monthVal = now.month();
dayVal = now.day();
hourVal = now.hour();
minuteVal = now.minute();
secondVal = now.second();
Serial.print("日期: "); //串口打印对应的值
Serial.print(yearVal); //串口打印对应的值
Serial.print("/"); //串口打印对应的值
Serial.print(monthVal); //串口打印对应的值
Serial.print("/"); //串口打印对应的值
Serial.print(dayVal); //串口打印对应的值
Serial.print(" , "); //串口打印对应的值
Serial.print("时间: "); //串口打印对应的值
Serial.print(hourVal); //串口打印对应的值
Serial.print(":"); //串口打印对应的值
Serial.print(minuteVal); //串口打印对应的值
Serial.print(":"); //串口打印对应的值
Serial.print(secondVal); //串口打印对应的值
Serial.println("."); //串口打印对应的值
}
}
4、注意事项
说明:需要在线下载对应的库文件才不会编译报错,可以在管理库中很方便的搜到,如果搜不到可以评论@我,我将私发给你。在setup里面有一个获取系统时间的程序,当确定了时间之后。需要把设置时间的程序注释掉,不然每次通电都会从最开始的时间计时,如下图,设置好时间之后,需要立马将30行注释,这样程序重新执行的时候不会从最开始获取到的系统时间开始计时。
5、基本原理
DS3231时钟模块内置了一个高精度的时钟电路,可以实现非常准确的时间计算,并且不会因为外部干扰或者其他因素而出现误差。
DS3231时钟模块还配有温度补偿电路,能够根据其内部传感器检测到的温度数据,自动调整晶体振荡器的频率,从而提高时钟计算的准确性。这种技术可以基本消除晶体振荡器受温度变化影响的影响。
为了保证时钟计算的持续性和准确性,DS3231时钟模块内置了电源管理电路,可以从外部电源和备用电池中自动切换,以确保系统在断电或者失去电源时仍然可以正常工作。
DS3231时钟模块通过I2C接口与其他设备通信,能够实现与Arduino等其他计算机板的无缝集成连接。
总之,DS3231时钟模块适用于需要对时间计算进行高精度控制的应用,如在Arduino系统中进行定时器、数据记录、计时器等任务。它的准确性和稳定性取决于它内部的时钟、温度补偿和电源管理电路的质量。