概述
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 UNO | DS3231 |
---|---|
A4 | SDA |
A5 | SCL |
3.3V | VCC |
GND | GND |
测试代码
在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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复