我是靠谱客的博主 单纯大叔,最近开发中收集的这篇文章主要介绍Arduino UNO驱动DS3231数字实时时钟RTC,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

DS3231时钟模块简介

DS3231芯片采用IIC通信接口,内部集成了晶体谐振器和温度补偿器,提高了模块的长期精度。精度保持在±3.5ppm (±0.3024秒/天)。可以用纽扣电池供电,断开主电源时仍可保持精确计时。RTC可提供秒、分、时、星期、日、月和年(可计年到2100年)的信息,可以自动调整月末的日期、闰年修正。时钟格式可以是24小时或带AM/PM指示的12小时。提供两个可编程的日历闹钟输出和一个可编程方波输出(四种频率的信号1Hz、4…096KHz、8.192KHz、32.768KHz)。还包括一个固定32KHz频率的方波输出引脚。内部带有温度传感器,每64秒自动更新一次,可通过IIC总线进行读取,精度±3℃。IIC器件地址为0x68。本实验模块板载CR1220贴片电池座,主电源断电后作为后备电源芯片继续自动计时。
在这里插入图片描述

模块引脚定义

在这里插入图片描述
在这里插入图片描述
纽扣电池座安装电池时,正极朝上,负极朝下
VCC电源3.3V正极、SCL为IIC时钟信号线、SDA为IIC数据信号线、GND电源负极

Arduino UNO与模块接线

Arduino UNODS3231
A4SDA
A5SCL
3.3VVCC
GNDGND

在这里插入图片描述

测试代码

在Arduino IDE库管理器搜索DS323X,并安装如图所示例程库。
在这里插入图片描述
主要API接口函数列表

/*!
   *@brief 设置时间
   *@param 年, 1900~2100
   *@param 月, 1~12
   *@param 日, 1~31
   *@param 时: 0~23
   *@param 分, 0~59
   *@param 秒, 0~59
   */
  void setTime(uint16_t year, uint8_t month, uint8_t date, uint8_t hour, uint8_t minute, uint8_t second);

  /*!
   *@brief 设置时制
   *@param eHours_t mode:e24hours(24小时制), e12hours(12小时制). 默认24小时制
   */
  void setHourSystem(eHours_t mode)

  /*!
   *@功能 获取年
   *@返回 年
   */
  uint16_t year();

  /*!
   *@功能 获取月
   *@返回 月
   */
  uint8_t  month();

  /*!
   *@功能 获取日
   *@返回 日
   */
  uint8_t  day();

  /*!
   *@功能 获取时
   *@返回 时
   */
  uint8_t  hour();

  /*!
   *@功能 获取分
   *@返回 分
   */
  uint8_t  minute();

  /*!
   *@功能 获取秒
   *@返回 秒
   */
  uint8_t  second();

  /*!
   *@brief 获取星期几
   *@return 星期几
   */
  String getDayOfWeek();

  typedef enum{
      eEverySecond,                  //每秒触发
      eSecondsMatch,                 //每分钟触发
      eSecondsMinutesMatch,          //每小时触发
      eSecondsMinutesHoursMatch,     //每天触发
      eSecondsMinutesHoursDateMatch, //每月触发
      eSecondsMinutesHoursDayMatch,  //每周触发
  }eAlarm1Types_t;   //Alarm1

  /*!
   *@brief 设置闹钟1
   *@param 闹钟工作模式
   *@param 日     (1-31)
   *@param 时    (0-23)
   *@param 分  (0-59)
   *@param 秒  (0-59)
   */
  void setAlarm1(eAlarm1Types_t alarmType,int16_t days,int8_t hours,int8_t minutes,int8_t seconds);

  typedef enum{
      eEveryMinute,                  //每分钟触发
      eMinutesMatch,                 //每小时触发
      eMinutesHoursMatch,            //每天触发
      eMinutesHoursDateMatch,        //每月触发
      eMinutesHoursDayMatch,         //每周触发
  }eAlarm2Types_t;   //Alarm2

  /*!
   *@brief 设置闹钟2
   *@param 闹钟工作模式
   *@param 日     (1-31)
   *@param 时    (0-23)
   *@param 分  (0-59)
   */
  void setAlarm2(eAlarm2Types_t alarmType,int16_t days,int8_t hours,int8_t minutes);

  /*!
   *@brief 判断闹钟是否被触发
   *@return eNoTrigger(没有触发),eAlarm1Trigger(闹钟1),eAlarm2Trigger(闹钟2),eAllTrigger(都触发)
   */
  eTrigger_t isAlarmTrig();

打开getTimeAndTemperature.ino例程,编译并上传至Arduino UNO。

/*!
 * @file  getTimeAndTemperature.ino
 * @brief  Show current time and temperature of chip
 * @n  Experiment phenomenon: Set original time by users themselves 
 * @n  and get real time and temperature from the chip
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license  The MIT License (MIT)
 * @author  [yufeng](yufeng.luo@dfrobot.com)
 * @maintainer  [qsjhyy](yihuan.huang@dfrobot.com)
 * @version  V1.0
 * @date  2021-10-25
 * @url  https://github.com/DFRobot/DFRobot_DS323X
 */
#include "DFRobot_DS323X.h"

DFRobot_DS323X rtc;


void setup(void)
{
    Serial.begin(9600);
    /*Wait for the chip to be initialized completely, and then exit*/
    while(rtc.begin() != true){
        Serial.println("Failed to init chip, please check if the chip connection is fine. ");
        delay(1000);
    }
    /*!
     *@brief Set time output format
     *@param eHours_t:e24hours, e12hours. default is e24hours
     */
    rtc.setHourSystem(rtc.e12hours);
    rtc.setTime(/*year,1900-2100*/2022, /*mouth,1-12*/12, /*date,1-31*/5, /*hour,0-23*/14,/*minute,0-59*/34,/*second,0-59*/55);//Set Set initial time .

}

void loop() {
    Serial.print(rtc.getYear(), DEC);//year
    Serial.print('/');
    Serial.print(rtc.getMonth(), DEC);//month
    Serial.print('/');
    Serial.print(rtc.getDate(), DEC);//date
    Serial.print(" (");
    Serial.print(rtc.getDayOfWeek());//day of week
    Serial.print(") ");
    Serial.print(rtc.getHour(), DEC);//hour
    Serial.print(':');
    Serial.print(rtc.getMinute(), DEC);//minute
    Serial.print(':');
    Serial.print(rtc.getSecond(), DEC);//second
    Serial.print(' ');
    /*if rtc works in 24hours mode,this function doesn't print anything*/
    Serial.print(rtc.getAMorPM());
    Serial.println();
    Serial.print("Temperature: ");
    /*!
     *@brief Get sensor temperature
     *@param mode Select the sensor temperature measurement mode, default is false
     *@n true Enable temperature conversion to measure and obtain the current temperature immediately
     *@n false Disable temperature conversion and obtain the temperature measurement data within 64 seconds
     *@n       (the sensor measures the temperature every 64 seconds by default)
     *@return Sensor temperautre, unit: ℃ 
     */
    Serial.print(rtc.getTemperatureC(true));
    Serial.println(" C");
    delay(1000);

    /*!
     *@brief Judge if it is power-down
     *@return If retrun true, power down, needs to reset time; false, work well.
     */
    if (rtc.isLostPower()) {
        Serial.println("RTC lost power, please reset the time!");
    }
}

实验结果

通过串口助手显示出进行初始时间设置后开始计时,并显示出当前环境的温度。
在这里插入图片描述

最后

以上就是单纯大叔为你收集整理的Arduino UNO驱动DS3231数字实时时钟RTC的全部内容,希望文章能够帮你解决Arduino UNO驱动DS3231数字实时时钟RTC所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部