[WAT-DS3231] DS3231 Real Time Clock Module

[WAT-DS3231] DS3231 Real Time Clock Module

WAT-DS3231 모듈

DS3231 Real Time Clock Module은 날짜,시간을 관리해주는 모듈입니다. 시간 오차가 거의 없으며 정확합니다. (직접 1달 동안 테스트를 해보았는데  오차는 1초 미만이었습니다.)

아두이노WAT-DS3231 모듈로 현재 시간 설정, 시간을 읽는 예제입니다.

 

부품 목록
부품명 아두이노 UNO R3

Arduino 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 에서 구매하실 수 있습니다.

.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다