목차
WAT-DS3231 모듈
DS3231 Real Time Clock Module은 날짜,시간을 관리해주는 모듈입니다. 시간 오차가 거의 없으며 정확합니다. (직접 1달 동안 테스트를 해보았는데 오차는 1초 미만이었습니다.)
아두이노와 WAT-DS3231 모듈로 현재 시간 설정, 시간을 읽는 예제입니다.

부품 목록
| 부품명 | 아두이노 UNO R3 | |
|---|---|---|
| 기능 | 아두이노 모듈 | |
| 수량 | 1 | |
| 아두이노 UNO R3 |
| 부품명 | WAT-DS3221 RealTime Clock Module | |
|---|---|---|
| 기능 | RealTime Clock | |
| 수량 | 1 EA | |
| RealTime Clock |

소스코드
최신 소스코드는 [파일]=>[예제]=>[WhiteAT UNO]=> [DS3231] 에 있으며
라이브러리는 아두이노 개발환경(https://docs.whiteat.com/?page_id=5449) 을 참조하세요
/*
WAT-DS3231 를 UNO 에 연결하여 날짜, 시간, 온도를 읽어 오는 예제입니다.
출처: http://whiteat.com/Arduino
부품
. Arduino UNO R3 : https://kit128.com/goods/view?no=337
. DS3231 모듈 : https://kit128.com/goods/view?no=680
. CR2032 백업배터리: https://kit128.com/goods/view?no=301
*/
#include <Wire.h>
// DS3231 I2C Address
#define DS3231_I2C_ADDRESS 104
// 데이터핀 연결
// SCL - pin A5
// SDA - pin A4
byte seconds, minutes, hours, day, date, month, year;
char weekDay[4];
byte tMSB, tLSB;
float temp3231;
void setup()
{
Wire.begin();
Serial.begin(115200);
Serial.println("Arduino Examples - DS3231 Real Time Clock Module");
Serial.println(" https://docs.whiteat.com/?p=7960");
// 날짜, 시간 설정할 때만 사용해야 한다.
// setDefaultTime();
}
void loop()
{
getNowTime();
Serial.print(weekDay);
Serial.print(", 20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(date, DEC);
Serial.print(" - ");
Serial.print(hours, DEC);
Serial.print(":");
Serial.print(minutes, DEC);
Serial.print(":");
Serial.print(seconds, DEC);
Serial.print(" - Temp: ");
Serial.println(getTemperature());
delay(1000);
}
// BCD 로 변환 (Binary Coded Decimal)
byte decToBcd(byte val)
{
return ((val / 10 * 16) + (val % 10));
}
void setDefaultTime()
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x00);
Wire.write(decToBcd(00)); // second
Wire.write(decToBcd(05)); // minute
Wire.write(decToBcd(13)); // hour
Wire.write(decToBcd(1)); // 1: sunday, 2: monday, 7: saturday
Wire.write(decToBcd(22)); // date
Wire.write(decToBcd(01)); // month
Wire.write(decToBcd(19)); // year
Wire.endTransmission();
}
void getNowTime()
{
Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
Wire.write(0x00); // start at register 0
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes
if (Wire.available()) {
seconds = Wire.read(); // get seconds
minutes = Wire.read(); // get minutes
hours = Wire.read(); // get hours
day = Wire.read();
date = Wire.read(); // get date
month = Wire.read(); // get month
year = Wire.read(); // get year
seconds = (((seconds & B11110000) >> 4) * 10 + (seconds & B00001111)); // convert BCD to decimal
minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111)); // convert BCD to decimal
hours = (((hours & B00110000) >> 4) * 10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
day = (day & B00000111); // 1-7
date = (((date & B00110000) >> 4) * 10 + (date & B00001111)); // 1-31
month = (((month & B00010000) >> 4) * 10 + (month & B00001111)); //msb7 is century overflow
year = (((year & B11110000) >> 4) * 10 + (year & B00001111));
}
switch (day) {
case 1:
strcpy(weekDay, "Sun");
break;
case 2:
strcpy(weekDay, "Mon");
break;
case 3:
strcpy(weekDay, "Tue");
break;
case 4:
strcpy(weekDay, "Wed");
break;
case 5:
strcpy(weekDay, "Thu");
break;
case 6:
strcpy(weekDay, "Fri");
break;
case 7:
strcpy(weekDay, "Sat");
break;
}
}
float getTemperature()
{
//temp registers (11h-12h) get updated automatically every 64s
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
if (Wire.available()) {
tMSB = Wire.read(); //2's complement int portion
tLSB = Wire.read(); //fraction portion
temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
temp3231 += ((tLSB >> 6) * 0.25); //only care about bits 7 & 8
}
else {
//error! no data!
}
return temp3231;
}
결과
2019년 1월 22일 13:05:00 로 시간을 설정하고,
1초마다 시간이 변경되는 것을 확인 할 수 있습니다.
백업 배터리를 이용하면 아두이노 전원이 차단되어도 시간이 유지됩니다.

제품 구매
Arduino UNO R3 은 https://kit128.com/goods/view?no=337 에서
WAT-DS3231 RealTimeClock 모듈은 https://kit128.com/goods/view?no=680 에서
CR2032 백업배터리는 https://kit128.com/goods/view?no=301 에서 구매하실 수 있습니다.
.

