第三十篇、基于Arduino uno,获取ds3231时钟模块的年、月、日、时、分、秒信息——结果导向

0、结果

说明:先来看看串口调试助手显示的结果,包含了年月日和时分秒,如果是你想要的,可以接着往下看。


1、外观

说明:虽然ds3231时钟模块形态各异,但是原理和代码都是适用的。


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系统中进行定时器、数据记录、计时器等任务。它的准确性和稳定性取决于它内部的时钟、温度补偿和电源管理电路的质量。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值