대망의 스마트한 무드등 만들기 프로젝트 마지막 스토리입니다! (짝짝짝~)

종종 학부 2학년때 했던 컴퓨터공학실험2 과목을 떠오르게 하는 노가다의 순간들이 눈앞으로 지나가는 때가 있었지만.. 뿌듯한 마음으로 마지막 스토리를 이어나가 보겠습니다.


준비물

캐릭보드, 아두이노 나노, 아두이노 나노 케이블, 블루투스모듈, RTC, 빛센서,네오픽셀, MP3모듈, 스피커, 적외선 센서(수신/발신), 스탠드, 캐릭터 


0. 두 캐릭보드에 모듈을 연결해주세요.


매뉴얼의 블루투스 이름 바꾸기 코드는 아무것도 바뀌지 않으므로 생략하도록 하겠습니다.


1. 아두이노에서 소스코드 업로드하기

바로 소스코드를 업로드해보겠습니다.

1) Master

18번째 줄에는 자신의 Auth code를 넣어줍니다.

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
182
183
184
185
186
187
188
189
190
191
192
193
194
#define BLYNK_PRINT Serial
#define PIN 6
#include <BlynkSimpleSerialBLE.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
SoftwareSerial mp3Serial(1213);
SoftwareSerial SerialBLE(78); // RX, TX
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
WidgetLCD lcd(V5);
 
char auth[] = "********************************";
 
//IR Send
IRsend irsend;
 
//IR
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
boolean checkIR = false;
 
int red;
int green;
int blue;
 
BLYNK_WRITE(V4)
{
  int i = param.asInt();
  String num = param.asStr();
  Serial.println(i);
  lcd.clear(); //Use it to clear the LCD Widget
  lcd.print(40"Sound play");
  lcd.print(31"Track Num ");
  lcd.print(131, i);
  if ( i == 1) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(25500));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(1);
      delay (10000);
      mp3_stop();
    }
    sendIR(0xa);
  } else if (i == 2) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(02550));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(2);
      delay (5000);
      mp3_stop();
    }
    sendIR(0xb);
  } else if (i == 3) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(00255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(3);
      delay (5000);
      mp3_stop();
    }
    sendIR(0xc);
  } else if (i == 4) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(2552550));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(4);
      delay (7000);
      mp3_stop();
    }
    sendIR(0xd);
  } else if (i == 5) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(2550255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(5);
      delay (5000);
      mp3_stop();
    }
    sendIR(0xe);
  } else if (i == 6) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(255255255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(6);
      delay (5000);
      mp3_stop();
    }
    sendIR(0xf);
  }
  for (int i = 0; i < 5; i++) {
    strip.setPixelColor(i, strip.Color(000));
    strip.show();
  }
  lcd.clear();
  lcd.print(20"Select Track");
}
 
 
BLYNK_WRITE(V2)
{
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.println("Color is: ");
  red = param[0].asInt();
  green = param[1].asInt();
  blue = param[2].asInt();
 
  Serial.print("red : ");
  Serial.println(red);
  Serial.print("green : ");
  Serial.println(green);
  Serial.print("blue : ");
  Serial.println(blue);
 
  for (int i = 0; i < 5; i++) {
    strip.setPixelColor(i, strip.Color(red, green, blue));
    strip.show();
  }
}
 
void setup()
{
  initialize();
  mp3Init();
  red = 255;
  green = 255;
  blue = 0;
}
 
void loop()
{
  SerialBLE.listen();
  Blynk.run();
}
 
 
void sendIR(int hex) {
  for (int i = 0 ; i < 3; i++) {
    irsend.sendSony(hex, 20);
    delay(100);
  }
  delay(500);
  Serial.println("IR has been sent");
  Serial.println(hex, HEX);
  irrecv.enableIRIn();
}
 
void initialize() {
  Serial.begin(9600);
  SerialBLE.begin(9600);
  Blynk.begin(SerialBLE, auth);
  strip.begin();
  lcd.clear(); //Use it to clear the LCD Widget
  lcd.print(60"Hello");
}
 
void mp3Init() {
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);
  delay(1);
  mp3_set_volume (15);
}
cs



2) Slave

Port를 Slave 캐릭보드의 포트로 변경 후 업로드합니다.

저는 Slave의 port가 COM7이어서 다음과 같이 변경했습니다.


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
#define PIN 6
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
SoftwareSerial mp3Serial(1213);
SoftwareSerial btSerial(78);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
 
int red;
int green;
int blue;
 
//IR
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
boolean checkIR = false;
 
void setup() {
  Serial.begin(9600);
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);
  delay(1);
  mp3_set_volume (5);
  irrecv.enableIRIn();
  strip.begin();
  red = 255;
  green = 255;
  blue = 0;
  for (int i = 0; i < 5; i++) {
    strip.setPixelColor(i, strip.Color(red, green, blue));
    strip.show();
  }
}
 
void loop() {
  if (receiveIR(0xa== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(25500));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(1);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  } else if (receiveIR(0xb== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(02550));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(2);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  } else if (receiveIR(0xc== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(00255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(3);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  } else if (receiveIR(0xd== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(2552550));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(4);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  } else if (receiveIR(0xe== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(2550255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(5);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  } else if (receiveIR(0xf== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(255255255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(6);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  }
}
 
boolean receiveIR(int hex) {
  checkIR = false;
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if (results.value == hex) {
      Serial.println("Hello");
      checkIR = true;
    }
    irrecv.resume();
  }
  delay(30);
  return checkIR;
}
cs



2. 앱으로 컨트롤하기

1) 블루투스 연결하기

blynk 앱을 켭니다.

BLE 버튼에서 Connent BLE device를 통해 Master 캐릭보드와 연결합니다.



우측 상단의 ▷버튼을 클릭한 후 LCD에 'Hello'가 나타나면 연결이 제대로 된 것 입니다.


2) Sound 선택하기

앱의 가장 밑에 있는 슬라이더로 사운드 트랙번호를 선택할 수 있습니다.

첫번째 화면처럼 LCD에 다음과 같이 재생되고 있는 Track Num을 볼 수 있습니다.

두번째 화면은 음악이 끝나고 새로운 음악을 선택할 수 있도록 'Select Track'메세지를 보여줍니다.



3. 캐릭보드에서 확인하기

그럼 이제 캐릭보드 Master가 노래를 하며 신호를 보내면 Slave는 신호를 받아 빨간 빛으로 바뀝니다.



이것으로 나만의 스마트한 무드등 만들기 프로젝트가 끝이 났습니다.

아듀이노는 한 번도 접해보지 못했는데 많이 친해진 느낌이 드는군요.

다음번에는 무엇을 해볼까요?



댓글 0

MADE BY