Senses an earthquake with MPU6050 and gets time, coordenates and other details of the event with an Adafruit GPS. All the info is sent to an HTTP server

Dependencies:   MPU6050 mbed-http MBed_Adafruit-GPS-Library

Committer:
Alvaro13
Date:
Thu Aug 01 03:43:28 2019 +0000
Revision:
36:32a0a71555f0
Child:
37:fcb5efa391d5
First commit!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Alvaro13 36:32a0a71555f0 1
Alvaro13 36:32a0a71555f0 2 #include "mbed.h"
Alvaro13 36:32a0a71555f0 3 #include "MPU6050.h"
Alvaro13 36:32a0a71555f0 4 #include "REF_VALUES.h"
Alvaro13 36:32a0a71555f0 5 #include "CONSTANTS.h"
Alvaro13 36:32a0a71555f0 6 #include "FUNCTIONS.h"
Alvaro13 36:32a0a71555f0 7 #include "Timer.h"
Alvaro13 36:32a0a71555f0 8 #include "MBed_Adafruit_GPS.h"
Alvaro13 36:32a0a71555f0 9 #include "http_request.h"
Alvaro13 36:32a0a71555f0 10 #include "network-helper.h"
Alvaro13 36:32a0a71555f0 11 #include "mbed_mem_trace.h"
Alvaro13 36:32a0a71555f0 12
Alvaro13 36:32a0a71555f0 13 /**
Alvaro13 36:32a0a71555f0 14 * Debbuging led
Alvaro13 36:32a0a71555f0 15 */
Alvaro13 36:32a0a71555f0 16 DigitalOut myled(LED1);
Alvaro13 36:32a0a71555f0 17
Alvaro13 36:32a0a71555f0 18 /**
Alvaro13 36:32a0a71555f0 19 * Puerto serial
Alvaro13 36:32a0a71555f0 20 */
Alvaro13 36:32a0a71555f0 21 Serial pc(USBTX, USBRX, BAUD_RATE);
Alvaro13 36:32a0a71555f0 22
Alvaro13 36:32a0a71555f0 23 /**
Alvaro13 36:32a0a71555f0 24 * Puntero hacia el puerto serial utilizado para la comunicacion entre el GPS y el Micro
Alvaro13 36:32a0a71555f0 25 */
Alvaro13 36:32a0a71555f0 26 Serial * gps_Serial;
Alvaro13 36:32a0a71555f0 27
Alvaro13 36:32a0a71555f0 28 /**
Alvaro13 36:32a0a71555f0 29 * Objeto MPU6050
Alvaro13 36:32a0a71555f0 30 */
Alvaro13 36:32a0a71555f0 31 MPU6050 mpu(PF_15, PF_14);
Alvaro13 36:32a0a71555f0 32
Alvaro13 36:32a0a71555f0 33 /**
Alvaro13 36:32a0a71555f0 34 * Threads
Alvaro13 36:32a0a71555f0 35 */
Alvaro13 36:32a0a71555f0 36 Thread sampleAccelero;
Alvaro13 36:32a0a71555f0 37 Thread printDebug;
Alvaro13 36:32a0a71555f0 38 Thread sendAccelero;
Alvaro13 36:32a0a71555f0 39 Thread getCoordinates;
Alvaro13 36:32a0a71555f0 40
Alvaro13 36:32a0a71555f0 41 /**
Alvaro13 36:32a0a71555f0 42 * Mutex
Alvaro13 36:32a0a71555f0 43 */
Alvaro13 36:32a0a71555f0 44 Mutex semaforo;
Alvaro13 36:32a0a71555f0 45 Mutex globalVar;
Alvaro13 36:32a0a71555f0 46
Alvaro13 36:32a0a71555f0 47 /**
Alvaro13 36:32a0a71555f0 48 * Mailboxes
Alvaro13 36:32a0a71555f0 49 */
Alvaro13 36:32a0a71555f0 50 Mail<acceleration, 1> mail_box;
Alvaro13 36:32a0a71555f0 51 Mail<acceleration, 1> mail_meass;
Alvaro13 36:32a0a71555f0 52
Alvaro13 36:32a0a71555f0 53 /**
Alvaro13 36:32a0a71555f0 54 * Variables de control
Alvaro13 36:32a0a71555f0 55 */
Alvaro13 36:32a0a71555f0 56 bool earthquakeHappening = false;
Alvaro13 36:32a0a71555f0 57 bool beenHere = false;
Alvaro13 36:32a0a71555f0 58
Alvaro13 36:32a0a71555f0 59
Alvaro13 36:32a0a71555f0 60
Alvaro13 36:32a0a71555f0 61 /**
Alvaro13 36:32a0a71555f0 62 * Handler para la utilizacion del GPS
Alvaro13 36:32a0a71555f0 63 */
Alvaro13 36:32a0a71555f0 64 Adafruit_GPS myGPS(new Serial(PC_12, PD_2)); //object of Adafruit's GPS class
Alvaro13 36:32a0a71555f0 65
Alvaro13 36:32a0a71555f0 66 /**
Alvaro13 36:32a0a71555f0 67 * Codigo para el HTTP post
Alvaro13 36:32a0a71555f0 68 */
Alvaro13 36:32a0a71555f0 69 void dump_response(HttpResponse* res) {
Alvaro13 36:32a0a71555f0 70 printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
Alvaro13 36:32a0a71555f0 71
Alvaro13 36:32a0a71555f0 72 printf("Headers:\n");
Alvaro13 36:32a0a71555f0 73 for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
Alvaro13 36:32a0a71555f0 74 printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
Alvaro13 36:32a0a71555f0 75 }
Alvaro13 36:32a0a71555f0 76 printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str());
Alvaro13 36:32a0a71555f0 77 }
Alvaro13 36:32a0a71555f0 78
Alvaro13 36:32a0a71555f0 79 /**
Alvaro13 36:32a0a71555f0 80 * Imprime los resultados de la medicion del sismo
Alvaro13 36:32a0a71555f0 81 */
Alvaro13 36:32a0a71555f0 82 void print_debug(){
Alvaro13 36:32a0a71555f0 83 string tweet;
Alvaro13 36:32a0a71555f0 84 NetworkInterface* network = connect_to_default_network_interface();
Alvaro13 36:32a0a71555f0 85 if (!network) {
Alvaro13 36:32a0a71555f0 86 printf("Cannot connect to the network, see serial output\n");
Alvaro13 36:32a0a71555f0 87 return ;
Alvaro13 36:32a0a71555f0 88 }
Alvaro13 36:32a0a71555f0 89 // Create a TCP socket
Alvaro13 36:32a0a71555f0 90 printf("\n----- Setting up TCP connection -----\n");
Alvaro13 36:32a0a71555f0 91
Alvaro13 36:32a0a71555f0 92 TCPSocket* socket = new TCPSocket();
Alvaro13 36:32a0a71555f0 93 nsapi_error_t open_result = socket->open(network);
Alvaro13 36:32a0a71555f0 94 if (open_result != 0) {
Alvaro13 36:32a0a71555f0 95 printf("Opening TCPSocket failed... %d\n", open_result);
Alvaro13 36:32a0a71555f0 96 return ;
Alvaro13 36:32a0a71555f0 97 }
Alvaro13 36:32a0a71555f0 98
Alvaro13 36:32a0a71555f0 99 nsapi_error_t connect_result = socket->connect("10.60.16.220", 80);
Alvaro13 36:32a0a71555f0 100 if (connect_result != 0) {
Alvaro13 36:32a0a71555f0 101 printf("Connecting over TCPSocket failed... %d\n", connect_result);
Alvaro13 36:32a0a71555f0 102 return ;
Alvaro13 36:32a0a71555f0 103 }
Alvaro13 36:32a0a71555f0 104
Alvaro13 36:32a0a71555f0 105 printf("Connected over TCP to httpbin.org:80\n");
Alvaro13 36:32a0a71555f0 106 while(true){
Alvaro13 36:32a0a71555f0 107 wait(1);
Alvaro13 36:32a0a71555f0 108 osEvent evt = mail_meass.get();
Alvaro13 36:32a0a71555f0 109 if (evt.status == osEventMail) {
Alvaro13 36:32a0a71555f0 110 acceleration *mail = (acceleration*)evt.value.p;
Alvaro13 36:32a0a71555f0 111 if (mail->x == 0 && mail->y == 0){
Alvaro13 36:32a0a71555f0 112 mail_meass.free(mail);
Alvaro13 36:32a0a71555f0 113 continue;
Alvaro13 36:32a0a71555f0 114 }
Alvaro13 36:32a0a71555f0 115 tweet = compute_intensity(mail->x, mail->y);
Alvaro13 36:32a0a71555f0 116 semaforo.lock();
Alvaro13 36:32a0a71555f0 117 pc.printf("%s\n\r",tweet);
Alvaro13 36:32a0a71555f0 118 semaforo.unlock();
Alvaro13 36:32a0a71555f0 119 mail_meass.free(mail);
Alvaro13 36:32a0a71555f0 120 pc.printf("Time: %d:%d:%d.%u\r\n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
Alvaro13 36:32a0a71555f0 121 pc.printf("Date: %d/%d/20%d\r\n", myGPS.day, myGPS.month, myGPS.year);
Alvaro13 36:32a0a71555f0 122 pc.printf("Location: %f%c, %f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
Alvaro13 36:32a0a71555f0 123 pc.printf("Altitude: %f\r\n", myGPS.altitude);
Alvaro13 36:32a0a71555f0 124
Alvaro13 36:32a0a71555f0 125 // POST request to httpbin.org
Alvaro13 36:32a0a71555f0 126 HttpRequest* post_req = new HttpRequest(socket, HTTP_POST, "http://10.60.16.200");
Alvaro13 36:32a0a71555f0 127 post_req->set_header("Content-Type", "application/json");
Alvaro13 36:32a0a71555f0 128
Alvaro13 36:32a0a71555f0 129 const char body[] = "{\"hello\":\"world\"}";
Alvaro13 36:32a0a71555f0 130
Alvaro13 36:32a0a71555f0 131 HttpResponse* post_res = post_req->send(body, strlen(body));
Alvaro13 36:32a0a71555f0 132 if (!post_res) {
Alvaro13 36:32a0a71555f0 133 printf("HttpRequest failed (error code %d)\n", post_req->get_error());
Alvaro13 36:32a0a71555f0 134 return ;
Alvaro13 36:32a0a71555f0 135 }
Alvaro13 36:32a0a71555f0 136
Alvaro13 36:32a0a71555f0 137 printf("\n----- HTTP POST response -----\n");
Alvaro13 36:32a0a71555f0 138 dump_response(post_res);
Alvaro13 36:32a0a71555f0 139
Alvaro13 36:32a0a71555f0 140 delete post_req;
Alvaro13 36:32a0a71555f0 141
Alvaro13 36:32a0a71555f0 142 }
Alvaro13 36:32a0a71555f0 143 }
Alvaro13 36:32a0a71555f0 144 }
Alvaro13 36:32a0a71555f0 145
Alvaro13 36:32a0a71555f0 146
Alvaro13 36:32a0a71555f0 147 /**
Alvaro13 36:32a0a71555f0 148 * Interpreta la acceleracion sismica del terremoto a una escala de la intensidad del mismo.
Alvaro13 36:32a0a71555f0 149 */
Alvaro13 36:32a0a71555f0 150 string compute_intensity(float xPGA, float yPGA){
Alvaro13 36:32a0a71555f0 151 float maxPGA;
Alvaro13 36:32a0a71555f0 152
Alvaro13 36:32a0a71555f0 153 xPGA >= yPGA ? maxPGA = xPGA : maxPGA = yPGA;
Alvaro13 36:32a0a71555f0 154
Alvaro13 36:32a0a71555f0 155 string result;
Alvaro13 36:32a0a71555f0 156
Alvaro13 36:32a0a71555f0 157 if (maxPGA >= moderate.lowBound && maxPGA <= moderate.highBound)
Alvaro13 36:32a0a71555f0 158 result = "Earthquake detected! \t Mercalli Scale: " + moderate.scale + "\t" + moderate.damage + " Damage";
Alvaro13 36:32a0a71555f0 159
Alvaro13 36:32a0a71555f0 160 else if (maxPGA >= strong.lowBound && maxPGA <= strong.highBound)
Alvaro13 36:32a0a71555f0 161 result = "Earthquake detected! \t Mercalli Scale: " + strong.scale + "\t" + strong.damage + " Damage";
Alvaro13 36:32a0a71555f0 162
Alvaro13 36:32a0a71555f0 163 else if (maxPGA >= veryStrong.lowBound && maxPGA <= veryStrong.highBound)
Alvaro13 36:32a0a71555f0 164 result = "Earthquake detected! \t Mercalli Scale: " + veryStrong.scale + "\t" + veryStrong.damage + " Damage";
Alvaro13 36:32a0a71555f0 165
Alvaro13 36:32a0a71555f0 166 else if (maxPGA >= severe.lowBound && maxPGA <= severe.highBound)
Alvaro13 36:32a0a71555f0 167 result = "Earthquake detected! \t Mercalli Scale: " + severe.scale + "\t" + severe.damage + " Damage";
Alvaro13 36:32a0a71555f0 168
Alvaro13 36:32a0a71555f0 169 else if (maxPGA >= violent.lowBound && maxPGA <= violent.highBound)
Alvaro13 36:32a0a71555f0 170 result = "Earthquake detected! \t Mercalli Scale: " + violent.scale + "\t" + violent.damage + " Damage";
Alvaro13 36:32a0a71555f0 171
Alvaro13 36:32a0a71555f0 172 else if (maxPGA >= extreme.lowBound && maxPGA <= extreme.highBound)
Alvaro13 36:32a0a71555f0 173 result = "Earthquake detected! \t Mercalli Scale: " + extreme.scale + "\t" + extreme.damage + " Damage";
Alvaro13 36:32a0a71555f0 174
Alvaro13 36:32a0a71555f0 175 else
Alvaro13 36:32a0a71555f0 176 result = "No Intensity recognized";
Alvaro13 36:32a0a71555f0 177
Alvaro13 36:32a0a71555f0 178 return result;
Alvaro13 36:32a0a71555f0 179 }
Alvaro13 36:32a0a71555f0 180
Alvaro13 36:32a0a71555f0 181
Alvaro13 36:32a0a71555f0 182 /**
Alvaro13 36:32a0a71555f0 183 * Mide la data entregada por el acelerometro
Alvaro13 36:32a0a71555f0 184 */
Alvaro13 36:32a0a71555f0 185 void measure() {
Alvaro13 36:32a0a71555f0 186
Alvaro13 36:32a0a71555f0 187 // Ajusta la sensibilidad del sensor
Alvaro13 36:32a0a71555f0 188 mpu.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G);
Alvaro13 36:32a0a71555f0 189
Alvaro13 36:32a0a71555f0 190 // Configura la frecuencia de corte del filtro paso bajo
Alvaro13 36:32a0a71555f0 191 mpu.setBW(MPU6050_BW_5);
Alvaro13 36:32a0a71555f0 192
Alvaro13 36:32a0a71555f0 193 // Test the connection
Alvaro13 36:32a0a71555f0 194 if (mpu.testConnection())
Alvaro13 36:32a0a71555f0 195 pc.printf("MPU6050 test passed \r\n");
Alvaro13 36:32a0a71555f0 196 else
Alvaro13 36:32a0a71555f0 197 pc.printf("MPU6050 test failed \r\n");
Alvaro13 36:32a0a71555f0 198
Alvaro13 36:32a0a71555f0 199 /**
Alvaro13 36:32a0a71555f0 200 * Array que almacena la data Raw para la acceleracion en X, Y, Z
Alvaro13 36:32a0a71555f0 201 */
Alvaro13 36:32a0a71555f0 202 float acce[3];
Alvaro13 36:32a0a71555f0 203 /**
Alvaro13 36:32a0a71555f0 204 * Aceleracion en X
Alvaro13 36:32a0a71555f0 205 */
Alvaro13 36:32a0a71555f0 206 float xAcc;
Alvaro13 36:32a0a71555f0 207 /**
Alvaro13 36:32a0a71555f0 208 * Aceleracion en Y
Alvaro13 36:32a0a71555f0 209 */
Alvaro13 36:32a0a71555f0 210 float yAcc;
Alvaro13 36:32a0a71555f0 211
Alvaro13 36:32a0a71555f0 212
Alvaro13 36:32a0a71555f0 213 while(1) {
Alvaro13 36:32a0a71555f0 214 // Adecua el muestreo para una frecuencia determinada
Alvaro13 36:32a0a71555f0 215 wait(SAMPLE_RATE_MEASURE);
Alvaro13 36:32a0a71555f0 216
Alvaro13 36:32a0a71555f0 217 // Procesa la data obtenida del sensor de las aceleraciones en X, Y, Z
Alvaro13 36:32a0a71555f0 218 mpu.getAccelero(acce);
Alvaro13 36:32a0a71555f0 219
Alvaro13 36:32a0a71555f0 220 // Aceleracion sismica en XY (g)
Alvaro13 36:32a0a71555f0 221 xAcc = (float)acce[0] / (GRAVITY_CONSTANT);
Alvaro13 36:32a0a71555f0 222 yAcc = (float)acce[1] / (GRAVITY_CONSTANT);
Alvaro13 36:32a0a71555f0 223
Alvaro13 36:32a0a71555f0 224 acceleration* mailAcc = mail_box.alloc();
Alvaro13 36:32a0a71555f0 225
Alvaro13 36:32a0a71555f0 226 mailAcc->x = abs(xAcc);
Alvaro13 36:32a0a71555f0 227 mailAcc->y = abs(yAcc);
Alvaro13 36:32a0a71555f0 228 mail_box.put(mailAcc);
Alvaro13 36:32a0a71555f0 229
Alvaro13 36:32a0a71555f0 230 // Revisa la ocurrencia de un sismo
Alvaro13 36:32a0a71555f0 231 if (abs(xAcc) >= moderate.lowBound || abs(yAcc) >= moderate.lowBound && !beenHere){
Alvaro13 36:32a0a71555f0 232 globalVar.lock();
Alvaro13 36:32a0a71555f0 233 earthquakeHappening = true;
Alvaro13 36:32a0a71555f0 234 beenHere = true;
Alvaro13 36:32a0a71555f0 235 globalVar.unlock();
Alvaro13 36:32a0a71555f0 236 }
Alvaro13 36:32a0a71555f0 237
Alvaro13 36:32a0a71555f0 238 }
Alvaro13 36:32a0a71555f0 239
Alvaro13 36:32a0a71555f0 240 }
Alvaro13 36:32a0a71555f0 241
Alvaro13 36:32a0a71555f0 242 void send_meassure(){
Alvaro13 36:32a0a71555f0 243 Timer tick;
Alvaro13 36:32a0a71555f0 244 bool meassuring = false;
Alvaro13 36:32a0a71555f0 245 acceleration *data;
Alvaro13 36:32a0a71555f0 246 acceleration maxData;
Alvaro13 36:32a0a71555f0 247 maxData.x = 0;
Alvaro13 36:32a0a71555f0 248 maxData.y = 0;
Alvaro13 36:32a0a71555f0 249 while (true){
Alvaro13 36:32a0a71555f0 250 wait_ms(200);
Alvaro13 36:32a0a71555f0 251 globalVar.lock();
Alvaro13 36:32a0a71555f0 252 if (earthquakeHappening)
Alvaro13 36:32a0a71555f0 253 meassuring = true;
Alvaro13 36:32a0a71555f0 254 globalVar.unlock();
Alvaro13 36:32a0a71555f0 255 while (meassuring){
Alvaro13 36:32a0a71555f0 256 wait_ms(50);
Alvaro13 36:32a0a71555f0 257 osEvent evt = mail_box.get();
Alvaro13 36:32a0a71555f0 258 if (evt.status == osEventMail) {
Alvaro13 36:32a0a71555f0 259 acceleration *mail = (acceleration*)evt.value.p;
Alvaro13 36:32a0a71555f0 260 data = mail;
Alvaro13 36:32a0a71555f0 261 mail_box.free(mail);
Alvaro13 36:32a0a71555f0 262 }
Alvaro13 36:32a0a71555f0 263 if (data->x >= moderate.lowBound || data->y >= moderate.lowBound ){
Alvaro13 36:32a0a71555f0 264 tick.reset();
Alvaro13 36:32a0a71555f0 265 if (data->x > maxData.x || data->y > maxData.y){
Alvaro13 36:32a0a71555f0 266 maxData = *data;
Alvaro13 36:32a0a71555f0 267 }
Alvaro13 36:32a0a71555f0 268 }
Alvaro13 36:32a0a71555f0 269 else {
Alvaro13 36:32a0a71555f0 270 tick.start();
Alvaro13 36:32a0a71555f0 271 if (tick.read_ms() <= 200)
Alvaro13 36:32a0a71555f0 272 continue;
Alvaro13 36:32a0a71555f0 273 tick.stop();
Alvaro13 36:32a0a71555f0 274 meassuring = false;
Alvaro13 36:32a0a71555f0 275 }
Alvaro13 36:32a0a71555f0 276 }
Alvaro13 36:32a0a71555f0 277 globalVar.lock();
Alvaro13 36:32a0a71555f0 278 beenHere = false;
Alvaro13 36:32a0a71555f0 279 earthquakeHappening = false;
Alvaro13 36:32a0a71555f0 280 globalVar.unlock();
Alvaro13 36:32a0a71555f0 281 acceleration* mailAcc = mail_meass.alloc();
Alvaro13 36:32a0a71555f0 282 mailAcc->x = maxData.x;
Alvaro13 36:32a0a71555f0 283 mailAcc->y = maxData.y;
Alvaro13 36:32a0a71555f0 284 mail_meass.put(mailAcc);
Alvaro13 36:32a0a71555f0 285 maxData.x = 0;
Alvaro13 36:32a0a71555f0 286 maxData.y = 0;
Alvaro13 36:32a0a71555f0 287 }
Alvaro13 36:32a0a71555f0 288 }
Alvaro13 36:32a0a71555f0 289
Alvaro13 36:32a0a71555f0 290 /**
Alvaro13 36:32a0a71555f0 291 * Se encarga de obtener la cordenadas del Thread
Alvaro13 36:32a0a71555f0 292 */
Alvaro13 36:32a0a71555f0 293 void getGPSCoordinates(){
Alvaro13 36:32a0a71555f0 294
Alvaro13 36:32a0a71555f0 295 char c; // when read via Adafruit_GPS::read(), the class returns single character stored here
Alvaro13 36:32a0a71555f0 296 Timer refresh_Timer; // sets up a timer for use in loop; how often do we print GPS info?
Alvaro13 36:32a0a71555f0 297 const int refresh_Time = 2000; //refresh time in ms
Alvaro13 36:32a0a71555f0 298
Alvaro13 36:32a0a71555f0 299 myGPS.begin(9600); // sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
Alvaro13 36:32a0a71555f0 300 // a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
Alvaro13 36:32a0a71555f0 301
Alvaro13 36:32a0a71555f0 302 myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //these commands are defined in MBed_Adafruit_GPS.h; a link is provided there for command creation
Alvaro13 36:32a0a71555f0 303 myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
Alvaro13 36:32a0a71555f0 304 myGPS.sendCommand(PGCMD_ANTENNA);
Alvaro13 36:32a0a71555f0 305
Alvaro13 36:32a0a71555f0 306 refresh_Timer.start(); // starts the clock on the timer
Alvaro13 36:32a0a71555f0 307
Alvaro13 36:32a0a71555f0 308 while(true){
Alvaro13 36:32a0a71555f0 309 c = myGPS.read(); // queries the GPS
Alvaro13 36:32a0a71555f0 310
Alvaro13 36:32a0a71555f0 311 // check if we recieved a new message from GPS, if so, attempt to parse it,
Alvaro13 36:32a0a71555f0 312 if ( myGPS.newNMEAreceived() )
Alvaro13 36:32a0a71555f0 313 if ( !myGPS.parse(myGPS.lastNMEA()) )
Alvaro13 36:32a0a71555f0 314 continue;
Alvaro13 36:32a0a71555f0 315 }
Alvaro13 36:32a0a71555f0 316 }
Alvaro13 36:32a0a71555f0 317
Alvaro13 36:32a0a71555f0 318
Alvaro13 36:32a0a71555f0 319 int main()
Alvaro13 36:32a0a71555f0 320 {
Alvaro13 36:32a0a71555f0 321 sampleAccelero.start(measure);
Alvaro13 36:32a0a71555f0 322 sendAccelero.start(send_meassure);
Alvaro13 36:32a0a71555f0 323 printDebug.start(print_debug);
Alvaro13 36:32a0a71555f0 324 getCoordinates.start(getGPSCoordinates);
Alvaro13 36:32a0a71555f0 325 }