Ks0166 keyestudio DS3234 high precision real time clock module

From Keyestudio Wiki
Jump to navigation Jump to search



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.

thumb


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


thumb


Circuit Connection


thumb


Sample Code

#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);
}


Result

Open serial monitor, you can see the time display as below:
thumb


Resources

  • PDF:

https://drive.google.com/open?id=1Jpi1eDf-v_XEcdLDlpqaJQ6HyAcxnR-s

  • Code and libraries

https://drive.google.com/open?id=1dflktZN__NvJ454G-fZOzr8eibplSfWJ

  • Video

http://video.keyestudio.com/ks0166/



Buy From