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

Dependencies:   mbed GPS_G

Conexion propuesta de celular siemens A56i y La FRDMKL25Z /media/uploads/tony63/imgb.jpg Se puede emular un GPS usando una aplicación de Proteus /media/uploads/tony63/imgc.jpg

Revision:
3:8aef67673965
Parent:
2:ea6275d1222f
--- 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);