아두이노용 Adafruit 데이터 로깅 쉴드의 RTC모듈 사용하기

RTC(Real Time Clock) 사용하기

Real Time Clock 이란?

데이터를 로깅 받을때 로깅된 데이터에 시간 정보가 표기되어 있지 않다면 의미없는 데이터가 되는 경우가 종종 있습니다. 데이터에 시간 정보가 표기되어 있으면 여러모로 데이터 분석에 유용합니다.

아두이노는 millis()라 불리는 내장된 타임키퍼가 있으며 칩내부에 타이머가 있어 수분이나 수일정도의 시간을 tracking할 수 있습니다만 millis()는 아두이노가 전원이 들어온 시점부터 얼마나 시간이 지났는지를 알려줄 뿐이라는 단점이 있습니다. 만약 아두이노에 전원공급이 차단된다면 시간은 0으로 재설정되게 됩니다. 아두이노는 오늘이 화요일인지 3월8일인지 이런 것들은 알수 없고, 그저 전원이 들어온 후 14,000 millisecond가 지났다만 알 수 있는 것입니다. 이러한 단점을 극복하기 위하여 RTC칩을 사용하는 것입니다.

아두이노에게 시간을 설정하기를 원한다면 어떻게 해야 할까요? 날짜와 시간을 프로그래밍하여야 합니다. 그리고 프로그래밍 한 시점부터 흐르는 시간을 카운트하여야겠죠. 하지만 전원이 나간다면 시간도 재설정됩니다. RTC칩 없이 이렇게 시간을 측정하는 것도 몇몇 프로젝트에서는 잘 사용됩니다. 하지만 데이터 로거는 아두이노의 전원이 나가도, 재프로그래밍되어도 일정한 시간정보를 유지하는 것이 필요합니다. 그래서 우리는 별도의 RTC칩을 사용합니다.

RTC칩은 시간정보를 tracking하기 위한 기능의 특별한 칩입니다. 윤년을 카운트 할 수 있으며, 한달에 몇일이 있는지 알수 있습니다.

Realtimeclock_Motherboard_Baby_AT_crop.jpg

위의 사진은 컴퓨터의 머더보드에 있는 RTC 입니다. DS1387인데 배터리를 장착하고 있어 상대적으로 부피가 큽니다.

우리가 사용하고자 하는 RTC는 DS1307으로 저렴하고 납땜하기 쉬우며, 작은 코인 배터리로 수년간 동작시킬 수 있습니다.

ds1307_t.jpg
코인셀 배터리가 전원을 공급하는 한 DS1307은 아두이노가 전원이 나가거나 재프로그래밍되어도, 아주 오랜 시간동안 시간정보를 유지합니다. RTC를 사용할때는 반드시 코인셀을 같이 설치하여야 합니다. 죽은 배터리라도 설치를 해놓아야 이상하게 동작하거나 시스템에 안좋은 영향을 주는 것을 막을 수 있습니다.
2013_04_06_IMG_1582-1024.jpg

RTC와 통신하여 보기

RTC는 I2C 장치입니다. 이말은 RTC와 통신하기 위해서는 2개의 통신선이 필요하다는 의미이며, 이 두개의 선을 이용하여 시간을 설정하고 받아옵니다. 아두이노에서는 I2C가 아날로그 4번, 5번핀으로 고정되어 있습니다. RTC라이브러리는 JeeLab의 RTC라이브러리를 사용할 것입니다. 다음의 링크에서 다운로드 받고 RTClib 폴더를 아두이노 디렉토리에 설치하십시오. download it now.

RTC 테스트하여 보기

RTC를 가지고 처음 테스트하여 볼 스케치 코드는 일초에 한번씩 RTC로부터 시간을 읽어오는 코드입니다. 그리고 배터리를 제거하거나 교체하면 어떤일이 일어나는지를 살펴보겠습니다. 먼저 아두이노의 전원을 제거한 후 RTC의 배터리를 제거합니다. 한 3초정도 기다린후 배터리를 다시 낍니다. 이렇게 하면 RTC 칩이 리셋됩니다. 그 다음 아래의 스케치 코드를 업로드 합니다. 스케치 코드는 Example->RTClib-ds1307에서 찾아 볼수 있습니다. 물론 아두이노에는 데이타 로깅 쉴드가 연결이 되어 있어야 겠죠.

시리얼 터미널을 실행합니다. 보오드 레이트가 57600으로 설정되어 있는지 확인합니다. 그러면 아래와 같은 화면이 보일 것입니다.


RTCnotrun.gif
RTC칩이 전원이 나갈때에는 RTC는 시간을 0:0:0으로 출력하게 되며 시간을 세지 않습니다. 시간을 설정하면 RTC는 시간을 재기 시작합니다. 그래서 시간을 설정하면 배터리를 제거해서는 안됩니다.

시간 설정하기

위의 스케치 코드에서 setup()함수내의 RTC.adjust로 시작하는 부분의 코맨트 처리를 제거합니다.

// following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__));
이 코드는 사용하고 있는 컴퓨터에서 날짜와 시간정보를 가지고와서 RTC에 프로그램하게 합니다. 만약 컴퓨터의 시간이 맞지 않다면 먼저 컴퓨터의 시간을 올바르게 설정하여야 합니다. 코멘트 처리를 제거한 코드를 다시 업로드한 후 시리얼 모니터 창을 열면 아래와 같이 시간이 설정된 것을 볼 수 있습니다.

RTCsettimegif.gif
시간이 설정되었기 때문에 지금부터는 다시 시간을 설정할 필요가 없습니다. 배터리는 약 5년이상 동작합니다.

시간 읽어 오기

이제 RTC는 계속 시간정보를 가지고 있기때문에 필요할때마다 시간 정보를 RTC로부터 얻어 오면 됩니다. 이것을 어떻게 하는지 아래의 스케치 코드를 살펴보겠습니다.

void loop () {
    DateTime now = RTC.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
}

RTClib 라이브러리를 사용하여 시간을 얻어 올때는 now()함수를 이용하면됩니다. 이 함수는 년도, 월, 날짜, 시간, 초를 함수 호출시에 리턴하여 줍니다.

unixtime()함수를 호출하면 1970년도 1월1일 자정부터 초로 계산한 숫자를 timestamp값으로 얻을 수도 있습니다.

    Serial.print(" since 2000 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
하루는 86400 초이기때문에 unixtime()함수를 호출하여 리턴된 결과값을 이 숫자로 나누어 주면 1970년 1월1일부터 현재까지의 날자를 얻을 수 있습니다. 이러한 방법은 시간을 계산하여야 하는 수식을 만들때 편리한 점이 있습니다.
가치창조기술
Comments