17 | | |
18 | | |
19 | | * Mind_Wave.pde |
20 | | {{{ |
21 | | //////////////////////////////////////////////////////////////////////// |
22 | | // Arduino Bluetooth Interface with Mindwave |
23 | | // |
24 | | // This is example code provided by NeuroSky, Inc. and is provided |
25 | | // license free. |
26 | | //////////////////////////////////////////////////////////////////////// |
27 | | |
28 | | #define LED 13 |
29 | | #define BAUDRATE 115200 |
30 | | #define DEBUGOUTPUT 0 |
31 | | #define BLUESMIRFON 2 |
32 | | |
33 | | #define GREENLED1 3 |
34 | | #define GREENLED2 4 |
35 | | #define GREENLED3 5 |
36 | | #define YELLOWLED1 6 |
37 | | #define YELLOWLED2 7 |
38 | | #define YELLOWLED3 8 |
39 | | #define YELLOWLED4 9 |
40 | | #define REDLED1 10 |
41 | | #define REDLED2 11 |
42 | | #define REDLED3 12 |
43 | | |
44 | | // checksum variables |
45 | | byte generatedChecksum = 0; |
46 | | byte checksum = 0; |
47 | | int payloadLength = 0; |
48 | | byte payloadData[64] = { |
49 | | 0}; |
50 | | byte poorQuality = 0; |
51 | | byte attention = 0; |
52 | | byte meditation = 0; |
53 | | |
54 | | // system variables |
55 | | long lastReceivedPacket = 0; |
56 | | boolean bigPacket = false; |
57 | | |
58 | | ////////////////////////// |
59 | | // Microprocessor Setup // |
60 | | ////////////////////////// |
61 | | void setup() { |
62 | | |
63 | | pinMode(GREENLED1, OUTPUT); |
64 | | pinMode(GREENLED2, OUTPUT); |
65 | | pinMode(GREENLED3, OUTPUT); |
66 | | pinMode(YELLOWLED1, OUTPUT); |
67 | | pinMode(YELLOWLED2, OUTPUT); |
68 | | pinMode(YELLOWLED3, OUTPUT); |
69 | | pinMode(YELLOWLED4, OUTPUT); |
70 | | pinMode(REDLED1, OUTPUT); |
71 | | pinMode(REDLED2, OUTPUT); |
72 | | pinMode(REDLED3, OUTPUT); |
73 | | |
74 | | pinMode(LED, OUTPUT); |
75 | | pinMode(BLUESMIRFON, OUTPUT); |
76 | | digitalWrite(BLUESMIRFON, HIGH); |
77 | | Serial.begin(BAUDRATE); // USB |
78 | | |
79 | | delay(3000) ; |
80 | | Serial.print(194,BYTE) ; |
81 | | |
82 | | |
83 | | |
84 | | } |
85 | | |
86 | | //////////////////////////////// |
87 | | // Read data from Serial UART // |
88 | | //////////////////////////////// |
89 | | byte ReadOneByte() { |
90 | | int ByteRead; |
91 | | |
92 | | while(!Serial.available()); |
93 | | ByteRead = Serial.read(); |
94 | | |
95 | | #if DEBUGOUTPUT |
96 | | Serial.print((char)ByteRead); // echo the same byte out the USB serial (for debug purposes) |
97 | | #endif |
98 | | |
99 | | return ByteRead; |
100 | | } |
101 | | |
102 | | ///////////// |
103 | | //MAIN LOOP// |
104 | | ///////////// |
105 | | void loop() { |
106 | | |
107 | | |
108 | | // Look for sync bytes |
109 | | if(ReadOneByte() == 170) { |
110 | | if(ReadOneByte() == 170) { |
111 | | |
112 | | payloadLength = ReadOneByte(); |
113 | | if(payloadLength > 169) //Payload length can not be greater than 169 |
114 | | return; |
115 | | |
116 | | generatedChecksum = 0; |
117 | | for(int i = 0; i < payloadLength; i++) { |
118 | | payloadData[i] = ReadOneByte(); //Read payload into memory |
119 | | generatedChecksum += payloadData[i]; |
120 | | } |
121 | | |
122 | | checksum = ReadOneByte(); //Read checksum byte from stream |
123 | | generatedChecksum = 255 - generatedChecksum; //Take one's compliment of generated checksum |
124 | | |
125 | | if(checksum == generatedChecksum) { |
126 | | |
127 | | poorQuality = 200; |
128 | | attention = 0; |
129 | | meditation = 0; |
130 | | |
131 | | for(int i = 0; i < payloadLength; i++) { // Parse the payload |
132 | | switch (payloadData[i]) { |
133 | | case 2: |
134 | | i++; |
135 | | poorQuality = payloadData[i]; |
136 | | bigPacket = true; |
137 | | break; |
138 | | case 4: |
139 | | i++; |
140 | | attention = payloadData[i]; |
141 | | break; |
142 | | case 5: |
143 | | i++; |
144 | | meditation = payloadData[i]; |
145 | | break; |
146 | | case 0x80: |
147 | | i = i + 3; |
148 | | break; |
149 | | case 0x83: |
150 | | i = i + 25; |
151 | | break; |
152 | | default: |
153 | | break; |
154 | | } // switch |
155 | | } // for loop |
156 | | |
157 | | #if !DEBUGOUTPUT |
158 | | |
159 | | // *** Add your code here *** |
160 | | |
161 | | if(bigPacket) { |
162 | | if(poorQuality == 0) |
163 | | digitalWrite(LED, HIGH); |
164 | | else |
165 | | digitalWrite(LED, LOW); |
166 | | Serial.print("PoorQuality: "); |
167 | | Serial.print(poorQuality, DEC); |
168 | | Serial.print(" Attention: "); |
169 | | Serial.print(attention, DEC); |
170 | | if(attention > 40) |
171 | | digitalWrite(GREENLED1, HIGH); |
172 | | else |
173 | | digitalWrite(GREENLED1, LOW); |
174 | | |
175 | | Serial.print(" Time since last packet: "); |
176 | | Serial.print(millis() - lastReceivedPacket, DEC); |
177 | | lastReceivedPacket = millis(); |
178 | | Serial.print("\n"); |
179 | | |
180 | | switch(attention / 10) { |
181 | | case 0: |
182 | | digitalWrite(GREENLED1, HIGH); |
183 | | digitalWrite(GREENLED2, LOW); |
184 | | digitalWrite(GREENLED3, LOW); |
185 | | digitalWrite(YELLOWLED1, LOW); |
186 | | digitalWrite(YELLOWLED2, LOW); |
187 | | digitalWrite(YELLOWLED3, LOW); |
188 | | digitalWrite(YELLOWLED4, LOW); |
189 | | digitalWrite(REDLED1, LOW); |
190 | | digitalWrite(REDLED2, LOW); |
191 | | digitalWrite(REDLED3, LOW); |
192 | | break; |
193 | | case 1: |
194 | | digitalWrite(GREENLED1, HIGH); |
195 | | digitalWrite(GREENLED2, HIGH); |
196 | | digitalWrite(GREENLED3, LOW); |
197 | | digitalWrite(YELLOWLED1, LOW); |
198 | | digitalWrite(YELLOWLED2, LOW); |
199 | | digitalWrite(YELLOWLED3, LOW); |
200 | | digitalWrite(YELLOWLED4, LOW); |
201 | | digitalWrite(REDLED1, LOW); |
202 | | digitalWrite(REDLED2, LOW); |
203 | | digitalWrite(REDLED3, LOW); |
204 | | break; |
205 | | case 2: |
206 | | digitalWrite(GREENLED1, HIGH); |
207 | | digitalWrite(GREENLED2, HIGH); |
208 | | digitalWrite(GREENLED3, HIGH); |
209 | | digitalWrite(YELLOWLED1, LOW); |
210 | | digitalWrite(YELLOWLED2, LOW); |
211 | | digitalWrite(YELLOWLED3, LOW); |
212 | | digitalWrite(YELLOWLED4, LOW); |
213 | | digitalWrite(REDLED1, LOW); |
214 | | digitalWrite(REDLED2, LOW); |
215 | | digitalWrite(REDLED3, LOW); |
216 | | break; |
217 | | case 3: |
218 | | digitalWrite(GREENLED1, HIGH); |
219 | | digitalWrite(GREENLED2, HIGH); |
220 | | digitalWrite(GREENLED3, HIGH); |
221 | | digitalWrite(YELLOWLED1, HIGH); |
222 | | digitalWrite(YELLOWLED2, LOW); |
223 | | digitalWrite(YELLOWLED3, LOW); |
224 | | digitalWrite(YELLOWLED4, LOW); |
225 | | digitalWrite(REDLED1, LOW); |
226 | | digitalWrite(REDLED2, LOW); |
227 | | digitalWrite(REDLED3, LOW); |
228 | | break; |
229 | | case 4: |
230 | | digitalWrite(GREENLED1, HIGH); |
231 | | digitalWrite(GREENLED2, HIGH); |
232 | | digitalWrite(GREENLED3, HIGH); |
233 | | digitalWrite(YELLOWLED1, HIGH); |
234 | | digitalWrite(YELLOWLED2, HIGH); |
235 | | digitalWrite(YELLOWLED3, LOW); |
236 | | digitalWrite(YELLOWLED4, LOW); |
237 | | digitalWrite(REDLED1, LOW); |
238 | | digitalWrite(REDLED2, LOW); |
239 | | digitalWrite(REDLED3, LOW); |
240 | | break; |
241 | | case 5: |
242 | | digitalWrite(GREENLED1, HIGH); |
243 | | digitalWrite(GREENLED2, HIGH); |
244 | | digitalWrite(GREENLED3, HIGH); |
245 | | digitalWrite(YELLOWLED1, HIGH); |
246 | | digitalWrite(YELLOWLED2, HIGH); |
247 | | digitalWrite(YELLOWLED3, HIGH); |
248 | | digitalWrite(YELLOWLED4, LOW); |
249 | | digitalWrite(REDLED1, LOW); |
250 | | digitalWrite(REDLED2, LOW); |
251 | | digitalWrite(REDLED3, LOW); |
252 | | break; |
253 | | case 6: |
254 | | digitalWrite(GREENLED1, HIGH); |
255 | | digitalWrite(GREENLED2, HIGH); |
256 | | digitalWrite(GREENLED3, HIGH); |
257 | | digitalWrite(YELLOWLED1, HIGH); |
258 | | digitalWrite(YELLOWLED2, HIGH); |
259 | | digitalWrite(YELLOWLED3, HIGH); |
260 | | digitalWrite(YELLOWLED4, HIGH); |
261 | | digitalWrite(REDLED1, LOW); |
262 | | digitalWrite(REDLED2, LOW); |
263 | | digitalWrite(REDLED3, LOW); |
264 | | break; |
265 | | case 7: |
266 | | digitalWrite(GREENLED1, HIGH); |
267 | | digitalWrite(GREENLED2, HIGH); |
268 | | digitalWrite(GREENLED3, HIGH); |
269 | | digitalWrite(YELLOWLED1, HIGH); |
270 | | digitalWrite(YELLOWLED2, HIGH); |
271 | | digitalWrite(YELLOWLED3, HIGH); |
272 | | digitalWrite(YELLOWLED4, HIGH); |
273 | | digitalWrite(REDLED1, HIGH); |
274 | | digitalWrite(REDLED2, LOW); |
275 | | digitalWrite(REDLED3, LOW); |
276 | | break; |
277 | | case 8: |
278 | | digitalWrite(GREENLED1, HIGH); |
279 | | digitalWrite(GREENLED2, HIGH); |
280 | | digitalWrite(GREENLED3, HIGH); |
281 | | digitalWrite(YELLOWLED1, HIGH); |
282 | | digitalWrite(YELLOWLED2, HIGH); |
283 | | digitalWrite(YELLOWLED3, HIGH); |
284 | | digitalWrite(YELLOWLED4, HIGH); |
285 | | digitalWrite(REDLED1, HIGH); |
286 | | digitalWrite(REDLED2, HIGH); |
287 | | digitalWrite(REDLED3, LOW); |
288 | | break; |
289 | | case 9: |
290 | | digitalWrite(GREENLED1, HIGH); |
291 | | digitalWrite(GREENLED2, HIGH); |
292 | | digitalWrite(GREENLED3, HIGH); |
293 | | digitalWrite(YELLOWLED1, HIGH); |
294 | | digitalWrite(YELLOWLED2, HIGH); |
295 | | digitalWrite(YELLOWLED3, HIGH); |
296 | | digitalWrite(YELLOWLED4, HIGH); |
297 | | digitalWrite(REDLED1, HIGH); |
298 | | digitalWrite(REDLED2, HIGH); |
299 | | digitalWrite(REDLED3, HIGH); |
300 | | break; |
301 | | case 10: |
302 | | digitalWrite(GREENLED1, HIGH); |
303 | | digitalWrite(GREENLED2, HIGH); |
304 | | digitalWrite(GREENLED3, HIGH); |
305 | | digitalWrite(YELLOWLED1, HIGH); |
306 | | digitalWrite(YELLOWLED2, HIGH); |
307 | | digitalWrite(YELLOWLED3, HIGH); |
308 | | digitalWrite(YELLOWLED4, HIGH); |
309 | | digitalWrite(REDLED1, HIGH); |
310 | | digitalWrite(REDLED2, HIGH); |
311 | | digitalWrite(REDLED3, HIGH); |
312 | | break; |
313 | | } |
314 | | } |
315 | | #endif |
316 | | bigPacket = false; |
317 | | } |
318 | | else { |
319 | | // Checksum Error |
320 | | } // end if else for checksum |
321 | | } // end if read 0xAA byte |
322 | | } // end if read 0xAA byte |
323 | | } |
324 | | }}} |