GPS y GSM con envío de cadena de google maps.
Dependencies: GPSGSM TextLCD mbed
Fork of TAREA_4_GPS_GSM by
main.cpp
- Committer:
- NicolasV
- Date:
- 2017-06-09
- Revision:
- 3:238bcdf52c8f
- Parent:
- 2:ea6275d1222f
File content as of revision 3:238bcdf52c8f:
#include "mbed.h" #include "DebouncedIn.h" #include "stdio.h" #include "string.h" #include "GPS.h" #include "TextLCD.h" //Salidas digitales Timer t; Timer t2; DigitalOut LedVerde(LED2); DigitalOut LedRojo(LED1); DigitalOut LedAzul(LED3); // Entrada análoga AnalogIn v(PTB0); float medi; Serial GSM(PTE0,PTE1); Serial pc(USBTX,USBRX); GPS gps(PTE22, PTE23); TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 DigitalOut led_alarma(PTA5); DigitalOut led_carro(PTA4); char DE1[255]; char DS1[255]; char DE2[255]; char DS2[255]; char buffer[512]; char resp[6]; char tam[2]; char mensaje[100]; //Variables enteras y caracteres int count; int i, K, LENOUT1, LENIN1, LENOUT2, LENIN2, C; int c=0; char r[]=""; char msg[256]; char char1; int ind; float med; char outmed[16], outmedn[16]; int ret = 1; char tel[15] = {'0', '3', '3', '4', '4', '7', '6', '2', '6', '1'}; bool noM2 = true, noM5 = true, noM3 = true, aviso = false, noOf = true; char mensajeM2[] = "Saliendo por la porteria del M2. Vehiculo apagado."; char mensajeM3[] = "Saliendo por la porteria del M3. Vehiculo apagado."; char mensajeM5[] = "Saliendo por la porteria del M5. Vehiculo apagado."; char mensajeOficina[255]; char buf[100]; char relle1[] = "0011000A91"; char relle2[] = "0000AA"; float latitud, longitud, frac_long, frac_lat; // Usando el GPS se obtuvo las coordenadas de la porteria del bloque M2: 6.274062N, 75.592538W. float distanciaM2(float x, float y) { return sqrt(pow((x - 6.274062f), 2) + pow((y + 75.592538f), 2)); } // Usando el GPS se obtuvo las coordenadas de la porteria del bloque M3: 6.274674N, 75.590680W. float distanciaM3(float x, float y) { return sqrt(pow((x - 6.274674f), 2) + pow((y + 75.590680f), 2)); } // Usando el GPS se obtuvo las coordenadas de la porteria del bloque M5: 6.275458N, 75.591170W. float distanciaM5(float x, float y) { return sqrt(pow((x - 6.275458f), 2) + pow((y + 75.591170f), 2)); } float distanciaOficina(float x, float y) { // https://www.google.com.co/maps/search/6.275206,-75.592836/ return sqrt(pow((x - 6.275206), 2) + pow((y + 75.592836f), 2)); } // Funcion para enviar un mensaje de alerta: void alarma(char* msj) { strcpy(DE1,msj); LENIN1 = strlen(DE1); K = 0; C = 0; for (i = 0; i < LENIN1; i++){ DS1[i] = DE1[i + C] >> K | DE1[i + C + 1] << (7 - K); if(DS1[i] == 0x00) {LENOUT1 = i;} K++; if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion. } // Concatenación del mensaje en formato PDU y envío del mismo. ind = 14 + LENOUT1 - 1; GSM.printf("AT+CMGS=%d\r\n",ind); pc.printf("AT+CMGS=%d\r\n",ind); pc.printf(relle1); GSM.printf(relle1); for (i=0 ;i<=9; i++) { pc.printf("%c",tel[i]); GSM.printf("%c",tel[i]); } pc.printf(relle2); GSM.printf(relle2); pc.printf("%2X", LENIN1); GSM.printf("%2X", LENIN1); for (i = 0; i < LENOUT1; i++){ pc.printf("%02X", DS1[i]&0x000000FF); GSM.printf("%02X", DS1[i]&0x000000FF); } wait(1); GSM.putc((char)0x1A); // Ctrl - Z. GSM.scanf("%s",buf); // Estado del mensaje (Envió o Error). pc.printf(">%s\n",buf); pc.printf("\n"); } // Leer el buffer: int readBuffer(char *buffer,int count){ int i = 0; t.start(); while(true) { while (GSM.readable()) { char c = GSM.getc(); buffer[i++] = c; if(i > count + 1)break; } if(i > count)break; if(t.read() > 3) { t.stop(); t.reset(); break; } } wait(0.5); while(GSM.readable()) char c = GSM.getc(); return 0; } void sendCmd(char *cmd){ GSM.puts(cmd); } int waitForResp(char *resp, int timeout){ int len = strlen(resp); int sum = 0; t.start(); while(true) { if(GSM.readable()) { char c = GSM.getc(); sum = (c == resp[sum]) ? sum + 1 : 0; if(sum == len)break; } if(t.read() > timeout) { t.stop(); t.reset(); return -1; } } t.stop(); t.reset(); while(GSM.readable()) { char c = GSM.getc(); } return 0; } int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout){ sendCmd(cmd); return waitForResp(resp,timeout); } int init() { if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)) return -1; if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)) return -1; if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)) return -1; if (0 != sendCmdAndWaitForResp("AT+CBST=7,0,1\r\n", "OK", 3)) return -1; if (0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 3)) return -1; LedVerde=0; return 0; } int recibe_ok() { GSM.printf("AT+CMGS=27\n\r"); pc.printf("AT+CMGS=27\n\r"); wait_ms(100); GSM.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel); pc.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel); wait_ms(100); GSM.putc((char)0x1A); return 0; } int main() { t2.start(); GSM.baud(9600); GSM.format(8, Serial::None, 1); LedVerde = 1; LedRojo = 1; LedAzul = 1; led_carro = 1; led_alarma = 0; aviso = false; inicio1: // Configurando Modem... ret = init(); lcd.locate(0,0); lcd.printf("Configurando\nModem..."); wait(2); if (ret == 0) { LedRojo = 1; LedVerde = 0; // Apagar LED Verde para confirmar la comunicación con el módem. pc.printf("Hecho!\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Hecho!"); wait(1); } else { wait(1); goto inicio1; } lcd.cls(); lcd.locate(0,0); lcd.printf(" Alarma de \n seguridad. "); wait(5); while(true) { // A continuacion se verifica si esta entrando una llamada. // Si es el caso, se apaga el carro. if (GSM.readable()) { readBuffer(buffer, 110); for(i=0; i < 5; i++) resp[i] = buffer[i]; pc.printf(resp); if (strcmp("\r\nRIN", resp) == 0) { lcd.cls(); led_carro = 0; lcd.locate(0,0); lcd.printf("Llamada!!!\nApagando carro.."); pc.printf("Llamada!!!\n\r"); wait(5); } } char dir1[32]; char dir2[32]; char dirc[255]; // Cada 3 segundos se lee el GPS para actualizar la posicion y enviar mensaje de alerta de ser necesario. if (int(t2.read()) % 3 == 0) { gps.sample(); latitud = gps.latitude; longitud = gps.longitude; if (distanciaM5(latitud, longitud) <= 1000.00015f && !aviso) { aviso = true; led_alarma = 1; noM5 = false; sprintf(dir1, "%2.6f", latitud); sprintf(dir2, "%2.6f", longitud); strcpy(dirc, "https://www.google.com.co/maps/search/"); strcat(dirc, dir1); strcat(dirc, ","); strcat(dirc, dir2); alarma(dirc); lcd.cls(); lcd.locate(0,0); lcd.printf("M5: Enviando\nalerta..."); } else if (distanciaM5(latitud, longitud) > 0.00015f && aviso) noM5 = true; if (distanciaM2(latitud, longitud) <= 0.00015f && !aviso) { aviso = true; led_alarma = 1; noM2 = false; sprintf(dir1, "%2.6f", latitud); sprintf(dir2, "%2.6f", longitud); strcpy(dirc, "https://www.google.com.co/maps/search/"); strcat(dirc, dir1); strcat(dirc, ","); strcat(dirc, dir2); alarma(dirc); lcd.cls(); lcd.locate(0,0); lcd.printf("M2: Enviando\nalerta..."); } else if (distanciaM2(latitud, longitud) > 0.00015f && aviso) noM2 = true; if (distanciaM3(latitud, longitud) <= 0.00015f && !aviso) { aviso = true; led_alarma = 1; noM3 = false; sprintf(dir1, "%2.6f", latitud); sprintf(dir2, "%2.6f", longitud); strcpy(dirc, "https://www.google.com.co/maps/search/"); strcat(dirc, dir1); strcat(dirc, ","); strcat(dirc, dir2); alarma(dirc); lcd.cls(); lcd.locate(0,0); lcd.printf("M3: Enviando\nalerta..."); } else if (distanciaM3(latitud, longitud) > 0.00015f && aviso) noM3 = true; if (noM2 && noM5 && noM3 && noOf && !aviso) { led_carro = 1; led_alarma = 0; } // Si la distancia a la oficina es pequeña entonces envia la direccion de google Maps!!: if (distanciaOficina(latitud, longitud) <= 0.00015f && !aviso) { led_alarma = 1; aviso = true; noOf = false; sprintf(dir1, "%2.6f", latitud); sprintf(dir2, "%2.6f", longitud); strcpy(dirc, "https://www.google.com.co/maps/search/"); strcat(dirc, dir1); strcat(dirc, ","); strcat(dirc, dir2); pc.printf("%s\n", dirc); alarma(dirc); lcd.cls(); lcd.locate(0,0); lcd.printf("M3: Enviando\nalerta..."); wait(5); } else if (distanciaM3(latitud, longitud) > 0.00015f && aviso) noM3 = true; lcd.cls(); lcd.locate(0,0); lcd.printf(" Lat: %02.6f\n Lon: %02.6f", latitud, longitud); } } }