이번 시간에는 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 댓글