스마트폰 앱으로 캐릭터 간 대화하기

by 김도현 | 2017-07-04 14:14
아두이노

재료

  • 캐릭보드 더블박스 1개

매뉴얼의 마지막 단계입니다.



1. 코드 업로드

-Master

하이라이트 된 18번 줄에 auth 코드를 넣어주세요.

(코드가 무엇인지 기억이 안나면 게시글 참조 : http://makewith.co/page/project/1080/story/2693/)

만약 음악이 6개라면 120-145번째 줄을 삭제해주세요.

저는 SD카드에 음악을 8개를 담았습니다.

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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#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);
  } else if (i == 7) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(255100100));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(7);
      delay (5000);
      mp3_stop();
    }
    sendIR(0x10);
  } else if (i == 8) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(10050255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("play");
      mp3_play(8);
      delay (5000);
      mp3_stop();
    }
    sendIR(0x11);
  }
  
  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 (5);
}
cs


그리고 지난 번처럼 Blynk앱을 켜서 작성한 프로젝트와 블루투스 연결을 해줍니다.



-SmartSlave

141번 줄 부터 173번 줄 까지는 음악이 6개라면 삭제요망!

이왕이면 이 게시글의 순서대로 Master를 먼저 업로드하시길 권장합니다. 왜냐하면 우리는 Slave가 제대로 적외선 신호를 받았는지 확인해야 하기 때문이죠.

그래서 Slave 업로드 후 시리얼 창을 통해 시그널을 확인합니다.

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
#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 (15);
  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();
    }
  }
 
 
  else if (receiveIR(0x10== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(255100100));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(7);
      delay (4000);
      mp3_stop();
    }
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  } else if (receiveIR(0x11== true) {
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(10050255));
      strip.show();
    }
    mp3Serial.listen();
    if (mp3Serial.isListening()) {
      Serial.println("Play");
      mp3_play(8);
      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.print("results.value = ");
    Serial.println(results.value);
    Serial.print("hex = ");
    Serial.println(hex);
    if (results.value == hex) {
      Serial.println("Hello");
      checkIR = true;
    }
    irrecv.resume();
  }
  delay(30);
  return checkIR;
}
cs



2. 실행하기

준비 되었다면 신호를 확인해봅니다.

여러번 시행착오를 겪으니 드디어 미니언이 말을 듣는군요.

수신기의 신호가 송신기가 받은 신호와 다른 오차의 원인으로는 공기의 저항과 거리 때문에 발생하는 신호의 오차가 아닌가 추측하고 있습니다.



저는 음악 볼륨이 큰 것 같아서 줄여놓았습니다.

귀를 잘 기울이면 브라운이 미니언 쏭을 부르자 미니언이 따라 부르는 것을 확인할 수 있습니다.





이전 글 > http://makewith.co/page/project/1080/story/2700/

댓글 0

MADE BY

김도현

프로그래밍
스마트폰 앱으로 캐릭터 간 대화하기현재글 대화하는 캐릭터들 이전글