KS0166 keyestudio DS3234 high precision real time clock module

1. Introduction
The DS3234 is a low-cost, extremely accurate SPI™ bus real-time clock (RTC) with an integrated temperature-compensated crystal oscillator (TCXO) and crystal.
The DS3234 incorporates a precision, temperature-compensated voltage reference and comparator circuit to monitor VCC. The device switches to the backup supply input and maintains accurate timekeeping when main power to the device is interrupted.
The integration of the crystal resonator enhances the long-term accuracy of the device as well as reduces the piece-part count in a manufacturing line. The DS3234 is available in commercial and industrial temperature ranges, and is offered in an industry-standard 300-mil, 20-pin SO package.
2. Specification
Accuracy ±2ppm from 0°C to +40°C
Accuracy ±3.5ppm from -40°C to +85°C
Battery Backup Input for Continuous Timekeeping
Operating Temperature Ranges:
Commercial: 0°C to +70°C
Industrial: -40°C to +85°C
Low-Power Consumption
Real-Time Clock Counts Seconds, Minutes, Hours, Day, Date, Month, and Year with Leap Year. Compensation Valid Up to 2099
Two Time-of-Day Alarms
Programmable Square-Wave Output
Digital Temp Sensor Output: ±3°C Accuracy
300-Mil, 20-Pin SO Package
Underwriters Laboratories Recognized
Battery: CR1225
3. Circuit Connection

4. Sample Code
Download Resource : Resource
Note: before uploading the code, you need to import the library files; otherwise, the code upload will fail.
#include <SPI.h>
const int cs=8; //chip select
void setup()
{
Serial.begin(9600);
RTC_init();
//day(1-31), month(1-12), year(0-99), hour(0-23), minute(0-59), second(0-59)
SetTimeDate(16,5,2,14,15,16);
}
void loop()
{
Serial.println(ReadTimeDate());
delay(1000);
}
//=====================================
int RTC_init()
{
pinMode(cs,OUTPUT); // chip select
// start the SPI library:
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE3); // both mode 1 & 3
//set control register
digitalWrite(cs, LOW);
SPI.transfer(0x8E);
SPI.transfer(0x60); //60= disable Osciallator and Battery
digitalWrite(cs, HIGH);
delay(10);
}
//=====================================
int SetTimeDate(int d, int mo, int y, int h, int mi, int s)
{
int TimeDate [7]={s,mi,h,0,d,mo,y};
for(int i=0; i<=6;i++)
{
if(i==3)
i++;
int b= TimeDate[i]/10;
int a= TimeDate[i]-b*10;
if(i==2){
if (b==2)
b=B00000010;
else if (b==1)
b=B00000001;
}
TimeDate[i]= a+(b<<4);
digitalWrite(cs, LOW);
SPI.transfer(i+0x80);
SPI.transfer(TimeDate[i]);
digitalWrite(cs, HIGH);
}
}
//=====================================
String ReadTimeDate()
{
String temp;
int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++)
{
if(i==3)
i++;
digitalWrite(cs, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);
digitalWrite(cs, HIGH);
int a=n & B00001111;
if(i==2)
{
int b=(n & B00110000)>>4; //24 hour mode
if(b==B00000010)
b=20;
else if(b==B00000001)
b=10;
TimeDate[i]=a+b;
}
else if(i==4)
{
int b=(n & B00110000)>>4;
TimeDate[i]=a+b*10;
}
else if(i==5)
{
int b=(n & B00010000)>>4;
TimeDate[i]=a+b*10;
}
else if(i==6)
{
int b=(n & B11110000)>>4;
TimeDate[i]=a+b*10;
}
else
{
int b=(n & B01110000)>>4;
TimeDate[i]=a+b*10;
}
}
temp.concat(TimeDate[4]);
temp.concat("/") ;
temp.concat(TimeDate[5]);
temp.concat("/") ;
temp.concat(TimeDate[6]);
temp.concat(" ") ;
temp.concat(TimeDate[2]);
temp.concat(":") ;
temp.concat(TimeDate[1]);
temp.concat(":") ;
temp.concat(TimeDate[0]);
return(temp);
}
5. Result
Open serial monitor, you can see the time display as below:
