정보공유// 날짜를 획득하는 방법에 대해서

3 views
Skip to first unread message

고태홍

unread,
Dec 10, 2010, 6:26:07 AM12/10/10
to honaya_pi...@googlegroups.com

그러고보니 저한테도 질문이 하나 들어왔는데 과제하시는 여러분들도 다들 필요한 내용인 거 같아서

같이 아시면 좋겠다 하고 전체메일 보내봅니다.

 

프로세싱에서 오늘의 날짜를 획득하기 위한 함수입니다. :)

int yy=year();

int mm=month();

int dd=day();

 

이렇게 하면 yy에 올해의 연도가, mm에 현재 달이, dd에 현재 날짜가 정수형으로 들어갑니다.

(함수의 리턴값이 정수형이기 때문에 정수형 변수로 받아주어야합니다)

프로세싱에서 출력을 하는 팀은 이 변수를 적절하게 그냥 사용하면 될 것이고

아르두이노를 출력에 사용하는 팀은 시리얼 통신을 이용해서 아르두이노로 보내면 되겠지요.

레퍼런스를 자세히 읽지는 않아서 확실한 얘기는 아닌데, 아마 획득하는 시간 값은

현재 프로세싱이 돌아가는 컴퓨터의 내부 시계에서 값을 가져오는 걸 겁니다. (사실

타임 서버라도 이용하지 않는 이상은 그 방법밖에 없을테고 -_-;;;)

 

해당 함수는 레퍼런스에도 나와있으니 자세한 내용은 레퍼런스를 참고하시면 되겠습니다.

시간도 저런식으로 받을 수 있으니 시간이 필요한 팀은 레퍼런스를 참고해주세요.

(사실 참고할것도 없이 시분초는 똑같이 hour, minute, second 함수고 리턴값은 똑같이 정수입니다. ㅎㅎ)

 

프로세싱이나 기타 다른 컴퓨터에서의 플랫폼 도움 없이 아르두이노만 사용하는 팀의 경우에는 문제가 좀 골치아파지는데,

아르두이노에는 현재 날짜와 시간을 저장하는 클럭IC가 없습니다. 시간에 관련한 함수는 아르두이노 보드가

현재 프로그램을 실행하기 시작한 시점부터  현재까지의 경과시간만을 밀리 초(그러니까 1/1000초)단위와

마이크로 초(1/1000000초) 단위로 측정하는 기능과 밀리초, 혹은 마이크로초 단위로 딜레이를 주는 기능밖에 없습니다.

따라서 적절한 방안을 강구하지 않으면 아르두이노만으로 달력 기능을 재현하기는 어려울 수 있습니다.

 

간단히 생각해본 방법이라면 프로그램을 실행할 때 시작시점의 날짜와 시간이 들어가는 변수(어쩔 수 없이 코드에서 직접 값을

줄 수밖에 없겠지요. 아니면 스위치 같은 걸로 입력받아서 변수값을 조정할 수 있게 하거나요)를 두고

이 변수값에 일정 경과시간이 지날 때마다 값을 더해주는 식으로 만드는 방법이 있을 거 같습니다.

 

아르두이노에서 시간을 재주는 함수는

unsigned long ms=millis(); // 시작시간부터 현재까지 경과시간을 밀리초 단위로 값 받기

unsigned long mics=micros(); // 시작시간부터 현재까지 경과시간을 마이크로초 단위로 값 받기

 

이런 식으로 사용해주시면 됩니다. unsigned long 값이라 받을 수 있는 값 자체는 상당히 크지만 millis 함수의 경우는

약 50일, micros 함수의 경우는 70분 정도가 지나면 변수가 받을 수 있는 값의 한계를 넘어(overflow라고 합니다)

0으로 리셋이 된다고 하니 이 부분도 감안을 하셔서 코딩을 하셔야 할거 같습니다. (사실 마이크로초 단위로

시간을 잴 이유는 달력의 경우엔 별로 없겠지요...-_-)

 

PyO

unread,
Dec 11, 2010, 11:16:14 PM12/11/10
to honaya_pi...@googlegroups.com
태홍 님의 정보공유가 많은 분들에게 도움이 될 것 같네요. 저자워크숍의 철학처럼, 서로 돕고 공유하고 하면 좋지요. 다른 분들도 혹 알게되는 정보가 있으면 공유해주세요. 

2010/12/10 고태홍 <tild...@nate.com>

honaya

unread,
Dec 12, 2010, 8:32:30 AM12/12/10
to honaya_pi...@googlegroups.com
컴퓨터와 시간

이번 과제에서 달력을 다룬다고 처음 이야기가 나왔을 때, 무척 좋은 주제라고 생각했지만, 한편으로는 걱정이 되기도 했습니다. 고태홍씨의 글을 읽고 몇가지 생각나는 부분이 있어서 적어보겠습니다.

컴퓨터을 표현의 매체라고 생각했을 때, 다른 매체와 가장 차별화되는 점은 바로, "시간"입니다. 그림에서는 "시간"을 표현 요소로 사용할 수가 없습니다. 음악에서는 "시간"을 적극적으로 사용합니다. 그런 측면에서 보면, 컴퓨터의 매체적인 성격은 오히려, 악기에 가깝습니다.

그럼 컴퓨터에서의 시간은 어떻게 흐를까요? 지금 이 시간을, "틱"하고 또 방금 흘러가 버린 이 시간을  컴퓨터는 어떻게 기억할까요. 한가지 분명한 것은 컴퓨터는 전원이 들어오기 전의 시간을 기억하지 못합니다. 컴퓨터가 기억하는 것은 오로지, 전원이 들어오고 난 이후의 시간입니다. 그리고, 컴퓨터의 시간과 인간의 시간은 다릅니다. 컴퓨터에서는 오로지 한번의 클락의 시간이 존재합니다. 아르뒤노의 경우, 16MHz라고 한다면, 1초에 1천 6백만 번의 시간을 구분하는 것입니다. 이런 것을 tick이라고 합니다. 이런 기계의 시간인 tick과 인간의 시간인 second를 맞추어 주는 것이 중요합니다. 이것은 각각의 컴퓨터마다 다릅니다. 예를 들어, 이 기계에서는 몇번의 tick을 1밀리세컨드라고 하자고 정하는 식입니다.

컴퓨터에서의 시간은 숫자입니다. 0에서부터 시작합니다. 만일 시간이 0이라고 한다면, 1970년 1월 1일 0시 0분 0초를 의미합니다. 그렇게 약속했어요. 그리고, 컴퓨터에 전원이 들어오는 순간, 0에서 부터 1 밀리세컨드가 지날 때 마다, 숫자를 하나씩 증가시킵니다. 그럼, 어떻게 오늘 날짜를 정확하게 보여줄까요? 우리가 컴퓨터에서 시간을 설정하고 나면, 그 시간값을 숫자로 기억하고 있다가, 더해주기 때문에 가능합니다. 이런 값을 offset이라고 합니다. 만일 오늘이 1971년이라고 한다면, offset값은 1년이라는 시간을 밀리세컨드로 나타내야 합니다. 아마 1000 * 60 * 60 * 24 * 365 가 될 것입니다. 컴퓨터를 처음 설치할 때, 반드시 현재 시간을 묻는 이유도 여기에 있습니다. 

프로세싱에서 다음과 같이 적어 보세요.

void draw() {
  Calendar cal = Calendar.getInstance();
  println(cal);
}

사실 인간의 시간은 단순한 숫자가 아니라서, 조금 복잡한 계산이 필요합니다. 일단, 현재 시간대가 있겠고, 윤년과 같은 문제, 요일, 혹은, 서머타임과 같은 여러가지 이슈가 포함됩니다. 따라서 프로세싱에서는 Calendar라고 하는 오브제로서 시간의 문제를 다룹니다. 보면, Calendar가 가지고 있는 다양한 값들을 확인할 수 있을 겁니다.

void draw() {
  Calendar cal = Calendar.getInstance();
  Date d = cal.getTime();
  println(d);
}

라고 하면, Calendar에서 date을 보여줄 것입니다.

void draw() {
  Calendar cal = Calendar.getInstance();
  Date d = cal.getTime();
  long t = d.getTime();
  println(t);
}

라고 하면, 제가 처음에 말씀드린, 1970년부터의 시간을 밀리세컨드 단위로 보여줍니다. 단 long 은 너무 길어서, 숫자가 다 나오지 않습니다. 맨 아래를 다음과 같이 바꿔보세요.

  println(Long.toString(t));

자, 그럼. 다음처럼 하나씩 바꿔보세요. 1000으로 나누면, 초가 되겠죠.

  println(Long.toString(t/1000));

다음과 같습니다.

  println(Long.toString(t/1000/60));  // 분
  println(Long.toString(t/1000/60/60));  // 시간
  println(Long.toString(t/1000/60/60/24)); // 일
  println(Long.toString(t/1000/60/60/24/365)); // 년

시간이 정확하게 설정되어 있다면,

  println(Long.toString(t/1000/60/60/24/365_1970)); // 년

은 2010을 찍어야 할 것입니다. 참고하시고, 열심히 하세요. 한가지 힌트를 드리자면, 너무 기술적인 것에 집착하지는 않으셔도 좋겠습니다. 어떤 기술을 채택하기 전에, 그것이 어떤 의미를 가지고 있는지를 생각해보세요. 멀리서나마 지켜보겠습니다. 화이팅!!!

ㅎㄴㅇ 드림.



2010/12/12 PyO <vid...@gmail.com>
Reply all
Reply to author
Forward
0 new messages