Myo armband 를 이용한 안전지킴이

by 하민정 | 2017-01-23 15:19
안전 안전지킴이 웨어러블디바이스 위험

재료

  • Adafruit Flora GPS 모듈 1개
  • 머슬 센서 1개
  • NXP FRDM 보드 1개

                               


최근 불미스러운 사건, 사고들이 많아지면서 

밤길은 물론이고 평소에도 자신을 지키는 안전 지킴이가 필요해 지고 있습니다. 


웨어러블 시대에서 다른 것 보다 사람들의 안전을 지킬 수 있는 웨어러블 디바이스가

필요하다 생각합니다. 이와 관련한 프로젝트는 Hackster 에서 발견하여 소개하고자 합니다. 


이 프로젝트에서 웨어러블 디바이스 Myo Armband 는 성희롱 혹은 생명의 위협을 느끼는 상황에서

피해자들의 안전을 기존의 방법에서 보다 더 빠르게 주변에 알리는 기능을 합니다. 


사용자의 Id 는 GSM / GPRS 를 사용한 FRDM K82F 의 도움으로 IoT 허브로 전달 되게 됩니다. 

머신 러닝을 사용하여, 그 지역에 있는 스마트 밴드 어플 유저 들은 이 알람을 모두 받게 됩니다. 

게다가 이 알람은 근처에 있는 경찰서와 유저의 가족들 에게로 전달이 됩니다. 


이런 상황이 아니더라도, 안전이 위협당하는 상황 속에서 사용자들은 이 어플리케이션을 

이용할 수 있습니다. 


Step 1. 준비물 


- NXP FRDM 보드 

- Adafruit Flora GPS 모듈 

- 머슬 센서 


Step 2. 준비물 


 설계도 




피해자가 Myo Armband 를 이용해 GSM/GPS/Wifi 가 연결된  FRDM K82F 보드로 

신호를 보낸다면, 이 보드에 의해 사용자의 정보들이 IoT 허브로 송신 됩니다. 

이에 따라 위협적인 상황에서 자신의 지인 그리고 근처에 있는 사람들에게 빠른 방법으로 

도움을 요청할 수 있습니다. 


 소프트웨어 연결방법 


1
2
3
4
5
6
//Header file for Myo ARM Band
#include <MyoController.h> 
#include <Wire.h>
// Include LinkIt ONE GSM and GPS library
#include <LGSM.h>                               
#include <LGPS.h>
cs


▶ Myo Armband 사용을 위해 다음과 같은 라이브러리를 참조합니다. 

< MyoController.h > < Wire.h > 

Linkit One 의 GSM 과 GPS 라이브러리를 참조하기 위해 다음을 코드에서 추가합니다. 

< LGSM.h > < LGPS.h > 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Myo pin configuration
#define FIST_PIN 4
#define WAVEIN_PIN 13
#define WAVEOUT_PIN 6
#define FINGERSSPREAD_PIN 7
#define DOUBLETAP_PIN 8
//Cloud part header files
#include <LGPRS.h>
#include <LGPRSClient.h>
#include <LGPRSServer.h>
#include <LGPS.h>
#include <HttpClient.h>
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>
#include <LDateTime.h>
//Defining WiFi Access Point name and Password
#define WIFI_AP "Devaki"
#define WIFI_PASSWORD "devakipandari&10"
#define WIFI_AUTH LWIFI_WPA  
cs


▶ 클라우드 안에서 정보의 전달을 가능하게 하기 위해 다음과 같은 라이브러리를 참조합니다. 

< LGPRS.h >< LGPRSClient.h > < LGPS.h > < HttpClient.h > < LTask.h > < LWiFi.h > 

< LWiFiClient.h > < LDateTime.h > 


1
2
3
4
//Defining WiFi Access Point name and Password
#define WIFI_AP "Devaki"
#define WIFI_PASSWORD "devakipandari&10"
#define WIFI_AUTH LWIFI_WPA  
cs


▶ Wifi 연결을 위해 다음과 같이 이름과 패스워드를 설정해 줍니다. 

Linkit One 을 클라우드에 연결하기 위해 DEVICEID, DEVICEKEY, SITE_URL 을 정의해 줍니다. 


MyoController.h 에 있는 MyoController ( ) 라는 내부 함수를 myo 를 제어하는 초기값으로 

설정해 줍니다. 


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
void parseGPGGA1(const char* GPGGAstr) 
{
  double latitude;
  double longitude;
  double dilution, alt, hg;
  int tmp, hour, minute, second;
//Starting of GPS data  
if (GPGGAstr[0] == '$') 
  {
    tmp = getComma1(1, GPGGAstr);
    hour     = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0');
    minute   = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0');
    second    = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0');
    sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second);
    tmp = getComma1(2, GPGGAstr);
    latitude = getDoubleNumber1(&GPGGAstr[tmp]);
    tmp = getComma1(4, GPGGAstr);
    longitude = getDoubleNumber1(&GPGGAstr[tmp]);
    int latdeg = latitude / 100;
    int londeg = longitude / 100;
    double latmin = latitude - (((double)latdeg) * 100);
    double lonmin = longitude - (((double)londeg) * 100);
    tmp = getComma1(7, GPGGAstr);
    num = getIntNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "satellites number = %d ", num);
    sprintf(buff, "Lat=%dd %5.4fm", latdeg, latmin);
    sprintf(buff, "Lon=%dd %5.4fm", londeg, lonmin);
    tmp = getComma1(8, GPGGAstr);
    dilution = getDoubleNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "Horizontal dilution = %10.4f ", dilution);
    tmp = getComma1(9, GPGGAstr);
    alt = getDoubleNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "Altitude (meters) = %10.4f ", alt);
    tmp = getComma1(11, GPGGAstr);
    hg = getDoubleNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "Height from mean sea level (geoid) = %10.4f", hg);
    if (millis() - change > t) 
    {
      if (main) 
      {
        sprintf(buff, "Lat: %dd %5.4fm", latdeg, latmin);
        sprintf(buff, "Lon: %dd %5.4fm", londeg, lonmin);
        t = 3000;
        scrno++;
        if (scrno > 2) 
        {
          scrno = 1;
        }
        main = false;
      }
      else 
      {
        switch (scrno) 
        {
          case 1:
            sprintf(buff, "Satellites: %d", num);
            sprintf(buff, "H Dilution: %2.3f", dilution);
            break;
          case 2:
            sprintf(buff, "Altitude: %5.4f", alt);
            sprintf(buff, "UTC: %2d-%2d-%2d", hour, minute, second);
            break;
        }
        t = 1000;
        main = true;
      }
      change = millis();
    }
  }
}
cs


▶ parseGPGGA1 ( ) 라는 함수를 통해 GPS 데이터를 입력받아 IoT 허브로 전송할 데이터의 형태로 

만들어 줍니다. 


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
void setup() 
{
//Declaration of input and output
pinMode(FIST_PIN, OUTPUT);
pinMode(WAVEIN_PIN, OUTPUT);
pinMode(WAVEOUT_PIN, OUTPUT);
pinMode(FINGERSSPREAD_PIN, OUTPUT);
pinMode(DOUBLETAP_PIN, OUTPUT);
//Myo Initialisation
myo.initMyo();
//Enabling GPS  
LGPS.powerOn();
delay(3000);
while (!LSMS.ready())                 
// Wait for the sim to initialize
{
        delay(1000);                        // Wait for a second and then try again
      }
         // Saves the number where user wants to send SMS
LSMS.beginSMS("9789021906");          
 //Cloud part coding
          pinMode(13, OUTPUT);
LTask.begin();
LWiFi.begin();
AP_connect();
getconnectInfo();
connectTCP();
}
cs


▶ 입력과 출력을 설정해 줍니다. 이때 연결한 myo 를 초기화 시킵니다. 

LGPS.powerOn ( ) 를 통해 GPS 가 연결되도록 설정해 줍니다. 


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
void loop()
{
//Enabling LED according to Hand Gestures
myo.updatePose();
       switch ( myo.getCurrentPose() ) 
{
            case rest:
                  digitalWrite(FIST_PIN,LOW); 
                  digitalWrite(WAVEIN_PIN,LOW);
digitalWrite(WAVEOUT_PIN,LOW);
                  digitalWrite(FINGERSSPREAD_PIN,LOW);
                  digitalWrite(DOUBLETAP_PIN,LOW);
                  break;
case fist:
                  digitalWrite(FIST_PIN,HIGH);
                  break;
            case waveIn:
                  digitalWrite(WAVEIN_PIN,HIGH);
                  LGPS.getData(&info);
                  parseGPGGA1((const char*)info.GPGGA);
                  delay(2000);
                  message = (char*)info.GPGGA;
                  LSMS.print(message);                  
// Prepare message variable to be sent by LSMS
                  LSMS.endSMS();
                  break;
            case waveOut:
                  digitalWrite(WAVEOUT_PIN,HIGH);
                  break;
            case fingersSpread:
                  digitalWrite(FINGERSSPREAD_PIN,HIGH);
                  break;
            case doubleTap:
                  digitalWrite(DOUBLETAP_PIN,HIGH);
                  break;
       }
     //Cloud part coding
      String tcpcmd="";
      while (c.available())
       {
              int v = c.read();
              if (v != -1)
              {
                Serial.print((char)v);
                tcpcmd += (char)v;
                if (tcpcmd.substring(40).equals(tcpcmd_led_on))
{
                      digitalWrite(10, HIGH);
                      Serial.print("Switch LED ON ");
                      tcpcmd="";
                }
else if(tcpcmd.substring(40).equals(tcpcmd_led_off))
{  
                      digitalWrite(10, LOW);
                      Serial.print("Switch LED OFF");
                      tcpcmd="";
                }
              }
       }
      LDateTime.getRtc(&rtc);
      if ((rtc - lrtc) >= per) 
{
        heartBeat();
        lrtc = rtc;
      }
      //Check for report datapoint status interval
      LDateTime.getRtc(&rtc1);
      if ((rtc1 - lrtc1) >= per1)     
{
        uploadstatus();
        GPS_receive();
        uploadGPS();
        lrtc1 = rtc1;
      }
       delay(100); 
}
cs


▶ < MyController.h > 에 있는 updatePose ( ) 라는 내부 함수를 이용해 

계속해서 어떠한 움직임 상태인지를 머슬 센서에 의해 감지할 수 있도록 해 주었습니다. 


LED 가 손의 움직임에 따라 동작하도록 switch (  )문을 이용해 줍니다. 

getCurrentPose( ) 라는 센서에 의해 감지된 상태가 rest, first, waveIn, waveOut, fingerSpread, 

doubleTap 의 경우에 따라 나누어 작동하도록 만들었습니다. 


rest 의 경우, 아무일이 없는 상태로 각 출력을 모두 LOW 로 하여 아무런 동작이 일어나지 않도록 

하였습니다. 이외의 나머지 상태의 경우 ( first, waveIn, waveOut, fingerSpread, doubleTap ) 

에 대해선 어떠한 변화가 감지된 것으로 각각의 경우 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
void uploadGPS(){
  while (!c2.connect(SITE_URL, 80))
  {
    Serial.print(".");
    delay(500);
  }
    delay(100);
  float latitude_post=latitude;
  float longitude_post=longitude;
  Serial.printf("latitude=%.4f\tlongitude=%.4f\n",latitude,longitude);
  if(latitude>-90 && latitude<=90 && longitude>=0 && longitude<360){
    sprintf(buffer_latitude, "%.4f", latitude);
    sprintf(buffer_longitude, "%.4f", longitude);
  }
  String upload_GPS = "GPS,,"+String(buffer_latitude)+","+String(buffer_longitude)+","+"0"+"\n"+"LATITUDE,,"+buffer_latitude+"\n"+"LONGITUDE,,"+buffer_longitude;//null altitude
  int GPS_length = upload_GPS.length();
  HttpClient http(c2);
  c2.print("POST /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/datapoints.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.print("Content-Length: ");
  c2.println(GPS_length);
  c2.println("Content-Type: text/csv");
  c2.println("Connection: close");
  c2.println();
  c2.println(upload_GPS);
  delay(500);
  int errorcount = 0;
  while (!c2.available()) 
{
    Serial.print(".");
    delay(100);
  }
  int err = http.skipResponseHeaders();
  int bodyLen = http.contentLength();
  while (c2)  
{
    int v = c2.read();
    if (v != -1)
{
      Serial.print(char(v));
    }
    else
{
      Serial.println("no more content, disconnect");
      c2.stop();
    }
   }
  Serial.println();
cs


▶ uploadGPS ( ) 함수를 통해 이전에 파싱해 놓았던 GPS 정보를 IoT 허브에 업로드 하여, 

다른 유저들과 경찰서에 정보가 전달되도록 만들었습니다. 


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


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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
//Header file for Myo ARM Band
#include <MyoController.h> 
#include <Wire.h>
// Include LinkIt ONE GSM and GPS library
#include <LGSM.h>                               
#include <LGPS.h>
//Myo pin configuration
#define FIST_PIN 4
#define WAVEIN_PIN 13
#define WAVEOUT_PIN 6
#define FINGERSSPREAD_PIN 7
#define DOUBLETAP_PIN 8
//Cloud part header files
#include <LGPRS.h>
#include <LGPRSClient.h>
#include <LGPRSServer.h>
#include <LGPS.h>
#include <HttpClient.h>
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>
#include <LDateTime.h>
//Defining WiFi Access Point name and Password
#define WIFI_AP "Devaki"
#define WIFI_PASSWORD "devakipandari&10"
#define WIFI_AUTH LWIFI_WPA  
// choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
//Connecting LinkIt ONE to cloud
#define per 50
#define per1 3
#define DEVICEID "Dps78GVy"
#define DEVICEKEY "C0nS81PKwm0F0uxN"
#define SITE_URL "api.mediatek.com"
//Myo Controller Function
MyoController myo = MyoController();
gpsSentenceInfoStruct info;
char buff[256];
int num;
unsigned long t = 3000;
unsigned long change;
byte scrno;
boolean main = true;
//GPS declarations
double latitude;
double longitude;
char buffer_latitude[8];
char buffer_longitude[8];
LGPRSClient c;
unsigned int rtc;
unsigned int lrtc;
unsigned int rtc1;
unsigned int lrtc1;
char port[4]={0};
char connection_info[21]={0};
char ip[15]={0};             
int portnum;
int val = 0;
//Connecting external devices to cloud
String tcpdata = String(DEVICEID) + "," + String(DEVICEKEY) + ",0";
String tcpcmd_led_on = "LED_CONTROL,1";
String tcpcmd_led_off = "LED_CONTROL,0";
String upload_led;
LGPRSClient c2;
HttpClient http(c2);
//GPS location tracking data
static unsigned char getComma1(unsigned char num, const char *str) 
{
  unsigned char i, j = 0;
  int len = strlen(str);
  for (i = 0; i < len; i ++)
  {
    if (str[i] == ',')
      j++;
    if (j == num)
      return i + 1;
  }
  return 0;
}
static double getDoubleNumber1(const char *s) 
{
  char buf[10];
  unsigned char i;
  double rev;
  i = getComma1(1, s);
  i = i - 1;
  strncpy(buf, s, i);
  buf[i] = 0;
  rev = atof(buf);
  return rev;
}
static double getIntNumber1(const char *s) 
{
  char buf[10];
  unsigned char i;
  double rev;
  i = getComma1(1, s);
  i = i - 1;
  strncpy(buf, s, i);
  buf[i] = 0;
  rev = atoi(buf);
  return rev;
}
void parseGPGGA1(const char* GPGGAstr) 
{
  double latitude;
  double longitude;
  double dilution, alt, hg;
  int tmp, hour, minute, second;
//Starting of GPS data  
if (GPGGAstr[0] == '$') 
  {
    tmp = getComma1(1, GPGGAstr);
    hour     = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0');
    minute   = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0');
    second    = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0');
    sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second);
    tmp = getComma1(2, GPGGAstr);
    latitude = getDoubleNumber1(&GPGGAstr[tmp]);
    tmp = getComma1(4, GPGGAstr);
    longitude = getDoubleNumber1(&GPGGAstr[tmp]);
    int latdeg = latitude / 100;
    int londeg = longitude / 100;
    double latmin = latitude - (((double)latdeg) * 100);
    double lonmin = longitude - (((double)londeg) * 100);
    tmp = getComma1(7, GPGGAstr);
    num = getIntNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "satellites number = %d ", num);
    sprintf(buff, "Lat=%dd %5.4fm", latdeg, latmin);
    sprintf(buff, "Lon=%dd %5.4fm", londeg, lonmin);
    tmp = getComma1(8, GPGGAstr);
    dilution = getDoubleNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "Horizontal dilution = %10.4f ", dilution);
    tmp = getComma1(9, GPGGAstr);
    alt = getDoubleNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "Altitude (meters) = %10.4f ", alt);
    tmp = getComma1(11, GPGGAstr);
    hg = getDoubleNumber1(&GPGGAstr[tmp]);
    sprintf(buff, "Height from mean sea level (geoid) = %10.4f", hg);
    if (millis() - change > t) 
    {
      if (main) 
      {
        sprintf(buff, "Lat: %dd %5.4fm", latdeg, latmin);
        sprintf(buff, "Lon: %dd %5.4fm", londeg, lonmin);
        t = 3000;
        scrno++;
        if (scrno > 2) 
        {
          scrno = 1;
        }
        main = false;
      }
      else 
      {
        switch (scrno) 
        {
          case 1:
            sprintf(buff, "Satellites: %d", num);
            sprintf(buff, "H Dilution: %2.3f", dilution);
            break;
          case 2:
            sprintf(buff, "Altitude: %5.4f", alt);
            sprintf(buff, "UTC: %2d-%2d-%2d", hour, minute, second);
            break;
        }
        t = 1000;
        main = true;
      }
      change = millis();
    }
  }
}
String message;  
// Variable to store message to be sent
void setup() 
{
//Declaration of input and output
pinMode(FIST_PIN, OUTPUT);
pinMode(WAVEIN_PIN, OUTPUT);
pinMode(WAVEOUT_PIN, OUTPUT);
pinMode(FINGERSSPREAD_PIN, OUTPUT);
pinMode(DOUBLETAP_PIN, OUTPUT);
//Myo Initialisation
myo.initMyo();
//Enabling GPS  
LGPS.powerOn();
delay(3000);
while (!LSMS.ready())                 
// Wait for the sim to initialize
{
        delay(1000);                        // Wait for a second and then try again
      }
         // Saves the number where user wants to send SMS
LSMS.beginSMS("9789021906");          
 //Cloud part coding
          pinMode(13, OUTPUT);
LTask.begin();
LWiFi.begin();
AP_connect();
getconnectInfo();
connectTCP();
}
void loop()
{
//Enabling LED according to Hand Gestures
myo.updatePose();
       switch ( myo.getCurrentPose() ) 
{
            case rest:
                  digitalWrite(FIST_PIN,LOW); 
                  digitalWrite(WAVEIN_PIN,LOW);
digitalWrite(WAVEOUT_PIN,LOW);
                  digitalWrite(FINGERSSPREAD_PIN,LOW);
                  digitalWrite(DOUBLETAP_PIN,LOW);
                  break;
case fist:
                  digitalWrite(FIST_PIN,HIGH);
                  break;
            case waveIn:
                  digitalWrite(WAVEIN_PIN,HIGH);
                  LGPS.getData(&info);
                  parseGPGGA1((const char*)info.GPGGA);
                  delay(2000);
                  message = (char*)info.GPGGA;
                  LSMS.print(message);                  
// Prepare message variable to be sent by LSMS
                  LSMS.endSMS();
                  break;
            case waveOut:
                  digitalWrite(WAVEOUT_PIN,HIGH);
                  break;
            case fingersSpread:
                  digitalWrite(FINGERSSPREAD_PIN,HIGH);
                  break;
            case doubleTap:
                  digitalWrite(DOUBLETAP_PIN,HIGH);
                  break;
       }
     //Cloud part coding
      String tcpcmd="";
      while (c.available())
       {
              int v = c.read();
              if (v != -1)
              {
                Serial.print((char)v);
                tcpcmd += (char)v;
                if (tcpcmd.substring(40).equals(tcpcmd_led_on))
{
                      digitalWrite(10, HIGH);
                      Serial.print("Switch LED ON ");
                      tcpcmd="";
                }
else if(tcpcmd.substring(40).equals(tcpcmd_led_off))
{  
                      digitalWrite(10, LOW);
                      Serial.print("Switch LED OFF");
                      tcpcmd="";
                }
              }
       }
      LDateTime.getRtc(&rtc);
      if ((rtc - lrtc) >= per) 
{
        heartBeat();
        lrtc = rtc;
      }
      //Check for report datapoint status interval
      LDateTime.getRtc(&rtc1);
      if ((rtc1 - lrtc1) >= per1)     
{
        uploadstatus();
        GPS_receive();
        uploadGPS();
        lrtc1 = rtc1;
      }
       delay(100); 
}
//Cloud_GPS…
static unsigned char getComma(unsigned char num,const char *str)
{
unsigned char i,j = 0;
      int len=strlen(str);
      for(i = 0;i < len;i ++)
      {
         if(str[i] == ',')
          j++;
         if(j == num)
          return i + 1; 
      }
      return 0; 
}
static double getDoubleNumber(const char *s)
{
      char buf[10];
      unsigned char i;
      double rev;
       i=getComma(1, s);
      i = i - 1;
      strncpy(buf, s, i);
      buf[i] = 0;
      rev=atof(buf);
      return rev; 
}
static double getIntNumber(const char *s)
{
      char buf[10];
      unsigned char i;
      double rev;
        i=getComma(1, s);
      i = i - 1;
      strncpy(buf, s, i);
      buf[i] = 0;
      rev=atoi(buf);
      return rev; 
}
void parseGPGGA(const char* GPGGAstr)
{
  /* Refer to http://www.gpsinformation.org/dale/nmea.htm#GGA
   * Sample data: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
   * Where:
   *  GGA          Global Positioning System Fix Data
   *  123519       Fix taken at 12:35:19 UTC
   *  4807.038,N   Latitude 48 deg 07.038' N
   *  01131.000,E  Longitude 11 deg 31.000' E
   *  1            Fix quality: 0 = invalid
   *                            1 = GPS fix (SPS)
   *                            2 = DGPS fix
   *                            3 = PPS fix
   *                            4 = Real Time Kinematic
   *                            5 = Float RTK
   *                            6 = estimated (dead reckoning) (2.3 feature)
   *                            7 = Manual input mode
   *                            8 = Simulation mode
   *  08           Number of satellites being tracked
   *  0.9          Horizontal dilution of position
   *  545.4,M      Altitude, Meters, above mean sea level
   *  46.9,M       Height of geoid (mean sea level) above WGS84
   *                   ellipsoid
   *  (empty field) time in seconds since last DGPS update
   *  (empty field) DGPS station ID number
   *  *47          the checksum data, always begins with *
   */
  int tmp, hour, minute, second, num ;
  if(GPGGAstr[0] == '$')
  {
    tmp = getComma(1, GPGGAstr);
    hour     = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0');
    minute   = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0');
    second    = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0');
    sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second);
    //Serial.println(buff);
     tmp = getComma(2, GPGGAstr);
    latitude = getDoubleNumber(&GPGGAstr[tmp])/100.0;
    int latitude_int=floor(latitude);
    double latitude_decimal=(latitude-latitude_int)*100.0/60.0;
    latitude=latitude_int+latitude_decimal;
    tmp = getComma(4, GPGGAstr);
    longitude = getDoubleNumber(&GPGGAstr[tmp])/100.0;
    int longitude_int=floor(longitude);
    double longitude_decimal=(longitude-longitude_int)*100.0/60.0;
    longitude=longitude_int+longitude_decimal;
    sprintf(buff, "latitude = %10.4f, longitude = %10.4f", latitude, longitude);
    //Serial.println(buff); 
    tmp = getComma(7, GPGGAstr);
    num = getIntNumber(&GPGGAstr[tmp]);    
    sprintf(buff, "satellites number = %d", num);
    //Serial.println(buff); 
  }
 }
void GPS_receive() {
  LGPS.getData(&info);
  parseGPGGA((const char*)info.GPGGA);
}
//Cloud_connect
void AP_connect(){
  Serial.print("Connecting to AP...");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Success!");
   Serial.print("Connecting site...");
  while (!c2.connect(SITE_URL, 80))
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Success!");
  delay(100);
}
void getconnectInfo(){
  //Calling RESTful API to get TCP socket connection
  c2.print("GET /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/connections.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.println("Connection: close");
  c2.println();  
  delay(500);
  int errorcount = 0;
  Serial.print("waiting for HTTP response...");
  while (!c2.available())
  {
    Serial.print(".");
    errorcount += 1;
    delay(150);
  }
  Serial.println();
  int err = http.skipResponseHeaders();
  int bodyLen = http.contentLength();
  char c;
  int ipcount = 0;
  int count = 0;
  int separater = 0;
  while (c2)
  {
    int v = (int)c2.read();
    if (v != -1)
    {
      c = v;
      //Serial.print(c);
      connection_info[ipcount]=c;
      if(c==',')
      separater=ipcount;
      ipcount++;    
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();
    }
  }
  //connection_info[ipcount]=NULL;
  int i;
  for(i=0;i<separater;i++)
  {  ip[i]=connection_info[i];
  }
  int j=0;
  separater++;
  for(i=separater;i<21 && j<5 && i < ipcount;i++)
  {  port[j]=connection_info[i];
     j++;
  }
  //port[j] = NULL;
  portnum = atoi (port);
} //getconnectInfo
void connectTCP(){
  //Establish TCP connection with TCP Server with designate IP and Port
  c.stop();
  Serial.print("Connecting to TCP...");
  while (0 == c.connect(ip, portnum))
  {
    Serial.println("Re-Connecting to TCP");    
    delay(1000);
  }
  c.println(tcpdata);
  c.println();
  Serial.println("Success!");
} //connectTCP
void heartBeat(){
  Serial.println("send TCP heartBeat");
  c.println(tcpdata);
  c.println();    
} //heartbeat
//Cloud_upload
void uploadstatus(){
//calling RESTful API to upload datapoint to MCS to report LED status
  while (!c2.connect(SITE_URL, 80))
  {
    Serial.print(".");
    delay(500);
  }
  delay(100);
  if(digitalRead(13)==1)
    upload_led = "LED_DISPLAY,,1";
  else
    upload_led = "LED_DISPLAY,,0";
    int thislength = upload_led.length();
  HttpClient http(c2);
  c2.print("POST /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/datapoints.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.print("Content-Length: ");
  c2.println(thislength);
  c2.println("Content-Type: text/csv");
  c2.println("Connection: close");
  c2.println();
  c2.println(upload_led);
  delay(500);
  int errorcount = 0;
  while (!c2.available())
  {
    Serial.print(".");
    delay(100);
  }
  int err = http.skipResponseHeaders();
  int bodyLen = http.contentLength();
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      Serial.print(char(v));
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();
    }
 }
  Serial.println();
}
void uploadGPS(){
  while (!c2.connect(SITE_URL, 80))
  {
    Serial.print(".");
    delay(500);
  }
    delay(100);
  float latitude_post=latitude;
  float longitude_post=longitude;
  Serial.printf("latitude=%.4f\tlongitude=%.4f\n",latitude,longitude);
  if(latitude>-90 && latitude<=90 && longitude>=0 && longitude<360){
    sprintf(buffer_latitude, "%.4f", latitude);
    sprintf(buffer_longitude, "%.4f", longitude);
  }
  String upload_GPS = "GPS,,"+String(buffer_latitude)+","+String(buffer_longitude)+","+"0"+"\n"+"LATITUDE,,"+buffer_latitude+"\n"+"LONGITUDE,,"+buffer_longitude;//null altitude
  int GPS_length = upload_GPS.length();
  HttpClient http(c2);
  c2.print("POST /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/datapoints.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.print("Content-Length: ");
  c2.println(GPS_length);
  c2.println("Content-Type: text/csv");
  c2.println("Connection: close");
  c2.println();
  c2.println(upload_GPS);
  delay(500);
  int errorcount = 0;
  while (!c2.available()) 
{
    Serial.print(".");
    delay(100);
  }
  int err = http.skipResponseHeaders();
  int bodyLen = http.contentLength();
  while (c2)  
{
    int v = c2.read();
    if (v != -1)
{
      Serial.print(char(v));
    }
    else
{
      Serial.println("no more content, disconnect");
      c2.stop();
    }
   }
  Serial.println();
}
cs



댓글 0

MADE BY