캐릭터 알람 만들기

by 강종구 | 2017-07-06 15:23
rtc 무드등 아두이노 알람 캐릭보드

알람 시간을 설정하면 소리와 빛이 나는 캐릭터를 만들어 봅시다!


1. 준비물


캐릭보드, 아두이노 나노, 아두이노 나노 케이블, RTC, 네오픽셀, MP3모듈, 스피커, 스탠드, 캐릭터


2. 캐릭보드에 모듈 연결하기

1) RTC 연결하기

RTC 모듈은 리얼타임클락(Real Time Clock)모듈입니다. 이 모듈은 년도, 월, 일, 시, 분, 초, 요일에 대한 시간을 설정하고 실시간으로 데이터를 불러올 수 있게 도와줍니다. 이를 사용하기 위해서는 RTC 라이브러리를 다운 받아야하고 별도의 시간관련 헤더파일들이 필요합니다.

2) 네오픽셀 연결하기


아래와 관련된 라이브러리, 모듈 작동 등은 LED 컬러변경하기 프로젝트를 참고하시기 바랍니다.

3) mp3 모듈 및 스피커 연결하기


아래와 관련된 라이브러리, 모듈 작동 등은 mp3 무드등 만들기 프로젝트를 참고하시기 바랍니다.


4) 실제 연결한 모듈의 모습



3. 소스 코드


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
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <DFPlayer_Mini_Mp3.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
SoftwareSerial mp3Serial(1213);
 
#define neopixelPIN    6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, neopixelPIN, NEO_GRB + NEO_KHZ800);
 
int red;
int green;
int blue;
 
String inputString = "";
boolean stringComplete = false;
boolean stringYear = false;
String input_year = "";
String input_month = "";
String input_day = "";
String input_hour = "";
String input_min = "";
 
int year_int = 0;
int month_int = 0;
int day_int = 0;
int hour_int = 0;
int min_int = 0;
 
tmElements_t tm;
 
void setup() {
  Serial.begin(9600);
  strip.begin();
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);
  delay(1);
  mp3_set_volume (15);
}
void rainbow() {
  uint16_t i, j, k;
  for(k=0; k<5; k++){
    for(j=0; j<256; j++){ 
      for(i=0; i< 5; i++){
        strip.setPixelColor(i, rainbowcolor(((i * 256 / 5+ j*k) & 255));
      }
      strip.show();
      delay(10);
    }
  }
}
 
uint32_t rainbowcolor(byte Pos) {
  if(Pos < 85) {
   return strip.Color(Pos * 3255 - Pos * 30);
  } else if(Pos < 170) {
   Pos -= 85;
   return strip.Color(255 - Pos * 30, Pos * 3);
  } else {
   Pos -= 170;
   return strip.Color(0, Pos * 3255 - Pos * 3);
  }
}
 
void lightChase(uint32_t c) 
{
  for (int j=0; j<50; j++) {
    for (int q=0; q < 3; q++) {
      for (int i=0; i < 5; i=i+3) {
        strip.setPixelColor(i+q, c);   
      }
      
      strip.show();
      delay(10);
 
      for (int i=0; i < 5; i=i+3) {
        strip.setPixelColor(i+q, 0);   
      }
    }
  }
}
  void randcolor()
{
  red = random(256);
  green = random(256);
  blue = random(256);
void loop() {
 
  if (Serial.available() > 0) {
    inputString = Serial.readString();
    if (inputString.charAt(0== 'a') {
      Serial.println("Time Setting");
      timeConverter();
    }
  }
 
  if (RTC.read(tm)) {
    //시간 출력하기 (시리얼창)
    Serial.print("computer : ");
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.print("/");
    Serial.print(tm.Month);
    Serial.print("/");
    Serial.print(tm.Day);
    Serial.print("  ");
    Serial.print(tm.Hour);
    Serial.print(":");
    Serial.print(tm.Minute);
    Serial.println();
    delay(500);
    //알람시간체크하기
    if (tmYearToCalendar(tm.Year) == year_int && tm.Month == month_int 
&& tm.Day == day_int && tm.Hour == hour_int && tm.Minute == min_int) {
      Serial.println("일어나세요!!");
      randcolor();
      lightChase(strip.Color(red, green, blue));
      for (int i = 0; i < 5; i++) { //불 켜기
        strip.setPixelColor(i, strip.Color(red, green, blue));
        strip.show();
      }
      mp3Serial.listen();
      if (mp3Serial.isListening()) { //소리켜기
        Serial.println("Play");
        mp3_play(1);
        delay (3000000);
        mp3_stop();
        mp3_play(2);
        delay (3000000);
        mp3_stop();
      }
    } 
    else if (tmYearToCalendar(tm.Year) == year_int && tm.Month == month_int 
&& tm.Day == day_int && tm.Hour == hour_int && tm.Minute == min_int-3 
|| tm.Minute == min_int-2 || tm.Minute == min_int-1) {
      Serial.println("알람이 곧 울립니다");
      rainbow();
      }
    
    else { //설정한 시간이 아닐 때, 불 끄기
      for (int i = 0; i < 5; i++) { //불 끄기
        strip.setPixelColor(i, strip.Color(000));
        strip.show();
      }
    }
  }
}
 
//Data Check---------------------------------------------------------------
void timeConverter() { //읽어온 데이터를 알람시간으로 바꾸기
  //serial input to char
  Serial.print("Set Alarm Time : ");
  input_year = inputString.substring(15);
  Serial.print(input_year);
  Serial.print("/");
  input_month = inputString.substring(57);
  Serial.print(input_month);
  Serial.print("/");
  input_day = inputString.substring(79);
  Serial.print(input_day);
  Serial.print("   ");
  input_hour = inputString.substring(911);
  Serial.print(input_hour);
  Serial.print(":");
  input_min = inputString.substring(1113);
  Serial.println(input_min);
  //to int
  year_int = input_year.toInt();
  month_int = input_month.toInt();
  day_int = input_day.toInt();
  hour_int = input_hour.toInt();
  min_int = input_min.toInt();
}
 
 
cs


위의 코드를 보시면, 세팅한 시간 3분전부터, rainbow()라는 함수를 호출해서 미리 LED 조명을 무드등에 켜줍니다. 이는 아래와 같은 코드를 삽입함으로 설정할 수 있습니다.

else if (tmYearToCalendar(tm.Year) == year_int && tm.Month == month_int 

&& tm.Day == day_int && tm.Hour == hour_int && tm.Minute == min_int-3 
|| tm.Minute == min_int-2 || tm.Minute == min_int-1)


그리고 알람을 설정한 시간이 되면, playlist에 있는 1번곡과 2번곡을 각각 300초씩 플레이하는 코드를 구성하였습니다. 또한 lightchase라는 함수를 통해, 다른 LED 조명을 무드등에 켜주었습니다.


이와 같이 자신의 새로운 코드를 통해, 다양한 무드등을 설정할 수 있습니다.

만약 조건을 더 넣어준다면, 한 때 유행했던 "2시!" 등과 같은 mp3를 정해진 시각에 틀어줄 수 있는 간단한 알람도 만들어 줄 수 있습니다.


입력받은 year_int, month_int, day_int ... 등과 같은 병수가 아니라, tm.year, tm.Month 등을 미리 정해진 시각에 설정해 놓는다면(ex, tm.Year == 2017 && tm.Month == 7 ... ) 따로 시리얼모니터로 알람시각을 입력하지 않더라도 정해진 시간에 알람을 on할 수 있을 것 같습니다.


4. 실제 알람의 작동 모습


1) 소스 업로드 및 시리얼 모니터 켜기



 2) 알람 시간 설정하기 ( 실제로는 a201707061459로 바꿔서 입력하였음)


3) 알람 3분전 출력


3) 알람 시작!


이로써 나만의 알람을 완성했습니다!!

댓글 0