[매드] 아두이노 강좌 - 31. RTC 모듈 동작

안녕하세요~ 매드 입니다.

이번 시간에는 RTC 모듈 동작 입니다.
정신 없이 지내다보니 ㅠ 올린줄 알았던 블로깅을 안했었네요! ㅎㅎ

어떻게 했는지 기억도 가물하지만 한번 기억나는대로 적어보겠습니다.


31-1. RTC 모듈 동작

<DS3231(출처:구글사진)>

이번에 진행할 모듈은 RTC 모듈 입니다. RTC는 Real Time Clock의 약자로 언뜻 보면 별로 중요하지 않은 부분인 것 같은데요. 왜 시계를 모듈까지 사서 구현해야 하지? 라는 질문을 하실 수도 있습니다.

여러가지 이유가 있지만 시간이라는 것이 우리가 알게모르게 굉장히 정밀하게 사용되고 있기 때문입니다. 예를들면 우주로 우주선을 쏘올렸을 때 모든 것이 계산대로 움직여야하는데 이는 시간을 기준으로 모든 것이 움직이기 때문이죠!

또는 게임에서도 아이템이 랜덤으로 떨어지게 되는데 이 랜덤이라는 기준도 시간을 기준으로 랜덤이기 때문에 시간이라는 것은 시스템에서 굉장히 굉장히!! 중요 합니다.

최근에 일반인이 사용가능한 가장 정확한 시간은 GPS 시계와 NTP 시계를 들 수 있는데요. 요런 것들은 다음기회에 다루기로 하고 이번에는 RTC 모듈을 통해 시간을 다뤄보도록 하겠습니다.

RTC 모듈을 사용하면 우선 한번의 시간 셋팅으로 전원과 상관 없이 연속적인 시간을 구현 할 수 있으며 아두이노가 시간을 신경쓰지 않고 다른 기능들을 동작 수행하는데 집중 할 수 있습니다.

이외에도 시간이 필요한 다른 곳에서 많이 사용할 수 있겠죠~?


31-2. RTC 모듈 연결


<아두이노 DS3231(출처:구글사진)>

이런 RTC 모듈 중에 아두이노에서는 DS1302라는 모듈과 DS3231 이라는 모듈을 많이 사용하고 있습니다. DS3231 모듈이 DS1302 모듈보다 좀더 정밀한 시간을 측정한다고 생각하시면 될 것 같네요.

이런 RTC 모듈의 시간 기준이 되는 것은 내부의 클럭(크리스탈)동작인데 이 크리스탈이라는 물질이 온도와 습도에 민감합니다. DS3231은 내부 온도센서를 통해 이 온도에 의한 변화도 시간에 적용하여 좀 더 정밀 할 수 있는 것이죠.

RTC 모듈은 아두이노와 i2c 통신을 통해서 동작되게 됩니다. 그동안 많은 센서들이 i2c를 기반으로 하여 동작했기 때문에 이제는 문제 없이 연결 하실 수 있겠죠??

아두이노    DS3231
5V            VCC
GND         GND
A4            SDA
A5            SCL


31-3. 펌웨어

아두이노 라이브러라에가서 DS3231을 검색하면 Sodaq_DS3231 라이브러리를 추가할 수 있습니다. 이를 추가해서 예제를 통해 동작 시켜보도록 하죠!


// Date and time functions using RX8025 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "Sodaq_DS3231.h"

char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

void setup ()
{
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
}

uint32_t old_ts;

void loop ()
{
  DateTime now = rtc.now(); //get the current date-time
  uint32_t ts = now.getEpoch();

  if (old_ts == 0 || old_ts != ts) {
    old_ts = ts;
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.date(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(' ');
    Serial.print(weekDay[now.dayOfWeek()]);
    Serial.println();
    Serial.print("Seconds since Unix Epoch: ");
    Serial.print(ts, DEC);
    Serial.println();
  }
  delay(1000);
}


댓글 쓰기

0 댓글