인터랙티브 캘린더 만들기

by 하민정 | 2017-01-17 16:22
개인비서 디자인 인터랙티브 캘린더 일상 일상을

재료

  • 아두이노 나노 1개
  • 실톱 1개
  • 드릴 1개
  • 텍스타일 테이프 1개
  • LED 7개
  • 못 1개
  • 알루미늄 호일 1개
  • 220 옴 저항 1개
  • 3V 배터리 홀더 1개
  • 코르크핀 6개
  • 드라이버 1개
  • 종이 테이프 1개
  • 부저 2개
  • 납땜기 1개
  • 15mm x 40mm PCB 보드 1개
  • 양면테이프 1개
  • 작은 LED 4개
  • 전선 케이블 1개
  • 볼트, 너트, 4mm x 10mm 링 7개
  • 코르크 보드 1개
  • 세븐 세그먼트 디스플레이 1개

                         


일상을 디자인 하는 일다들 어떻게 하고 계신가요? 

캘린더에 기록하지만 잊어버리는 경우 없었나요? 

'시리' 와 같은 HOT 한 인공지능 비서를 두어도 인지하지 못한 경우는 없었나요? 


이런 사람들을 위해 간단히 만들 수 있는 인터랙티브 캘린더가 있습니다. 


눈에 보이는 곳에 놓고, 해당 날짜 및 시간이 되면 LED 그리고 부저를 이용해 알람이 울립니다. 

이렇게 인지할 수 있게 한다면,

중요한 일들을 까먹은 일은 이제 없지 않을까요? 


다음의 프로젝트를 instructables 에서 접하여 소개하고자 합니다. 


Step 1. 준비물 


- 양면테이프 

- 텍스타일 테이프 

- 종이 테이프 

- 코르크 보드 

- 알루미늄 호일 

- 납땜기 

- 실톱


- 4개의 작은 LED 

- 7개 LED 

- 2개의 부저 

- 세븐 세그먼트 디스플레이 

- 220 옴 저항

- 15 x 40mm PCB 보드 

- 아두이노 나노

- 3V 배터리 홀더 


- 6개의 코르크핀 

- 전선 케이블 

- 드릴 

- 드라이버 

- 7쌍의 볼트 너트와

4mm x 10mm 링의 쌍 

- 작은 못 

- 크리스탈  

- 1개 나사 


- 나무 본드 

- 나무

  프레임 


Step 2. 제작 및 하드웨어 연결방법 


① 메인 코르크 보드 만들기 


위의 준비물 중 다음의 것들을 이용합니다. 

- 양면 테이프 

- 실톱 

- 코르크 보드 

- 알루미늄 호일 




코르크 보드를 10cm x 40cm 사이즈로 자릅니다. 

이후 사용을 위해 4cm x 40cm 사이즈의 코르크 보드로 자릅니다. 

이 코르크 보드의 경우 두 개의 층을 갖고 있습니다. 


따라서 첫번째 층의 코르크 보드 전체에 양면 테이프를 붙입니다. 

두번째 층의 코르크 보드에 가장 윗 부분과 아래 부분에 양면 테이프를 붙입니다. 

첫번째 층의 코르크 보드 전체에 알루미늄 호일을 붙입니다. 

두번째 층의 코르크 보드에 7cm x 40cm 의 알루미늄 호일을 가운데에 붙입니다. 


알루미늄 호일은 이제 전기장의 Ground 역할을 합니다. 

하지만 실제로 코르크 보드를 사용하기 위해서 

알루미늄 호일이 붙여진 곳을 안쪽으로 향하도록 두 층을 붙입니다. 


 특별한 핀 만들기 


위의 준비물 중 다음의 것들을 이용합니다 

- 실톱 

- 납땜기 

- 4개의 작은 LED 

- 2개의 부저 

- 6개의 코르크 핀 

- 전선 케이블 




코르크 핀의 윗 부분을 떼어 내고, 이것을 LED 다리와 부저와 함께 연결합니다. 

연결된 핀 들을 납땜하여 하나의 핀으로 만듭니다. 

* 이때 LED 가 잘 작동 하는지 테스트 해 봅니다. 


 캘린더의 타이틀 만들기 


위의 준비물 중 다음의 것들을 이용합니다. 

- 드릴 

- 드라이버 

- 7개 쌍의 볼트 너트와 4mm x 10mm 링의 쌍 

- 텍스타일 테이프 


                          


           


            


1번에서 잘라놓은 4 x 40cm 의 코르크 보드를 이용합니다. 

드릴을 이용하여 구멍을 내어 줍니다. 

구멍에 너트와 볼트를 5V 와 연결하여 알람핀으로 이용할 수 있도록 넣어 줍니다. 


 전선 연결 


위의 준비물 중 다음의 것들을 이용합니다. 

- 납땜기 

- 세븐 세그먼트 디스플레이 

- 220 옴 저항 

- 15 x 40mm PCB 보드 

- RTC 1302 

- 3V 배터리 홀더 

- 크리스탈 

- 전선 케이블 

- 아두이노 나노 


 


세븐 세그먼트 디스플레이를 저항과 함께 아두이노 나노와 9, 10, 11, 12, 6, 13, 5, 7 번 핀과

연결합니다. 

알람핀의 경우 아두이노 나노의 A0, A1, A2, A6, A7 핀과 연결합니다. 

RTC 의 경우 현재 날짜를 입력 받기 위한 모듈입니다. 

이것은 아두이노 나노의 A3, A4, A5 와 연결합니다. 





 보드 제작 


위의 준비물 중 다음의 것들을 이용합니다. 

- 납땜기 

-드라이버 

- 가위

- 1개 나사

 -7개 LED 

- 종이 테이프 

- 전선 케이블 




코르크 보드 안에 LED 를 넣기 위해 각각의 요일들 옆에 구멍을 내어 줍니다. 

LED 양극을 종이 테이프로 감싸 그것으로 부터 단일 회로가 형성 되는 것을 막습니다. 


LED 다리의 양극을 뒤에 있는 와이어 케이블로 부터 나사와 함께 연결해 줍니다. 

각각을 요일마다 연결해 줍니다. 


각 LED 다리의 Ground 의 경우 알루미늄 호일로 감싸 주어 Ground 로 형성되게 만들었습니다. 

각각을 위치에 놓으면, 세븐 세그먼트 디스플레이에 날짜가 정상적으로 작동하게 됩니다. 


 프레임 만들기 


위의 준비물 중 다음의 것들을 이용합니다. 

- 실톱 

- 나무 본드 

- 나무 프레임 

- 작은 못 





나무 프레임을 캘린더에 만들기 위하여 해당하는 프레임의 크기로 잘라 줍니다.

캘린더를 벽에 걸기 위한 용도로 만들 수 도 있고, 

탁자에 세워두기 위한 용도로 만들 수 도 있습니다. 


코르크 보드를 프레임을 씌운 뒤, 못으로 이 캘린더를 고정합니다. 


Step 3. 소프트웨어 연결방법 


1
2
3
4
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1302RTC.h>
 
cs


▶ 이 프로젝트의 경우 < TimeAlarms.h > 라는 라이브러리를 이용합니다. 

이 라이브러리를 통해 아두이노가 특정한 시간에 알람이 울릴 수 있는 기능을 구현하도록 

합니다. 


RTC 모듈을 통해 현재 시간 및 날짜를 전달 받기 위해 AS1302RTC.h 라는 라이브러리를 사용합니다. 


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
void setup()  { 
  Serial.begin(9600);
  setTime(13, 50, 30, 18, 11, 2015);   //set the system time to
                                        //23h31m30s on 3Feb2009
  RTC.set(now());                     //set the RTC from the system time
  
  setSyncProvider(RTC.get);
    
  // INISIALISASI
  for (int i=2; i<=14; i++) pinMode(i, OUTPUT);
  matikan_semua();
  
 //SET ALARM
  Alarm.alarmRepeat (dowMonday,13,51,0, monAlarm);// NYALAIN
  Alarm.alarmRepeat (dowTuesday,13,51,0, tueAlarm);// Matiin
  Alarm.alarmRepeat (dowWednesday,13,51,0, wedAlarm);// Matiin
  Alarm.alarmRepeat (dowThursday,13,51,0, thuAlarm);// Matiin
  Alarm.alarmRepeat (dowFriday,13,51,0, friAlarm);// Matiin
//  Alarm.alarmRepeat (dowSunday,06,45,0, sunAlarm);// Matiin
  
 pinMode(alarmPin_1,OUTPUT);
 pinMode(alarmPin_2, OUTPUT);
 pinMode(alarmPin_3,OUTPUT);
 pinMode(alarmPin_4, OUTPUT);
 pinMode(alarmPin_5, OUTPUT);
cs


▶ setup ( ) 에서 알람 핀을 모두 출력으로 연결시켜 줍니다. 

월요일 부터 일요일까지 요일 들이 연결된 핀을 알람 으로 설정해 놓습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void monAlarm() {
digitalWrite (alarmPin_1, HIGH);
delay(100000);
}
void tueAlarm(){
digitalWrite (alarmPin_2, HIGH);
delay(100000);
}
void wedAlarm(){
digitalWrite (alarmPin_3, HIGH);
delay(100000);
}
void thuAlarm(){
digitalWrite (alarmPin_4, HIGH);
delay(100000);
}
void friAlarm(){
digitalWrite (alarmPin_5, HIGH);
delay(100000);
}
 
cs


▶ 각각의 알람의 경우 monAlarm( ) , tueAlarm ( ) 등 과 같은 함수에 연결되어 작동하게 됩니다. 

해당 알람이 울려야 하는 경우 이 함수에서 기존의 LOW 를 HIGH 로 변경해 주어 작동하게 됩니다. 


1
2
3
4
5
void loop() {
  Alarm.delay(0); //Ini yang penting buat alarm
  readTime();
  printTime();
  }
cs


▶ loop ( )문에서 계속해서 시간을 입력 받고 해당 시간에 연결된 핀이 있는지 여부를 검사합니다. 

readTime ( ) 의 경우 현재의 시간, 분, 초를 RTC 모듈로 부터 전달 받습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void printTime() {
  
  if (hari < 10) {
    tulis(0, 0);
  }
  else {
    int _hari = hari / 10;
    tulis(0, _hari);
  }
  byte __hari = hari %10;
  tulis(1, __hari);
   
  
  if (bulan < 10) {
    tulis(2, 0);
  }
  else {
    int _bulan = bulan / 10;
    tulis(2, _bulan);
  }
  tulis(3, bulan %10);
}
 
cs


▶ printTime ( ) 이라는 함수가 호출되는 경우 readTime 함수에서

지정된 현재의 시간, 분, 초를 출력하게 됩니다. 


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
void tulis(int d, int a) {
 refresh();
  digitalWrite(pin_digit[d], HIGH);
  int idx = a * 8;
  for (int i=0; i<8; i++) {
    if (angka[idx+i] == 1) digitalWrite(pin_segmen[i], LOW);
    else digitalWrite(pin_segmen[i], HIGH);
  }
  
  if (detik0 != detik) {
    detik0 = detik;
    if (dot == true) dot = false; else dot = true;
  }
  if (d == 1) {
    if (dot) {
      digitalWrite(pin_segmen[7], HIGH);
      digitalWrite(pin_dot, HIGH);
    }
    else {
      digitalWrite(pin_segmen[7], LOW);
      digitalWrite(pin_dot, LOW);
    } 
  }
  
  delayMicroseconds(100);
}
cs


tulis ( ) 라는 함수에서는 알람과 함께 LED 조명을 밝히는 기능을 합니다. 

특정 요일에 알람이 울려야 하는 상황이라면, 

해당 요일에 연결된 함수를 호출하고, LED 핀을 HIGH 로 변경해 불빛도 함께 비출 수 있도록 

만들었습니다. 


▶ 다음은 전체 코드입니다. 


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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1302RTC.h>
 
 
DS1302RTC RTC(A5, A4, A3);
 
int alarmPin_1 = A0;
int alarmPin_2 = A1;
int alarmPin_3 = A2;
int alarmPin_4 = A6;
int alarmPin_5 = A7;
//-----------------
 
byte pin_digit[] = { 2, 3, 4, 8 }; // PINDAHIN KE ANALOG, DIGITAL BUAT RELAY
byte pin_segmen[] = { 9, 10, 11, 12, 6, 13, 5, 7 };
byte angka[] = {
  1, 1, 1, 1, 1, 1, 0, 0, // 0
  0, 1, 1, 0, 0, 0, 0, 0, // 1
  1, 1, 0, 1, 1, 0, 1, 0, // 2
  1, 1, 1, 1, 0, 0, 1, 0, // 3
  0, 1, 1, 0, 0, 1, 1, 0, // 4
  1, 0, 1, 1, 0, 1, 1, 0, // 5
  1, 0, 1, 1, 1, 1, 1, 0, // 6
  1, 1, 1, 0, 0, 0, 0, 0, // 7
  1, 1, 1, 1, 1, 1, 1, 0, // 8
  1, 1, 1, 1, 0, 1, 1, 0 // 9
};
 
//-----------------------------------
 
//
int interval = 1000;
long sblm = 0;
boolean dot = LOW;
byte pin_dot = 9;
byte hari = 0;
byte bulan = 0;
byte detik = 0;
byte detik0 = 0;
 
 
 
  // Set the time and date on the chip.
  
void setup()  { 
  Serial.begin(9600);
  setTime(13, 50, 30, 18, 11, 2015);   //set the system time to
                                        //23h31m30s on 3Feb2009
  RTC.set(now());                     //set the RTC from the system time
  
  setSyncProvider(RTC.get);
 
    
  // INISIALISASI
  for (int i=2; i<=14; i++) pinMode(i, OUTPUT);
  matikan_semua();
  
 
 //SET ALARM
  Alarm.alarmRepeat (dowMonday,13,51,0, monAlarm);// NYALAIN
  Alarm.alarmRepeat (dowTuesday,13,51,0, tueAlarm);// Matiin
  Alarm.alarmRepeat (dowWednesday,13,51,0, wedAlarm);// Matiin
  Alarm.alarmRepeat (dowThursday,13,51,0, thuAlarm);// Matiin
  Alarm.alarmRepeat (dowFriday,13,51,0, friAlarm);// Matiin
//  Alarm.alarmRepeat (dowSunday,06,45,0, sunAlarm);// Matiin
  
 pinMode(alarmPin_1,OUTPUT);
 pinMode(alarmPin_2, OUTPUT);
 pinMode(alarmPin_3,OUTPUT);
 pinMode(alarmPin_4, OUTPUT);
 pinMode(alarmPin_5, OUTPUT);
 
 
void monAlarm() {
digitalWrite (alarmPin_1, HIGH);
delay(100000);
}
 
void tueAlarm(){
digitalWrite (alarmPin_2, HIGH);
delay(100000);
}
 
void wedAlarm(){
digitalWrite (alarmPin_3, HIGH);
delay(100000);
}
 
void thuAlarm(){
digitalWrite (alarmPin_4, HIGH);
delay(100000);
}
 
void friAlarm(){
digitalWrite (alarmPin_5, HIGH);
delay(100000);
}
 
 
 
void loop() {
  Alarm.delay(0); //Ini yang penting buat alarm
  readTime();
  printTime();
  }
 
void matikan_semua() {
  for (int i=0; i<4; i++) digitalWrite(pin_digit[i], LOW);
  for (int i=0; i<8; i++) digitalWrite(pin_segmen[i], HIGH);
}
 
void readTime() {
  
  if (millis() - sblm > interval) {
    hari = day();
    bulan = month();
    detik = second();
    sblm = millis();
  }
}
 
void printTime() {
  
  if (hari < 10) {
    tulis(0, 0);
  }
  else {
    int _hari = hari / 10;
    tulis(0, _hari);
  }
  byte __hari = hari %10;
  tulis(1, __hari);
   
  
  if (bulan < 10) {
    tulis(2, 0);
  }
  else {
    int _bulan = bulan / 10;
    tulis(2, _bulan);
  }
  tulis(3, bulan %10);
}
 
void tulis(int d, int a) {
 refresh();
  digitalWrite(pin_digit[d], HIGH);
  int idx = a * 8;
  for (int i=0; i<8; i++) {
    if (angka[idx+i] == 1) digitalWrite(pin_segmen[i], LOW);
    else digitalWrite(pin_segmen[i], HIGH);
  }
  
  if (detik0 != detik) {
    detik0 = detik;
    if (dot == true) dot = false; else dot = true;
  }
  if (d == 1) {
    if (dot) {
      digitalWrite(pin_segmen[7], HIGH);
      digitalWrite(pin_dot, HIGH);
    }
    else {
      digitalWrite(pin_segmen[7], LOW);
      digitalWrite(pin_dot, LOW);
    } 
  }
  
  delayMicroseconds(100);
}
 
void refresh() {
  for (int i=0; i<4; i++) digitalWrite(pin_digit[i], LOW);
  for (int i=0; i<8; i++) digitalWrite(pin_segmen[i], HIGH);
}
 
 
 
 
cs


Step 4. 수행 결과 


               





댓글 3

MADE BY