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"

Dependencies:   mbed GPS_G

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);