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 05:05:55 2019 +0000
Revision:
38:0813e461b835
Parent:
37:fcb5efa391d5
program reseted

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
Alvaro13 36:32a0a71555f0 10 /**
Alvaro13 36:32a0a71555f0 11 * Debbuging led
Alvaro13 36:32a0a71555f0 12 */
Alvaro13 36:32a0a71555f0 13 DigitalOut myled(LED1);
Alvaro13 36:32a0a71555f0 14
Alvaro13 36:32a0a71555f0 15 /**
Alvaro13 36:32a0a71555f0 16 * Puerto serial
Alvaro13 36:32a0a71555f0 17 */
Alvaro13 36:32a0a71555f0 18 Serial pc(USBTX, USBRX, BAUD_RATE);
Alvaro13 36:32a0a71555f0 19
Alvaro13 36:32a0a71555f0 20 /**
Alvaro13 36:32a0a71555f0 21 * Puntero hacia el puerto serial utilizado para la comunicacion entre el GPS y el Micro
Alvaro13 36:32a0a71555f0 22 */
Alvaro13 36:32a0a71555f0 23 Serial * gps_Serial;
Alvaro13 36:32a0a71555f0 24
Alvaro13 36:32a0a71555f0 25 /**
Alvaro13 36:32a0a71555f0 26 * Objeto MPU6050
Alvaro13 36:32a0a71555f0 27 */
Alvaro13 36:32a0a71555f0 28 MPU6050 mpu(PF_15, PF_14);
Alvaro13 36:32a0a71555f0 29
Alvaro13 36:32a0a71555f0 30 /**
Alvaro13 36:32a0a71555f0 31 * Threads
Alvaro13 36:32a0a71555f0 32 */
Alvaro13 36:32a0a71555f0 33 Thread sampleAccelero;
Alvaro13 36:32a0a71555f0 34 Thread printDebug;
Alvaro13 36:32a0a71555f0 35 Thread sendAccelero;
Alvaro13 36:32a0a71555f0 36 Thread getCoordinates;
Alvaro13 36:32a0a71555f0 37
Alvaro13 36:32a0a71555f0 38 /**
Alvaro13 36:32a0a71555f0 39 * Mutex
Alvaro13 36:32a0a71555f0 40 */
Alvaro13 36:32a0a71555f0 41 Mutex semaforo;
Alvaro13 36:32a0a71555f0 42 Mutex globalVar;
Alvaro13 36:32a0a71555f0 43
Alvaro13 36:32a0a71555f0 44 /**
Alvaro13 36:32a0a71555f0 45 * Mailboxes
Alvaro13 36:32a0a71555f0 46 */
Alvaro13 36:32a0a71555f0 47 Mail<acceleration, 1> mail_box;
Alvaro13 36:32a0a71555f0 48 Mail<acceleration, 1> mail_meass;
Alvaro13 36:32a0a71555f0 49
Alvaro13 36:32a0a71555f0 50 /**
Alvaro13 36:32a0a71555f0 51 * Variables de control
Alvaro13 36:32a0a71555f0 52 */
Alvaro13 36:32a0a71555f0 53 bool earthquakeHappening = false;
Alvaro13 36:32a0a71555f0 54 bool beenHere = false;
Alvaro13 36:32a0a71555f0 55
Alvaro13 36:32a0a71555f0 56
Alvaro13 36:32a0a71555f0 57
Alvaro13 36:32a0a71555f0 58 /**
Alvaro13 36:32a0a71555f0 59 * Handler para la utilizacion del GPS
Alvaro13 36:32a0a71555f0 60 */
Alvaro13 36:32a0a71555f0 61 Adafruit_GPS myGPS(new Serial(PC_12, PD_2)); //object of Adafruit's GPS class
Alvaro13 36:32a0a71555f0 62
Alvaro13 36:32a0a71555f0 63
Alvaro13 36:32a0a71555f0 64 /**
Alvaro13 36:32a0a71555f0 65 * Imprime los resultados de la medicion del sismo
Alvaro13 36:32a0a71555f0 66 */
Alvaro13 36:32a0a71555f0 67 void print_debug(){
Alvaro13 36:32a0a71555f0 68 string tweet;
Alvaro13 36:32a0a71555f0 69 while(true){
Alvaro13 36:32a0a71555f0 70 wait(1);
Alvaro13 36:32a0a71555f0 71 osEvent evt = mail_meass.get();
Alvaro13 36:32a0a71555f0 72 if (evt.status == osEventMail) {
Alvaro13 36:32a0a71555f0 73 acceleration *mail = (acceleration*)evt.value.p;
Alvaro13 36:32a0a71555f0 74 if (mail->x == 0 && mail->y == 0){
Alvaro13 36:32a0a71555f0 75 mail_meass.free(mail);
Alvaro13 36:32a0a71555f0 76 continue;
Alvaro13 36:32a0a71555f0 77 }
Alvaro13 36:32a0a71555f0 78 tweet = compute_intensity(mail->x, mail->y);
Alvaro13 36:32a0a71555f0 79 semaforo.lock();
Alvaro13 36:32a0a71555f0 80 pc.printf("%s\n\r",tweet);
Alvaro13 36:32a0a71555f0 81 semaforo.unlock();
Alvaro13 36:32a0a71555f0 82 mail_meass.free(mail);
Alvaro13 38:0813e461b835 83 pc.printf("Time: %d:%d:%d.%u\r\n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
Alvaro13 38:0813e461b835 84 pc.printf("Date: %d/%d/20%d\r\n", myGPS.day, myGPS.month, myGPS.year);
Alvaro13 38:0813e461b835 85 pc.printf("Location: %f%c, %f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
Alvaro13 38:0813e461b835 86 pc.printf("Altitude: %f\r\n", myGPS.altitude);
Alvaro13 36:32a0a71555f0 87
Alvaro13 36:32a0a71555f0 88 }
Alvaro13 36:32a0a71555f0 89 }
Alvaro13 36:32a0a71555f0 90 }
Alvaro13 36:32a0a71555f0 91
Alvaro13 36:32a0a71555f0 92
Alvaro13 36:32a0a71555f0 93 /**
Alvaro13 36:32a0a71555f0 94 * Interpreta la acceleracion sismica del terremoto a una escala de la intensidad del mismo.
Alvaro13 36:32a0a71555f0 95 */
Alvaro13 36:32a0a71555f0 96 string compute_intensity(float xPGA, float yPGA){
Alvaro13 36:32a0a71555f0 97 float maxPGA;
Alvaro13 36:32a0a71555f0 98
Alvaro13 36:32a0a71555f0 99 xPGA >= yPGA ? maxPGA = xPGA : maxPGA = yPGA;
Alvaro13 36:32a0a71555f0 100
Alvaro13 36:32a0a71555f0 101 string result;
Alvaro13 36:32a0a71555f0 102
Alvaro13 36:32a0a71555f0 103 if (maxPGA >= moderate.lowBound && maxPGA <= moderate.highBound)
Alvaro13 36:32a0a71555f0 104 result = "Earthquake detected! \t Mercalli Scale: " + moderate.scale + "\t" + moderate.damage + " Damage";
Alvaro13 36:32a0a71555f0 105
Alvaro13 36:32a0a71555f0 106 else if (maxPGA >= strong.lowBound && maxPGA <= strong.highBound)
Alvaro13 36:32a0a71555f0 107 result = "Earthquake detected! \t Mercalli Scale: " + strong.scale + "\t" + strong.damage + " Damage";
Alvaro13 36:32a0a71555f0 108
Alvaro13 36:32a0a71555f0 109 else if (maxPGA >= veryStrong.lowBound && maxPGA <= veryStrong.highBound)
Alvaro13 36:32a0a71555f0 110 result = "Earthquake detected! \t Mercalli Scale: " + veryStrong.scale + "\t" + veryStrong.damage + " Damage";
Alvaro13 36:32a0a71555f0 111
Alvaro13 36:32a0a71555f0 112 else if (maxPGA >= severe.lowBound && maxPGA <= severe.highBound)
Alvaro13 36:32a0a71555f0 113 result = "Earthquake detected! \t Mercalli Scale: " + severe.scale + "\t" + severe.damage + " Damage";
Alvaro13 36:32a0a71555f0 114
Alvaro13 36:32a0a71555f0 115 else if (maxPGA >= violent.lowBound && maxPGA <= violent.highBound)
Alvaro13 36:32a0a71555f0 116 result = "Earthquake detected! \t Mercalli Scale: " + violent.scale + "\t" + violent.damage + " Damage";
Alvaro13 36:32a0a71555f0 117
Alvaro13 36:32a0a71555f0 118 else if (maxPGA >= extreme.lowBound && maxPGA <= extreme.highBound)
Alvaro13 36:32a0a71555f0 119 result = "Earthquake detected! \t Mercalli Scale: " + extreme.scale + "\t" + extreme.damage + " Damage";
Alvaro13 36:32a0a71555f0 120
Alvaro13 36:32a0a71555f0 121 else
Alvaro13 36:32a0a71555f0 122 result = "No Intensity recognized";
Alvaro13 36:32a0a71555f0 123
Alvaro13 36:32a0a71555f0 124 return result;
Alvaro13 36:32a0a71555f0 125 }
Alvaro13 36:32a0a71555f0 126
Alvaro13 36:32a0a71555f0 127
Alvaro13 36:32a0a71555f0 128 /**
Alvaro13 36:32a0a71555f0 129 * Mide la data entregada por el acelerometro
Alvaro13 36:32a0a71555f0 130 */
Alvaro13 36:32a0a71555f0 131 void measure() {
Alvaro13 36:32a0a71555f0 132
Alvaro13 36:32a0a71555f0 133 // Ajusta la sensibilidad del sensor
Alvaro13 36:32a0a71555f0 134 mpu.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G);
Alvaro13 36:32a0a71555f0 135
Alvaro13 36:32a0a71555f0 136 // Configura la frecuencia de corte del filtro paso bajo
Alvaro13 36:32a0a71555f0 137 mpu.setBW(MPU6050_BW_5);
Alvaro13 36:32a0a71555f0 138
Alvaro13 36:32a0a71555f0 139 // Test the connection
Alvaro13 36:32a0a71555f0 140 if (mpu.testConnection())
Alvaro13 36:32a0a71555f0 141 pc.printf("MPU6050 test passed \r\n");
Alvaro13 36:32a0a71555f0 142 else
Alvaro13 36:32a0a71555f0 143 pc.printf("MPU6050 test failed \r\n");
Alvaro13 36:32a0a71555f0 144
Alvaro13 36:32a0a71555f0 145 /**
Alvaro13 36:32a0a71555f0 146 * Array que almacena la data Raw para la acceleracion en X, Y, Z
Alvaro13 36:32a0a71555f0 147 */
Alvaro13 36:32a0a71555f0 148 float acce[3];
Alvaro13 36:32a0a71555f0 149 /**
Alvaro13 36:32a0a71555f0 150 * Aceleracion en X
Alvaro13 36:32a0a71555f0 151 */
Alvaro13 36:32a0a71555f0 152 float xAcc;
Alvaro13 36:32a0a71555f0 153 /**
Alvaro13 36:32a0a71555f0 154 * Aceleracion en Y
Alvaro13 36:32a0a71555f0 155 */
Alvaro13 36:32a0a71555f0 156 float yAcc;
Alvaro13 36:32a0a71555f0 157
Alvaro13 36:32a0a71555f0 158
Alvaro13 36:32a0a71555f0 159 while(1) {
Alvaro13 36:32a0a71555f0 160 // Adecua el muestreo para una frecuencia determinada
Alvaro13 36:32a0a71555f0 161 wait(SAMPLE_RATE_MEASURE);
Alvaro13 36:32a0a71555f0 162
Alvaro13 36:32a0a71555f0 163 // Procesa la data obtenida del sensor de las aceleraciones en X, Y, Z
Alvaro13 36:32a0a71555f0 164 mpu.getAccelero(acce);
Alvaro13 36:32a0a71555f0 165
Alvaro13 36:32a0a71555f0 166 // Aceleracion sismica en XY (g)
Alvaro13 36:32a0a71555f0 167 xAcc = (float)acce[0] / (GRAVITY_CONSTANT);
Alvaro13 36:32a0a71555f0 168 yAcc = (float)acce[1] / (GRAVITY_CONSTANT);
Alvaro13 36:32a0a71555f0 169
Alvaro13 36:32a0a71555f0 170 acceleration* mailAcc = mail_box.alloc();
Alvaro13 36:32a0a71555f0 171
Alvaro13 36:32a0a71555f0 172 mailAcc->x = abs(xAcc);
Alvaro13 36:32a0a71555f0 173 mailAcc->y = abs(yAcc);
Alvaro13 36:32a0a71555f0 174 mail_box.put(mailAcc);
Alvaro13 36:32a0a71555f0 175
Alvaro13 36:32a0a71555f0 176 // Revisa la ocurrencia de un sismo
Alvaro13 36:32a0a71555f0 177 if (abs(xAcc) >= moderate.lowBound || abs(yAcc) >= moderate.lowBound && !beenHere){
Alvaro13 36:32a0a71555f0 178 globalVar.lock();
Alvaro13 36:32a0a71555f0 179 earthquakeHappening = true;
Alvaro13 36:32a0a71555f0 180 beenHere = true;
Alvaro13 36:32a0a71555f0 181 globalVar.unlock();
Alvaro13 36:32a0a71555f0 182 }
Alvaro13 36:32a0a71555f0 183
Alvaro13 36:32a0a71555f0 184 }
Alvaro13 36:32a0a71555f0 185
Alvaro13 36:32a0a71555f0 186 }
Alvaro13 36:32a0a71555f0 187
Alvaro13 36:32a0a71555f0 188 void send_meassure(){
Alvaro13 36:32a0a71555f0 189 Timer tick;
Alvaro13 36:32a0a71555f0 190 bool meassuring = false;
Alvaro13 36:32a0a71555f0 191 acceleration *data;
Alvaro13 36:32a0a71555f0 192 acceleration maxData;
Alvaro13 36:32a0a71555f0 193 maxData.x = 0;
Alvaro13 36:32a0a71555f0 194 maxData.y = 0;
Alvaro13 36:32a0a71555f0 195 while (true){
Alvaro13 36:32a0a71555f0 196 wait_ms(200);
Alvaro13 36:32a0a71555f0 197 globalVar.lock();
Alvaro13 36:32a0a71555f0 198 if (earthquakeHappening)
Alvaro13 36:32a0a71555f0 199 meassuring = true;
Alvaro13 36:32a0a71555f0 200 globalVar.unlock();
Alvaro13 36:32a0a71555f0 201 while (meassuring){
Alvaro13 36:32a0a71555f0 202 wait_ms(50);
Alvaro13 36:32a0a71555f0 203 osEvent evt = mail_box.get();
Alvaro13 36:32a0a71555f0 204 if (evt.status == osEventMail) {
Alvaro13 36:32a0a71555f0 205 acceleration *mail = (acceleration*)evt.value.p;
Alvaro13 36:32a0a71555f0 206 data = mail;
Alvaro13 36:32a0a71555f0 207 mail_box.free(mail);
Alvaro13 36:32a0a71555f0 208 }
Alvaro13 36:32a0a71555f0 209 if (data->x >= moderate.lowBound || data->y >= moderate.lowBound ){
Alvaro13 36:32a0a71555f0 210 tick.reset();
Alvaro13 36:32a0a71555f0 211 if (data->x > maxData.x || data->y > maxData.y){
Alvaro13 36:32a0a71555f0 212 maxData = *data;
Alvaro13 36:32a0a71555f0 213 }
Alvaro13 36:32a0a71555f0 214 }
Alvaro13 36:32a0a71555f0 215 else {
Alvaro13 36:32a0a71555f0 216 tick.start();
Alvaro13 36:32a0a71555f0 217 if (tick.read_ms() <= 200)
Alvaro13 36:32a0a71555f0 218 continue;
Alvaro13 36:32a0a71555f0 219 tick.stop();
Alvaro13 36:32a0a71555f0 220 meassuring = false;
Alvaro13 36:32a0a71555f0 221 }
Alvaro13 36:32a0a71555f0 222 }
Alvaro13 36:32a0a71555f0 223 globalVar.lock();
Alvaro13 36:32a0a71555f0 224 beenHere = false;
Alvaro13 36:32a0a71555f0 225 earthquakeHappening = false;
Alvaro13 36:32a0a71555f0 226 globalVar.unlock();
Alvaro13 36:32a0a71555f0 227 acceleration* mailAcc = mail_meass.alloc();
Alvaro13 36:32a0a71555f0 228 mailAcc->x = maxData.x;
Alvaro13 36:32a0a71555f0 229 mailAcc->y = maxData.y;
Alvaro13 36:32a0a71555f0 230 mail_meass.put(mailAcc);
Alvaro13 36:32a0a71555f0 231 maxData.x = 0;
Alvaro13 36:32a0a71555f0 232 maxData.y = 0;
Alvaro13 36:32a0a71555f0 233 }
Alvaro13 36:32a0a71555f0 234 }
Alvaro13 36:32a0a71555f0 235
Alvaro13 36:32a0a71555f0 236 /**
Alvaro13 36:32a0a71555f0 237 * Se encarga de obtener la cordenadas del Thread
Alvaro13 36:32a0a71555f0 238 */
Alvaro13 36:32a0a71555f0 239 void getGPSCoordinates(){
Alvaro13 36:32a0a71555f0 240
Alvaro13 36:32a0a71555f0 241 char c; // when read via Adafruit_GPS::read(), the class returns single character stored here
Alvaro13 36:32a0a71555f0 242 Timer refresh_Timer; // sets up a timer for use in loop; how often do we print GPS info?
Alvaro13 36:32a0a71555f0 243 const int refresh_Time = 2000; //refresh time in ms
Alvaro13 36:32a0a71555f0 244
Alvaro13 36:32a0a71555f0 245 myGPS.begin(9600); // sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
Alvaro13 36:32a0a71555f0 246 // a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
Alvaro13 36:32a0a71555f0 247
Alvaro13 36:32a0a71555f0 248 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 249 myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
Alvaro13 36:32a0a71555f0 250 myGPS.sendCommand(PGCMD_ANTENNA);
Alvaro13 36:32a0a71555f0 251
Alvaro13 36:32a0a71555f0 252 refresh_Timer.start(); // starts the clock on the timer
Alvaro13 36:32a0a71555f0 253
Alvaro13 36:32a0a71555f0 254 while(true){
Alvaro13 36:32a0a71555f0 255 c = myGPS.read(); // queries the GPS
Alvaro13 36:32a0a71555f0 256
Alvaro13 36:32a0a71555f0 257 // check if we recieved a new message from GPS, if so, attempt to parse it,
Alvaro13 36:32a0a71555f0 258 if ( myGPS.newNMEAreceived() )
Alvaro13 36:32a0a71555f0 259 if ( !myGPS.parse(myGPS.lastNMEA()) )
Alvaro13 36:32a0a71555f0 260 continue;
Alvaro13 36:32a0a71555f0 261 }
Alvaro13 36:32a0a71555f0 262 }
Alvaro13 36:32a0a71555f0 263
Alvaro13 36:32a0a71555f0 264
Alvaro13 36:32a0a71555f0 265 int main()
Alvaro13 36:32a0a71555f0 266 {
Alvaro13 36:32a0a71555f0 267 sampleAccelero.start(measure);
Alvaro13 36:32a0a71555f0 268 sendAccelero.start(send_meassure);
Alvaro13 36:32a0a71555f0 269 printDebug.start(print_debug);
Alvaro13 36:32a0a71555f0 270 getCoordinates.start(getGPSCoordinates);
Alvaro13 36:32a0a71555f0 271 }