Tiny RTC(DS1307)를 이용해 시계 만들기

by 조혜인 | 2017-01-10 18:37
rtc 시계 아두이노 알람

재료

  • Tiny RTC(DS13070) 1개 (3300원)




스마트폰으로 컨트롤 가능한 알람시계를 만들어보려고 합니다.

스마트폰에서 알람을 설정하면 연동된 하드웨어에서 빛과 소리가 나도록 할 예정입니다.

스마트폰에서 날씨정보를 받아 하드웨어의 빛과 소리로 표현을 하면 일종의 정보허브가 될 수 있습니다. 또 내 마음대로 빛과 소리를 설정해서 나만의 귀여운 알람시계를 만들 수 있습니다.



1. 준비물


-Tiny RTC(DS1307)

- 아두이노

- 점퍼케이블




2. RTC(Real Time Clock)

RTC(Real Time Clock)은 마이크로프로세서의 개입없이 컴퓨터 전원이 차단 되어도 시간을 계속 카운팅 해주는 하드웨어 모듈입니다.

이 프로젝트에서는 Tiny RTC(DS1307)라는 모듈을 이용합니다.

I2C 통신으로 아두이노에 현재시간을 전달합니다.




3. 하드웨어 연결


하드웨어 연결은 다음과 같이 합니다.


     아두이노Pin      Tiny RTC(DS1307)
A5SCL
A4SDA
5VVCC
GNDGND




4. 소프트웨어


1) 라이브러리 설치

우선 관련 라이브러리를 설치해야합니다.

아래 라이브러리를 클릭해서 다운받아 주세요.


Time.h

DS1307RTC.h


※ 라이브러리 설치 방법

"Clone or download" 클릭 후, "Download ZIP"을 다운받아 압축을 풀어주신 후

아두이노 라이브러리 폴더(경로 --> C:\Program Files (x86)\Arduino\libraries)에 설치해 주시면 됩니다. 경로는 OS와 설치한 위치마다 다를 수 있습니다.






2) 소스코드

다음 코드는 Tiny RTC모듈에 현재 시간을 설정하는 코드 입니다.

컴퓨터의 시간을 불러와서 Tiny RTC모듈에 저장합니다.


<전체코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
 
const char *monthName[12] = {
  "Jan""Feb""Mar""Apr""May""Jun",
  "Jul""Aug""Sep""Oct""Nov""Dec"
};
 
tmElements_t tm;
 
void setup() {
  bool parse=false;
  bool config=false;
 
  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }
 
  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}
 
void loop() {
}
 
bool getTime(const char *str)
{
  int Hour, Min, Sec;
 
  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}
 
bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;
 
  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}
 




- 소스코드 설명


① 라이브러리를 불러옵니다.

1
2
3
4
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>



② 'tm'이라는 RTC객체를 만듭니다.

1
tmElements_t tm;
 

③ 내가 이용하고 있는 컴퓨터의 시간을 받아옵니다.

__DATE__, __TIME__ 변수는 내가 이용하고 있는 컴퓨터의 시간과 날짜를 의미합니다.
getDate, getTime 함수를 이용해 시간,날짜를 잘 불러왔다면
시리얼창에 시간과 날짜를 출력합니다.

1
2
3
4
5
6
7
8
9
10
 
  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }
 
 


④ RTC 모듈에 시간 저장하기

getTime(const char *str) 함수는 컴퓨터로부터 불러온 시간을 RTC모듈에 입력하는 역할을 합니다.


1
2
3
4
5
6
7
8
9
10
bool getTime(const char *str)
{
  int Hour, Min, Sec;
 
  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}
 

⑤ RTC 모듈에 날짜 저장하기

getDate(const char *str) 함수는 컴퓨터로부터 불러온 날짜를 RTC모듈에 입력하는 역할을 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;
 
  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}




5. 수행결과
왼쪽이 코드를 업로드 한 후 시리얼 창을 킨 사진입니다.
오른쪽은 제 컴퓨터의 시간입니다.
정확히 일치하는 것을 보실 수 있습니다 :-)




6. 다음 과제
'스마트폰으로 아두이노 알람 설정하기''를 시도해 보겠습니다.
블루투스 모듈과 피에조로 우선 실험할 계획입니다.

댓글 0

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어
알람 설정하기 기능 다음글 Tiny RTC(DS1307)를 이용해 시계 만들기현재글