Tarea_GSM Equipo Rojo 2019_1 Universidad Nacional de Colombia, Materia:Procesadores. Este código envía la ubicación del módem a un smartphone al mandarle "Coordenadas" o "coordenadas"
Diff: main.cpp
- Revision:
- 3:8aef67673965
- Parent:
- 2:ea6275d1222f
- Child:
- 4:215ec13079de
--- a/main.cpp Fri Nov 18 21:27:40 2016 +0000 +++ b/main.cpp Fri Apr 12 05:31:27 2019 +0000 @@ -1,37 +1,44 @@ -// Programa para establecer la comunicación con un módem Siemens A56 por una de las UART. -// Por otra UART se envían datos de GPS de una región seleccionada de la aplicación de -// Google Earth en formato .kml leídos por el programa SatGen de NMEA por un puerto COM -// del Micro hacia un Dongle USB. Se deberá enviar un mensaje de texto al módem el cual -// podrá ser la palabra "coordenadas" o "voltaje". Si se envía "coordenadas" el programa -// calcula la latitud y la longitud de la coordenada actual de GPS y envía un mensaje de -// texto al mismo número con las coordenadas en formato de Google Maps. Si se envía -// "voltaje" se lee el voltaje de un puerto que se puede variar con un potenciómetro y -// envía un mensaje de texto con la medida. Los mensajes de texto recibidos se interpretan -// y decodifican de formato PDU a caracteres y los mensajes enviados se codifican de -// caracteres a formato PDU para ser enviados. +// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Programa para establecer la comunicación con un módem Siemens A56 y un modulo FRDMKL25Z +// opera como rastreador satelital para Geolocalizacion. +// Por la UART (1) se conecta el MODEM y por la uart (2) el GPS (se lee en modo NEMEA) +// Este sistema genera una cadena de geolocalizacion para GoogleMaps con las coordenadas locales +// Si previamente se envia el mensaje (Coordenadas o coordenadas) +// El sistema ademas recibe ordenes de tipo mensaje GSM PDU para accionar cargas +// 1----Una supuesta valvula de combustible (On y Off.....on y off......) +// 2----Una cantonera para cerradura electrica (Pulso o pulso) (pulso de 7 segundos) +// Este sistema responde con un mensaje si el mensaje fue recibido (Mensaje Recibido) +// +// Adicionalmente este sistema mide un valor analogico en respuesta al mensaje..(Voltaje o voltaje) +// El sistema dispone de un jumper que permite operar el sistema con o sin GPS (jumper a tierra) +// El sistema detecta si el modem GSM esta bien conectado configurado y respondiendo correctamente +// El sistema detecta si el GPS emite cadenas NEMEA y señaliza con un led si es exitosa la conexion +// Presenta borrado automatico de SMS entrantes para evitar perdida de sincronismo en la deteccion +// de cadenas y prefijos. +// Este codigo compila sin problemas para un modulo chino bluepill STM32F103 +// con las modificaciones adecuadas de puertos y leds -// Oswaldo Andrés Giraldo Giraldo - C.C.: 1152458465 -// Héctor Andrés Hoyos Ceballos - C.C.: 1039466317 -// Jose Fernando Montoya Vargas - C.C.: 1039468676 -// María Fernanda Villa Tamayo - C.C.: 1152457490 - +//+++++++++++++++++++++++++++++++ARCHIVOS INCLUIDOS************************************************************************* #include "mbed.h" #include "DebouncedIn.h" #include "stdio.h" #include "string.h" #include "GPS.h" -//Salidas digitales Timer t; +//++++++++++++++++++++++++++++++++++++salidas y entradas digitales+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DigitalOut LedVerde(LED2); DigitalOut LedRojo(LED1); DigitalOut LedAzul(LED3); +DigitalOut valvula(PTC5);//salida de la valvula +DigitalOut puerta(PTC6);//salida de cerradura magnetica (en caso de usarlo en casa o desbloquear puertas de carro) +DigitalIn sin_gps(PTA13); // Entrada análoga AnalogIn v(PTB0); float medi; -// Declaración de los puertos de la FRDM, Módem y GPS. +// Declaración de los puertos de la FRDM, Módem GSM y GPS. Serial GSM(PTE0,PTE1); // Puertos del FRDM para el Módem. Serial pc(USBTX,USBRX); GPS gps(PTE22, PTE23); // Puerto del FDRM para el GPS. @@ -46,8 +53,10 @@ char resp[6]; char tam[2]; char mensaje[100]; +char gprsBuffer[30]; //Variables enteras y caracteres +int g=0; int count; int i, K, LENOUT1, LENIN1, LENOUT2, LENIN2, C; int c=0; @@ -139,7 +148,7 @@ intToStr((int)fpart, res + i + 1, afterpoint); } } - +//++++++++++++++++++++++++++++++++++++libreria para vaciar el modem+++++++++++++++++++++++++++++++++++++++++++++++++++++++ void FlushGSM(void) { char1 = 0; while (GSM.readable()){ @@ -147,12 +156,12 @@ } return; } - +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void callback(){ // Note: you need to actually read from the serial to clear the RX interrupt pc.printf("%c\n", GSM.getc()); } - +//----------------------------------------------------------------------------------------------------------------------------- // Esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de // $, count es lo que va a leer. Lo leido lo mete en buffer que es una cadena previamente definida // incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1 @@ -179,7 +188,7 @@ } return 0; } - +//-------------------------------------------------------------------------------------------------------------- // Esta función de abajo limpia o borra todo un "buffer" de tamaño "count", // lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena. // No retorna nada. @@ -188,13 +197,13 @@ buffer[i] = '\0'; } } - +//-------------------------------------------------------------------------------------------------------------- // Esta función de abajo envia un comando parametrizado como cadena // puede ser un comando tipo AT. void sendCmd(char *cmd){ GSM.puts(cmd); } - +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función de abajo espera la respuesta de un comando que debe ser idéntica a la cadena "resp" y un tiempo "timeout", // si todo sale bien retorna un cero que en la programacion hay que validar, // si algo sale mal (no se parece o se demora mucho) retorna -1 que debera validarse con alguna expresion logica. @@ -222,7 +231,7 @@ } return 0; } - +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función de abajo es muy completa y útil, se encarga de enviar el comando y esperar la respuesta. // Si todo sale bien retorna un cero (herencia de las funciones contenedoras) que en la programacion hay que validar // con alguna expresion lógica. @@ -230,12 +239,12 @@ sendCmd(cmd); return waitForResp(resp,timeout); } - +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función de abajo chequea que el módem este vivo, envia AT, le contesta con OK y espera 2 segundos. int powerCheck(void){ // Este comando se manda para verificar si el módem esta vivo o conectado. return sendCmdAndWaitForResp("AT\r\n", "OK", 2); } - +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función de abajo chequea el estado de la sim card // y si todo sale bien retorna un cero que en la programacion hay que validar // con alguna expresión lógica. @@ -258,7 +267,7 @@ } return 0; } - +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función de abajo chequea la calidad de la señal // y si todo sale bien retorna con el valor de señal útil o un -1 si no es aceptable, en la programacion hay que validar // con alguna expresión lógica. @@ -280,7 +289,7 @@ } return index; } - +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta funcion de abajo inicaliza el módem. Se compone de un grupo de subfunciones ya definidas previamente // primero chequea que este vivo, // segundo chequea el estado de la simcard, @@ -307,7 +316,7 @@ LedVerde=0; return 0; } - +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX // y si todo sale bien retorna un cero que en la programacion hay que validar // con alguna expresión lógica. @@ -330,7 +339,7 @@ } return 0; } - +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función de abajo borra mensajes SMS del modem // y si todo sale bien retorna un cero que en la programacion hay que validar // con alguna expresion logica. @@ -340,19 +349,20 @@ sendCmd(cmd); return 0; } - +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Esta función devuelve la confirmacion del mensaje a quien lo envio. int recibe_ok(){ + pc.printf("AT+CMGS=27\n\r"); GSM.printf("AT+CMGS=27\n\r"); - pc.printf("AT+CMGS=27\n\r"); - wait_ms(100); + wait(1); GSM.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel); - pc.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel); - wait_ms(100); - GSM.putc((char)0x1A); + GSM.printf("\n\r"); + pc.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF\n\r",tel); + pc.printf("\n\r");//control+Z + wait(1); return 0; } - +//******************************************************************************************************************************* // Programas a ejecutar. int main(){ //configuramos los puertos seriales @@ -362,22 +372,44 @@ LedRojo = 1; LedAzul = 1; LedRojo = 0; // PRENDO EL LED ROJO - // Quito el eco del modem - - // CONFIGURACIÓN DEL MODEM GSM (TELEFONO CELULAR SIEMENS A56i). - inicio1: + valvula=1; // se enciende la valvula por defecto + +//****************** CONFIGURACIÓN DEL MODEM GSM (TELEFONO CELULAR SIEMENS A56i). +inicio1: ret = init(); - if(ret==0){ - LedRojo = 1; - LedVerde = 0; // Apagar LED Verde para confirmar la comunicación con el módem. - pc.printf("Modem configurado\n"); + if(ret==0){ // esta bien conectado el modem GSM......................................................................... + LedRojo = 1; // apagar led rojo + LedVerde = 0; // Enciende LED Verde para confirmar la comunicación OK con el módem. + pc.printf("Modem configurado\n");//envia mensaje a la terminal........................................................ } else{ wait(1); - goto inicio1; + goto inicio1; // se hace un reintento de conexion o el sistema no funcionara } - while(1){ +//Luego se verifica GPS bien conectado (si esta habilitado por dip sw)y recibiendo satelites + if(!sin_gps){ + pc.printf("SIN GPS\n\r");//confirma con teminal que no se habilito el gps + goto seguir9;// de inmediato funcionara sin gps + } +//*****************************************Test para un GPS bien instalado*********************************************** + +//******************************************esta bien el GPS***************************************************************** + pc.printf("CON GPS\n\r"); + g=gps.sample(); + if(g){ + LedAzul=0; + pc.printf("GPS--OK\n\r"); + } + +seguir9: + +//**********************inicia codigo ciclico********************************************** +//**********************inicia codigo ciclico********************************************** +//**********************inicia codigo ciclico********************************************** + +//****************DESDE ACA SE LEE CUALQUIER MENSAJE SMS ENTRANTE************************** + while(1){ if (GSM.readable()){ readBuffer(buffer,110); pc.printf("%s\r\n",buffer); @@ -415,12 +447,36 @@ // Decodificación del mensaje + // Comparar el mensaje deleteSMS(1); // Se borran los mensajes por medio de una función - readBuffer(buffer, 200); + readBuffer(buffer, 110); +//*************************SEFGUNDO CASO ACTIVAR SALIDAS************************************ } +//.................activar valvula de combustible...............On..on....................... + if((strncmp("4F37", msg, 4) == 0) || (strncmp("6F37", msg, 4) == 0)){ + recibe_ok(); + valvula = 1; // Encender valvula. + + } +// ...................................................... off y Off........................ + if((strncmp("4FB319", msg, 6) == 0) || (strncmp("6FB319", msg, 6) == 0)){ + recibe_ok(); + valvula = 0; // apagar valvula. + + } + +//............................Envia un Pulso Para Puerta Pulso...D03A7BFE06 pulso.F03A7BFE06.............. + if((strncmp("D03A7BFE06", msg, 10) == 0) || (strncmp("F03A7BFE06", msg, 10) == 0)){ + recibe_ok();//CONFIRMACION DE RECEPCION REMOTA + puerta = 1; // Encender Puerta. + wait(7);//pulso de 7 segundos + puerta = 0;//apaga puerta + + } + // COMPARA resp con "E3F75B4E2EBBC3E4F01C" que es "coordenadas", o "C3F75B4E2EBBC3E4F01C" que es "Coordenadas". if((strncmp("E3F75B4E2EBBC3E4F01C", msg, 20) == 0) || (strncmp("C3F75B4E2EBBC3E4F01C", msg, 20) == 0)){ - //recibe_ok(); + recibe_ok(); LedVerde = 1; // Encender LED azul. LedAzul = 0; wait(2);