Equipo Azul

Dependencies:   mbed GPS_G

Committer:
Giovani_Cardona
Date:
Fri Aug 30 21:27:47 2019 +0000
Revision:
5:031df46c9ae5
Parent:
4:b1da40a75b2a
Equipo Azul

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Giovani_Cardona 5:031df46c9ae5 1 //----------Equipo Azul-------
tony63 3:8aef67673965 2 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tony63 3:8aef67673965 3 // Programa para establecer la comunicación con un módem Siemens A56 y un modulo FRDMKL25Z
tony63 3:8aef67673965 4 // opera como rastreador satelital para Geolocalizacion.
tony63 3:8aef67673965 5 // Por la UART (1) se conecta el MODEM y por la uart (2) el GPS (se lee en modo NEMEA)
tony63 3:8aef67673965 6 // Este sistema genera una cadena de geolocalizacion para GoogleMaps con las coordenadas locales
tony63 3:8aef67673965 7 // Si previamente se envia el mensaje (Coordenadas o coordenadas)
tony63 3:8aef67673965 8 // El sistema ademas recibe ordenes de tipo mensaje GSM PDU para accionar cargas
tony63 3:8aef67673965 9 // 1----Una supuesta valvula de combustible (On y Off.....on y off......)
tony63 3:8aef67673965 10 // 2----Una cantonera para cerradura electrica (Pulso o pulso) (pulso de 7 segundos)
tony63 3:8aef67673965 11 // Este sistema responde con un mensaje si el mensaje fue recibido (Mensaje Recibido)
tony63 3:8aef67673965 12 //
tony63 3:8aef67673965 13 // Adicionalmente este sistema mide un valor analogico en respuesta al mensaje..(Voltaje o voltaje)
tony63 3:8aef67673965 14 // El sistema dispone de un jumper que permite operar el sistema con o sin GPS (jumper a tierra)
tony63 3:8aef67673965 15 // El sistema detecta si el modem GSM esta bien conectado configurado y respondiendo correctamente
tony63 3:8aef67673965 16 // El sistema detecta si el GPS emite cadenas NEMEA y señaliza con un led si es exitosa la conexion
tony63 3:8aef67673965 17 // Presenta borrado automatico de SMS entrantes para evitar perdida de sincronismo en la deteccion
tony63 3:8aef67673965 18 // de cadenas y prefijos.
tony63 3:8aef67673965 19 // Este codigo compila sin problemas para un modulo chino bluepill STM32F103
tony63 3:8aef67673965 20 // con las modificaciones adecuadas de puertos y leds
joshema216 2:ea6275d1222f 21
tony63 3:8aef67673965 22 //+++++++++++++++++++++++++++++++ARCHIVOS INCLUIDOS*************************************************************************
procesadores_FAC 0:b2a6aa7c0c8c 23 #include "mbed.h"
procesadores_FAC 0:b2a6aa7c0c8c 24 #include "DebouncedIn.h"
procesadores_FAC 0:b2a6aa7c0c8c 25 #include "stdio.h"
procesadores_FAC 0:b2a6aa7c0c8c 26 #include "string.h"
procesadores_FAC 0:b2a6aa7c0c8c 27 #include "GPS.h"
joshema216 2:ea6275d1222f 28
procesadores_FAC 0:b2a6aa7c0c8c 29 Timer t;
tony63 3:8aef67673965 30 //++++++++++++++++++++++++++++++++++++salidas y entradas digitales+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
procesadores_FAC 0:b2a6aa7c0c8c 31 DigitalOut LedVerde(LED2);
procesadores_FAC 0:b2a6aa7c0c8c 32 DigitalOut LedRojo(LED1);
procesadores_FAC 0:b2a6aa7c0c8c 33 DigitalOut LedAzul(LED3);
tony63 3:8aef67673965 34 DigitalOut valvula(PTC5);//salida de la valvula
tony63 3:8aef67673965 35 DigitalOut puerta(PTC6);//salida de cerradura magnetica (en caso de usarlo en casa o desbloquear puertas de carro)
tony63 3:8aef67673965 36 DigitalIn sin_gps(PTA13);
procesadores_FAC 0:b2a6aa7c0c8c 37
joshema216 2:ea6275d1222f 38 // Entrada análoga
joshema216 2:ea6275d1222f 39 AnalogIn v(PTB0);
joshema216 2:ea6275d1222f 40 float medi;
joshema216 2:ea6275d1222f 41
tony63 3:8aef67673965 42 // Declaración de los puertos de la FRDM, Módem GSM y GPS.
joshema216 2:ea6275d1222f 43 Serial GSM(PTE0,PTE1); // Puertos del FRDM para el Módem.
procesadores_FAC 0:b2a6aa7c0c8c 44 Serial pc(USBTX,USBRX);
joshema216 2:ea6275d1222f 45 GPS gps(PTE22, PTE23); // Puerto del FDRM para el GPS.
procesadores_FAC 0:b2a6aa7c0c8c 46
joshema216 2:ea6275d1222f 47 // Declaración de variables
joshema216 2:ea6275d1222f 48 // Cadenas de caracteres con las que se va a trabajar.
joshema216 2:ea6275d1222f 49 char DE1[255];
joshema216 2:ea6275d1222f 50 char DS1[255];
joshema216 2:ea6275d1222f 51 char DE2[255];
joshema216 2:ea6275d1222f 52 char DS2[255];
procesadores_FAC 0:b2a6aa7c0c8c 53 char buffer[512];
joshema216 2:ea6275d1222f 54 char resp[6];
joshema216 2:ea6275d1222f 55 char tam[2];
procesadores_FAC 0:b2a6aa7c0c8c 56 char mensaje[100];
tony63 3:8aef67673965 57 char gprsBuffer[30];
joshema216 2:ea6275d1222f 58
AaronGonzalez 1:e2bd083802c0 59 //Variables enteras y caracteres
tony63 3:8aef67673965 60 int g=0;
procesadores_FAC 0:b2a6aa7c0c8c 61 int count;
joshema216 2:ea6275d1222f 62 int i, K, LENOUT1, LENIN1, LENOUT2, LENIN2, C;
procesadores_FAC 0:b2a6aa7c0c8c 63 int c=0;
procesadores_FAC 0:b2a6aa7c0c8c 64 char r[]="";
procesadores_FAC 0:b2a6aa7c0c8c 65 char msg[256];
procesadores_FAC 0:b2a6aa7c0c8c 66 char char1;
joshema216 2:ea6275d1222f 67 int ind;
joshema216 2:ea6275d1222f 68 float med;
joshema216 2:ea6275d1222f 69 char outmed[16], outmedn[16];
joshema216 2:ea6275d1222f 70 int ret = 1;
joshema216 2:ea6275d1222f 71
joshema216 2:ea6275d1222f 72 // Adquisición de números de teléfono, emisor - receptor
joshema216 2:ea6275d1222f 73 char tel[15];
procesadores_FAC 0:b2a6aa7c0c8c 74
joshema216 2:ea6275d1222f 75 // El GPS entregará al celular coordenadas expresadas en latitud y longitud
joshema216 2:ea6275d1222f 76 // según la ubicación que encuentre, por lo tanto se declaran estas variables.
procesadores_FAC 0:b2a6aa7c0c8c 77 float lo,la;
joshema216 2:ea6275d1222f 78 char clo[255], cla[255]; // Cadenas a capturar para latitud y longitud.
joshema216 2:ea6275d1222f 79 char la_lo[255], volt[255];
joshema216 2:ea6275d1222f 80
joshema216 2:ea6275d1222f 81 // Cadena de google maps
procesadores_FAC 0:b2a6aa7c0c8c 82 char http2[255];
procesadores_FAC 0:b2a6aa7c0c8c 83 char http[] = "http://maps.google.com/maps?q=";
procesadores_FAC 0:b2a6aa7c0c8c 84 char buf[100];
procesadores_FAC 0:b2a6aa7c0c8c 85
joshema216 2:ea6275d1222f 86 // Relleno de datos propio del protocolo de SMS.
joshema216 2:ea6275d1222f 87 char relle1[] = "0011000A91";
joshema216 2:ea6275d1222f 88 char relle2[] = "0000AA";
procesadores_FAC 0:b2a6aa7c0c8c 89
joshema216 2:ea6275d1222f 90 // Reverses a string 'str' of length 'len'
joshema216 2:ea6275d1222f 91 // driver program to test above funtion.
joshema216 2:ea6275d1222f 92 void reverse(char *str, int len)
joshema216 2:ea6275d1222f 93 {
joshema216 2:ea6275d1222f 94 int i=0, j=len-1, temp;
joshema216 2:ea6275d1222f 95 while (i<j)
joshema216 2:ea6275d1222f 96 {
joshema216 2:ea6275d1222f 97 temp = str[i];
joshema216 2:ea6275d1222f 98 str[i] = str[j];
joshema216 2:ea6275d1222f 99 str[j] = temp;
joshema216 2:ea6275d1222f 100 i++; j--;
joshema216 2:ea6275d1222f 101 }
joshema216 2:ea6275d1222f 102 }
joshema216 2:ea6275d1222f 103
joshema216 2:ea6275d1222f 104 // Converts a given integer x to string str[]. d is the number
joshema216 2:ea6275d1222f 105 // of digits required in output. If d is more than the number
joshema216 2:ea6275d1222f 106 // of digits in x, then 0s are added at the beginning.
joshema216 2:ea6275d1222f 107 int intToStr(int x, char str[], int d)
joshema216 2:ea6275d1222f 108 {
joshema216 2:ea6275d1222f 109 int i = 0;
joshema216 2:ea6275d1222f 110 while (x)
joshema216 2:ea6275d1222f 111 {
joshema216 2:ea6275d1222f 112 str[i++] = (x%10) + '0';
joshema216 2:ea6275d1222f 113 x = x/10;
joshema216 2:ea6275d1222f 114 }
joshema216 2:ea6275d1222f 115
joshema216 2:ea6275d1222f 116 // If number of digits required is more, then
joshema216 2:ea6275d1222f 117 // add 0s at the beginning
joshema216 2:ea6275d1222f 118 while (i < d)
joshema216 2:ea6275d1222f 119 str[i++] = '0';
joshema216 2:ea6275d1222f 120
joshema216 2:ea6275d1222f 121 reverse(str, i);
joshema216 2:ea6275d1222f 122 str[i] = '\0';
joshema216 2:ea6275d1222f 123 return i;
joshema216 2:ea6275d1222f 124 }
procesadores_FAC 0:b2a6aa7c0c8c 125
joshema216 2:ea6275d1222f 126 // Converts a floating point number to string.
joshema216 2:ea6275d1222f 127 void ftoa(float n, char *res, int afterpoint)
joshema216 2:ea6275d1222f 128 {
joshema216 2:ea6275d1222f 129 // Extract integer part
joshema216 2:ea6275d1222f 130 int ipart = (int)n;
joshema216 2:ea6275d1222f 131
joshema216 2:ea6275d1222f 132 // Extract floating part
joshema216 2:ea6275d1222f 133 float fpart = n - (float)ipart;
joshema216 2:ea6275d1222f 134
joshema216 2:ea6275d1222f 135 // convert integer part to string
joshema216 2:ea6275d1222f 136 int i = intToStr(ipart, res, 0);
joshema216 2:ea6275d1222f 137
joshema216 2:ea6275d1222f 138 // check for display option after point
joshema216 2:ea6275d1222f 139 if (afterpoint != 0)
joshema216 2:ea6275d1222f 140 {
joshema216 2:ea6275d1222f 141 res[i] = '.'; // add dot
procesadores_FAC 0:b2a6aa7c0c8c 142
joshema216 2:ea6275d1222f 143 // Get the value of fraction part upto given no.
joshema216 2:ea6275d1222f 144 // of points after dot. The third parameter is needed
joshema216 2:ea6275d1222f 145 // to handle cases like 233.007
joshema216 2:ea6275d1222f 146 float fp=10;
joshema216 2:ea6275d1222f 147 fpart =fpart * pow(fp,afterpoint);
joshema216 2:ea6275d1222f 148
joshema216 2:ea6275d1222f 149 intToStr((int)fpart, res + i + 1, afterpoint);
joshema216 2:ea6275d1222f 150 }
joshema216 2:ea6275d1222f 151 }
tony63 3:8aef67673965 152 //++++++++++++++++++++++++++++++++++++libreria para vaciar el modem+++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 153 void FlushGSM(void) {
joshema216 2:ea6275d1222f 154 char1 = 0;
joshema216 2:ea6275d1222f 155 while (GSM.readable()){
joshema216 2:ea6275d1222f 156 char1 = GSM.getc();
joshema216 2:ea6275d1222f 157 }
joshema216 2:ea6275d1222f 158 return;
joshema216 2:ea6275d1222f 159 }
tony63 3:8aef67673965 160 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 161 void callback(){
joshema216 2:ea6275d1222f 162 // Note: you need to actually read from the serial to clear the RX interrupt
joshema216 2:ea6275d1222f 163 pc.printf("%c\n", GSM.getc());
joshema216 2:ea6275d1222f 164 }
tony63 3:8aef67673965 165 //-----------------------------------------------------------------------------------------------------------------------------
joshema216 2:ea6275d1222f 166 // Esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de
joshema216 2:ea6275d1222f 167 // $, count es lo que va a leer. Lo leido lo mete en buffer que es una cadena previamente definida
joshema216 2:ea6275d1222f 168 // incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1
joshema216 2:ea6275d1222f 169 int readBuffer(char *buffer,int count){
procesadores_FAC 0:b2a6aa7c0c8c 170 int i=0;
joshema216 2:ea6275d1222f 171 t.start(); // start timer
procesadores_FAC 0:b2a6aa7c0c8c 172 while(1) {
procesadores_FAC 0:b2a6aa7c0c8c 173 while (GSM.readable()) {
procesadores_FAC 0:b2a6aa7c0c8c 174 char c = GSM.getc();
procesadores_FAC 0:b2a6aa7c0c8c 175 if (c == '\r' || c == '\n') c = '$';
procesadores_FAC 0:b2a6aa7c0c8c 176 buffer[i++] = c;
procesadores_FAC 0:b2a6aa7c0c8c 177 if(i > count)break;
procesadores_FAC 0:b2a6aa7c0c8c 178 }
joshema216 2:ea6275d1222f 179 if(i > count)break;
procesadores_FAC 0:b2a6aa7c0c8c 180 if(t.read() > 3) {
procesadores_FAC 0:b2a6aa7c0c8c 181 t.stop();
procesadores_FAC 0:b2a6aa7c0c8c 182 t.reset();
procesadores_FAC 0:b2a6aa7c0c8c 183 break;
procesadores_FAC 0:b2a6aa7c0c8c 184 }
procesadores_FAC 0:b2a6aa7c0c8c 185 }
procesadores_FAC 0:b2a6aa7c0c8c 186 wait(0.5);
joshema216 2:ea6275d1222f 187 while(GSM.readable()){ // display the other thing..
joshema216 2:ea6275d1222f 188 char c = GSM.getc();
joshema216 2:ea6275d1222f 189 }
joshema216 2:ea6275d1222f 190 return 0;
joshema216 2:ea6275d1222f 191 }
tony63 3:8aef67673965 192 //--------------------------------------------------------------------------------------------------------------
joshema216 2:ea6275d1222f 193 // Esta función de abajo limpia o borra todo un "buffer" de tamaño "count",
joshema216 2:ea6275d1222f 194 // lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena.
joshema216 2:ea6275d1222f 195 // No retorna nada.
joshema216 2:ea6275d1222f 196 void cleanBuffer(char *buffer, int count){
joshema216 2:ea6275d1222f 197 for(int i=0; i < count; i++) {
joshema216 2:ea6275d1222f 198 buffer[i] = '\0';
joshema216 2:ea6275d1222f 199 }
joshema216 2:ea6275d1222f 200 }
tony63 3:8aef67673965 201 //--------------------------------------------------------------------------------------------------------------
joshema216 2:ea6275d1222f 202 // Esta función de abajo envia un comando parametrizado como cadena
joshema216 2:ea6275d1222f 203 // puede ser un comando tipo AT.
joshema216 2:ea6275d1222f 204 void sendCmd(char *cmd){
joshema216 2:ea6275d1222f 205 GSM.puts(cmd);
joshema216 2:ea6275d1222f 206 }
tony63 3:8aef67673965 207 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 208 // Esta función de abajo espera la respuesta de un comando que debe ser idéntica a la cadena "resp" y un tiempo "timeout",
joshema216 2:ea6275d1222f 209 // si todo sale bien retorna un cero que en la programacion hay que validar,
joshema216 2:ea6275d1222f 210 // si algo sale mal (no se parece o se demora mucho) retorna -1 que debera validarse con alguna expresion logica.
joshema216 2:ea6275d1222f 211 int waitForResp(char *resp, int timeout){
joshema216 2:ea6275d1222f 212 int len = strlen(resp);
joshema216 2:ea6275d1222f 213 int sum=0;
joshema216 2:ea6275d1222f 214 t.start();
joshema216 2:ea6275d1222f 215
joshema216 2:ea6275d1222f 216 while(1) {
joshema216 2:ea6275d1222f 217 if(GSM.readable()) {
joshema216 2:ea6275d1222f 218 char c = GSM.getc();
joshema216 2:ea6275d1222f 219 sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
joshema216 2:ea6275d1222f 220 if(sum == len)break; //ya acabo se sale
joshema216 2:ea6275d1222f 221 }
joshema216 2:ea6275d1222f 222 if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo
joshema216 2:ea6275d1222f 223 t.stop();
joshema216 2:ea6275d1222f 224 t.reset();
joshema216 2:ea6275d1222f 225 return -1;
joshema216 2:ea6275d1222f 226 }
joshema216 2:ea6275d1222f 227 }
joshema216 2:ea6275d1222f 228 t.stop(); // stop timer antes de retornar
joshema216 2:ea6275d1222f 229 t.reset(); // clear timer
joshema216 2:ea6275d1222f 230 while(GSM.readable()) { // display the other thing..
procesadores_FAC 0:b2a6aa7c0c8c 231 char c = GSM.getc();
procesadores_FAC 0:b2a6aa7c0c8c 232 }
procesadores_FAC 0:b2a6aa7c0c8c 233 return 0;
procesadores_FAC 0:b2a6aa7c0c8c 234 }
tony63 3:8aef67673965 235 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 236 // Esta función de abajo es muy completa y útil, se encarga de enviar el comando y esperar la respuesta.
joshema216 2:ea6275d1222f 237 // Si todo sale bien retorna un cero (herencia de las funciones contenedoras) que en la programacion hay que validar
joshema216 2:ea6275d1222f 238 // con alguna expresion lógica.
joshema216 2:ea6275d1222f 239 int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout){
joshema216 2:ea6275d1222f 240 sendCmd(cmd);
joshema216 2:ea6275d1222f 241 return waitForResp(resp,timeout);
joshema216 2:ea6275d1222f 242 }
tony63 3:8aef67673965 243 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 244 // Esta función de abajo chequea que el módem este vivo, envia AT, le contesta con OK y espera 2 segundos.
joshema216 2:ea6275d1222f 245 int powerCheck(void){ // Este comando se manda para verificar si el módem esta vivo o conectado.
joshema216 2:ea6275d1222f 246 return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
joshema216 2:ea6275d1222f 247 }
tony63 3:8aef67673965 248 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 249 // Esta función de abajo chequea el estado de la sim card
joshema216 2:ea6275d1222f 250 // y si todo sale bien retorna un cero que en la programacion hay que validar
joshema216 2:ea6275d1222f 251 // con alguna expresión lógica.
joshema216 2:ea6275d1222f 252 int checkSIMStatus(void){
joshema216 2:ea6275d1222f 253 char gprsBuffer[30];
joshema216 2:ea6275d1222f 254 int count = 0;
joshema216 2:ea6275d1222f 255 cleanBuffer(gprsBuffer, 30);
joshema216 2:ea6275d1222f 256 while(count < 3){
joshema216 2:ea6275d1222f 257 sendCmd("AT+CPIN?\r\n");
joshema216 2:ea6275d1222f 258 readBuffer(gprsBuffer,30);
joshema216 2:ea6275d1222f 259 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))){
joshema216 2:ea6275d1222f 260 break;
joshema216 2:ea6275d1222f 261 }
joshema216 2:ea6275d1222f 262 count++;
joshema216 2:ea6275d1222f 263 wait(1);
joshema216 2:ea6275d1222f 264 }
joshema216 2:ea6275d1222f 265
joshema216 2:ea6275d1222f 266 if(count == 3){
joshema216 2:ea6275d1222f 267 return -1;
joshema216 2:ea6275d1222f 268 }
joshema216 2:ea6275d1222f 269 return 0;
joshema216 2:ea6275d1222f 270 }
tony63 3:8aef67673965 271 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 272 // Esta función de abajo chequea la calidad de la señal
joshema216 2:ea6275d1222f 273 // 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
joshema216 2:ea6275d1222f 274 // con alguna expresión lógica.
joshema216 2:ea6275d1222f 275 int checkSignalStrength(void){
joshema216 2:ea6275d1222f 276 char gprsBuffer[100];
joshema216 2:ea6275d1222f 277 int index, count = 0;
joshema216 2:ea6275d1222f 278 cleanBuffer(gprsBuffer,100);
joshema216 2:ea6275d1222f 279 while(count < 3){
joshema216 2:ea6275d1222f 280 sendCmd("AT+CSQ\r\n");
joshema216 2:ea6275d1222f 281 readBuffer(gprsBuffer,25);
joshema216 2:ea6275d1222f 282 if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
joshema216 2:ea6275d1222f 283 break;
joshema216 2:ea6275d1222f 284 }
joshema216 2:ea6275d1222f 285 count++;
joshema216 2:ea6275d1222f 286 wait(1);
joshema216 2:ea6275d1222f 287 }
joshema216 2:ea6275d1222f 288 if(count == 3){
joshema216 2:ea6275d1222f 289 return -1;
joshema216 2:ea6275d1222f 290 }
joshema216 2:ea6275d1222f 291 return index;
joshema216 2:ea6275d1222f 292 }
tony63 3:8aef67673965 293 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 294 // Esta funcion de abajo inicaliza el módem. Se compone de un grupo de subfunciones ya definidas previamente
joshema216 2:ea6275d1222f 295 // primero chequea que este vivo,
joshema216 2:ea6275d1222f 296 // segundo chequea el estado de la simcard,
joshema216 2:ea6275d1222f 297 // tercero chequea la intencidad de señal celular,
joshema216 2:ea6275d1222f 298 // cuarto aplica la configuracion
joshema216 2:ea6275d1222f 299 // y si todo sale bien retorna un cero que en la programacion hay que validar
joshema216 2:ea6275d1222f 300 // con alguna expresión lógica.
joshema216 2:ea6275d1222f 301 int init(){
joshema216 2:ea6275d1222f 302 if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){
joshema216 2:ea6275d1222f 303 return -1;
joshema216 2:ea6275d1222f 304 }
joshema216 2:ea6275d1222f 305 if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){
joshema216 2:ea6275d1222f 306 return -1;
joshema216 2:ea6275d1222f 307 }
joshema216 2:ea6275d1222f 308 if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){
joshema216 2:ea6275d1222f 309 return -1;
joshema216 2:ea6275d1222f 310 }
joshema216 2:ea6275d1222f 311 if (0 != sendCmdAndWaitForResp("AT+CBST=7,0,1\r\n", "OK", 3)){ //velocidad fija a 9600, modem asincronico no transparente
joshema216 2:ea6275d1222f 312 return -1;
joshema216 2:ea6275d1222f 313 }
joshema216 2:ea6275d1222f 314 if (0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 3)){ //se le quita el eco al modem GSM
joshema216 2:ea6275d1222f 315 return -1;
joshema216 2:ea6275d1222f 316 }
joshema216 2:ea6275d1222f 317 LedVerde=0;
joshema216 2:ea6275d1222f 318 return 0;
joshema216 2:ea6275d1222f 319 }
tony63 3:8aef67673965 320 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 321 // Esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX
joshema216 2:ea6275d1222f 322 // y si todo sale bien retorna un cero que en la programacion hay que validar
joshema216 2:ea6275d1222f 323 // con alguna expresión lógica.
joshema216 2:ea6275d1222f 324 int readSMSpdu(char *message, int index){
joshema216 2:ea6275d1222f 325 int i = 0;
joshema216 2:ea6275d1222f 326 char gprsBuffer[100];
joshema216 2:ea6275d1222f 327 char *p,*s;
joshema216 2:ea6275d1222f 328 GSM.printf("AT+CMGR=%d\r\n",index);
joshema216 2:ea6275d1222f 329 cleanBuffer(gprsBuffer,100);
joshema216 2:ea6275d1222f 330 readBuffer(gprsBuffer,100);
joshema216 2:ea6275d1222f 331 if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
joshema216 2:ea6275d1222f 332 return -1;
joshema216 2:ea6275d1222f 333 }
joshema216 2:ea6275d1222f 334 if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
joshema216 2:ea6275d1222f 335 p = s + 6;
joshema216 2:ea6275d1222f 336 while((*p != '$')&&(i < 5)) {
joshema216 2:ea6275d1222f 337 message[i++] = *(p++);
joshema216 2:ea6275d1222f 338 }
joshema216 2:ea6275d1222f 339 message[i] = '\0';
joshema216 2:ea6275d1222f 340 }
joshema216 2:ea6275d1222f 341 return 0;
joshema216 2:ea6275d1222f 342 }
tony63 3:8aef67673965 343 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 344 // Esta función de abajo borra mensajes SMS del modem
joshema216 2:ea6275d1222f 345 // y si todo sale bien retorna un cero que en la programacion hay que validar
joshema216 2:ea6275d1222f 346 // con alguna expresion logica.
joshema216 2:ea6275d1222f 347 int deleteSMS(int index){
joshema216 2:ea6275d1222f 348 char cmd[32];
Giovani_Cardona 4:b1da40a75b2a 349 snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
joshema216 2:ea6275d1222f 350 sendCmd(cmd);
joshema216 2:ea6275d1222f 351 return 0;
joshema216 2:ea6275d1222f 352 }
tony63 3:8aef67673965 353 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
joshema216 2:ea6275d1222f 354 // Esta función devuelve la confirmacion del mensaje a quien lo envio.
joshema216 2:ea6275d1222f 355 int recibe_ok(){
tony63 3:8aef67673965 356 pc.printf("AT+CMGS=27\n\r");
joshema216 2:ea6275d1222f 357 GSM.printf("AT+CMGS=27\n\r");
tony63 3:8aef67673965 358 wait(1);
joshema216 2:ea6275d1222f 359 GSM.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel);
tony63 3:8aef67673965 360 GSM.printf("\n\r");
tony63 3:8aef67673965 361 pc.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF\n\r",tel);
tony63 3:8aef67673965 362 pc.printf("\n\r");//control+Z
tony63 3:8aef67673965 363 wait(1);
joshema216 2:ea6275d1222f 364 return 0;
joshema216 2:ea6275d1222f 365 }
tony63 3:8aef67673965 366 //*******************************************************************************************************************************
joshema216 2:ea6275d1222f 367 // Programas a ejecutar.
joshema216 2:ea6275d1222f 368 int main(){
joshema216 2:ea6275d1222f 369 //configuramos los puertos seriales
joshema216 2:ea6275d1222f 370 GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
joshema216 2:ea6275d1222f 371 GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
joshema216 2:ea6275d1222f 372 LedVerde = 1; // APAGO LOS LEDS
joshema216 2:ea6275d1222f 373 LedRojo = 1;
joshema216 2:ea6275d1222f 374 LedAzul = 1;
joshema216 2:ea6275d1222f 375 LedRojo = 0; // PRENDO EL LED ROJO
tony63 3:8aef67673965 376 valvula=1; // se enciende la valvula por defecto
tony63 3:8aef67673965 377
tony63 3:8aef67673965 378 //****************** CONFIGURACIÓN DEL MODEM GSM (TELEFONO CELULAR SIEMENS A56i).
tony63 3:8aef67673965 379 inicio1:
joshema216 2:ea6275d1222f 380 ret = init();
tony63 3:8aef67673965 381 if(ret==0){ // esta bien conectado el modem GSM.........................................................................
tony63 3:8aef67673965 382 LedRojo = 1; // apagar led rojo
tony63 3:8aef67673965 383 LedVerde = 0; // Enciende LED Verde para confirmar la comunicación OK con el módem.
tony63 3:8aef67673965 384 pc.printf("Modem configurado\n");//envia mensaje a la terminal........................................................
joshema216 2:ea6275d1222f 385 }
joshema216 2:ea6275d1222f 386 else{
joshema216 2:ea6275d1222f 387 wait(1);
tony63 3:8aef67673965 388 goto inicio1; // se hace un reintento de conexion o el sistema no funcionara
joshema216 2:ea6275d1222f 389 }
joshema216 2:ea6275d1222f 390
tony63 3:8aef67673965 391 //Luego se verifica GPS bien conectado (si esta habilitado por dip sw)y recibiendo satelites
tony63 3:8aef67673965 392 if(!sin_gps){
tony63 3:8aef67673965 393 pc.printf("SIN GPS\n\r");//confirma con teminal que no se habilito el gps
tony63 3:8aef67673965 394 goto seguir9;// de inmediato funcionara sin gps
tony63 3:8aef67673965 395 }
tony63 3:8aef67673965 396 //*****************************************Test para un GPS bien instalado***********************************************
tony63 3:8aef67673965 397
tony63 3:8aef67673965 398 //******************************************esta bien el GPS*****************************************************************
tony63 3:8aef67673965 399 pc.printf("CON GPS\n\r");
tony63 3:8aef67673965 400 g=gps.sample();
tony63 3:8aef67673965 401 if(g){
tony63 3:8aef67673965 402 LedAzul=0;
tony63 3:8aef67673965 403 pc.printf("GPS--OK\n\r");
tony63 3:8aef67673965 404 }
tony63 3:8aef67673965 405
tony63 3:8aef67673965 406 seguir9:
tony63 3:8aef67673965 407
tony63 3:8aef67673965 408 //**********************inicia codigo ciclico**********************************************
tony63 3:8aef67673965 409 //**********************inicia codigo ciclico**********************************************
tony63 3:8aef67673965 410 //**********************inicia codigo ciclico**********************************************
tony63 3:8aef67673965 411
tony63 3:8aef67673965 412 //****************DESDE ACA SE LEE CUALQUIER MENSAJE SMS ENTRANTE**************************
tony63 3:8aef67673965 413 while(1){
joshema216 2:ea6275d1222f 414 if (GSM.readable()){
joshema216 2:ea6275d1222f 415 readBuffer(buffer,110);
joshema216 2:ea6275d1222f 416 pc.printf("%s\r\n",buffer);
joshema216 2:ea6275d1222f 417 for(i=0; i<5; i++){
joshema216 2:ea6275d1222f 418 resp[i] = buffer[i];
joshema216 2:ea6275d1222f 419 }
joshema216 2:ea6275d1222f 420
joshema216 2:ea6275d1222f 421 pc.printf("%s\r\n", resp);
joshema216 2:ea6275d1222f 422 if(strcmp("$$+CM", resp) == 0){ //COMPARA resp con "+CMTI"
joshema216 2:ea6275d1222f 423 pc.printf("Llego MSG\r\n");
joshema216 2:ea6275d1222f 424 cleanBuffer(buffer,10);
joshema216 2:ea6275d1222f 425 GSM.printf("AT+CMGL=0\r\n"); // Envío comando para leer mensaje
joshema216 2:ea6275d1222f 426 pc.printf("AT+CMGL=0\r\n");
joshema216 2:ea6275d1222f 427 //GSM.printf("AT+CMGD=0\r\n"); // Envío comando para borrar el mensaje.
joshema216 2:ea6275d1222f 428 readBuffer(buffer,110);
joshema216 2:ea6275d1222f 429 pc.printf("%s\r\n",buffer);
AaronGonzalez 1:e2bd083802c0 430
joshema216 2:ea6275d1222f 431 // Lectura el teléfono emisor
joshema216 2:ea6275d1222f 432 for(i=0; i<10; i++){
joshema216 2:ea6275d1222f 433 tel[i] = buffer[i+40];
joshema216 2:ea6275d1222f 434 }
joshema216 2:ea6275d1222f 435 pc.printf("Telefono: %c%c%c%c%c%c%c%c%c%c\r\n", tel[1], tel[0], tel[3], tel[2], tel[5], tel[4], tel[7], tel[6], tel[9], tel[8]);
joshema216 2:ea6275d1222f 436
joshema216 2:ea6275d1222f 437 // Lectura del tamaño
joshema216 2:ea6275d1222f 438 for(i=0;i<2;i++){
joshema216 2:ea6275d1222f 439 tam[i] = buffer[i + 68];
joshema216 2:ea6275d1222f 440 }
joshema216 2:ea6275d1222f 441 pc.printf("%s-\r\n", tam);
joshema216 2:ea6275d1222f 442
joshema216 2:ea6275d1222f 443 // Lectura del mensaje
joshema216 2:ea6275d1222f 444 for(i=0;i<26;i++){
joshema216 2:ea6275d1222f 445 msg[i] = buffer[i+70]; // Lee un mensaje de 26 caracteres máximo desde la posición 70 del buffer.
joshema216 2:ea6275d1222f 446 }
joshema216 2:ea6275d1222f 447 pc.printf("%s-\r\n", msg);
joshema216 2:ea6275d1222f 448
joshema216 2:ea6275d1222f 449 // Decodificación del mensaje
joshema216 2:ea6275d1222f 450
tony63 3:8aef67673965 451
joshema216 2:ea6275d1222f 452 // Comparar el mensaje
Giovani_Cardona 4:b1da40a75b2a 453 //if (deleteSMS(1) == 0){ // Se borran los mensajes por medio de una función GSM.printf("AT+CMGD=0\r\n");
Giovani_Cardona 4:b1da40a75b2a 454 // pc.printf("\n\nMSG borrado\r\n\n");
Giovani_Cardona 4:b1da40a75b2a 455 //}
tony63 3:8aef67673965 456 readBuffer(buffer, 110);
tony63 3:8aef67673965 457 //*************************SEFGUNDO CASO ACTIVAR SALIDAS************************************ }
tony63 3:8aef67673965 458 //.................activar valvula de combustible...............On..on.......................
tony63 3:8aef67673965 459 if((strncmp("4F37", msg, 4) == 0) || (strncmp("6F37", msg, 4) == 0)){
tony63 3:8aef67673965 460 recibe_ok();
tony63 3:8aef67673965 461 valvula = 1; // Encender valvula.
Giovani_Cardona 5:031df46c9ae5 462 GSM.printf("AT+CMGD=1r\n"); // Borra el mensaje actual (Posición "1").
Giovani_Cardona 4:b1da40a75b2a 463 pc.printf("\n%s\n\n", "Mensaje Borrado");
tony63 3:8aef67673965 464
tony63 3:8aef67673965 465 }
tony63 3:8aef67673965 466 // ...................................................... off y Off........................
tony63 3:8aef67673965 467 if((strncmp("4FB319", msg, 6) == 0) || (strncmp("6FB319", msg, 6) == 0)){
tony63 3:8aef67673965 468 recibe_ok();
tony63 3:8aef67673965 469 valvula = 0; // apagar valvula.
Giovani_Cardona 4:b1da40a75b2a 470 GSM.printf("AT+CMGD=1\r\n"); // Borra el mensaje actual (Posición "1").
Giovani_Cardona 4:b1da40a75b2a 471 pc.printf("\n%s\n\n", "Mensaje Borrado");
tony63 3:8aef67673965 472
tony63 3:8aef67673965 473 }
tony63 3:8aef67673965 474
tony63 3:8aef67673965 475 //............................Envia un Pulso Para Puerta Pulso...D03A7BFE06 pulso.F03A7BFE06..............
tony63 3:8aef67673965 476 if((strncmp("D03A7BFE06", msg, 10) == 0) || (strncmp("F03A7BFE06", msg, 10) == 0)){
tony63 3:8aef67673965 477 recibe_ok();//CONFIRMACION DE RECEPCION REMOTA
tony63 3:8aef67673965 478 puerta = 1; // Encender Puerta.
tony63 3:8aef67673965 479 wait(7);//pulso de 7 segundos
tony63 3:8aef67673965 480 puerta = 0;//apaga puerta
Giovani_Cardona 4:b1da40a75b2a 481 GSM.printf("AT+CMGD=1\r\n"); // Borra el mensaje actual (Posición "1").
Giovani_Cardona 4:b1da40a75b2a 482 pc.printf("\n%s\n\n", "Mensaje Borrado");
tony63 3:8aef67673965 483
tony63 3:8aef67673965 484 }
tony63 3:8aef67673965 485
joshema216 2:ea6275d1222f 486 // COMPARA resp con "E3F75B4E2EBBC3E4F01C" que es "coordenadas", o "C3F75B4E2EBBC3E4F01C" que es "Coordenadas".
joshema216 2:ea6275d1222f 487 if((strncmp("E3F75B4E2EBBC3E4F01C", msg, 20) == 0) || (strncmp("C3F75B4E2EBBC3E4F01C", msg, 20) == 0)){
tony63 3:8aef67673965 488 recibe_ok();
joshema216 2:ea6275d1222f 489 LedVerde = 1; // Encender LED azul.
joshema216 2:ea6275d1222f 490 LedAzul = 0;
joshema216 2:ea6275d1222f 491 wait(2);
joshema216 2:ea6275d1222f 492
joshema216 2:ea6275d1222f 493 if(gps.sample()){
joshema216 2:ea6275d1222f 494 lo = gps.longitude;
joshema216 2:ea6275d1222f 495 la = gps.latitude;
joshema216 2:ea6275d1222f 496 pc.printf("\nLongitud entera = %f, Latitud entera = %f\n", lo, la);
joshema216 2:ea6275d1222f 497 //wait(0.5);
joshema216 2:ea6275d1222f 498
joshema216 2:ea6275d1222f 499 //LONGITUD
joshema216 2:ea6275d1222f 500 sprintf (clo, "%f", lo);
joshema216 2:ea6275d1222f 501 pc.printf ("\nLongitud = %s\n",clo);
joshema216 2:ea6275d1222f 502 //wait(0.5);
joshema216 2:ea6275d1222f 503
joshema216 2:ea6275d1222f 504 // LATITUD
joshema216 2:ea6275d1222f 505 sprintf (cla, "%f", la);
joshema216 2:ea6275d1222f 506 pc.printf ( "\nLatitud = %s\n",cla);
joshema216 2:ea6275d1222f 507 //wait(0.5);
joshema216 2:ea6275d1222f 508
joshema216 2:ea6275d1222f 509 // Concatenando las cadenas de Latitud y Longitud
joshema216 2:ea6275d1222f 510 strcpy(la_lo,cla);
joshema216 2:ea6275d1222f 511 strcat(la_lo,",");
joshema216 2:ea6275d1222f 512 strcat(la_lo,clo);
joshema216 2:ea6275d1222f 513 pc.printf("\nLatitud, Longitud: %s\n",la_lo);
procesadores_FAC 0:b2a6aa7c0c8c 514
joshema216 2:ea6275d1222f 515 //Ahora se juntan las cadenas obtenidas y se agrega el protocolo de transferencia de hipertextos http
joshema216 2:ea6275d1222f 516 strcpy(DE1,http);
joshema216 2:ea6275d1222f 517 strcat(DE1,la_lo);
joshema216 2:ea6275d1222f 518 pc.printf("\nDireccion: %s\n",DE1);
joshema216 2:ea6275d1222f 519 pc.printf("\n");
joshema216 2:ea6275d1222f 520 LENIN1 = strlen(DE1);
joshema216 2:ea6275d1222f 521
joshema216 2:ea6275d1222f 522 //Conversión a octetos.
joshema216 2:ea6275d1222f 523 K = 0;
joshema216 2:ea6275d1222f 524 C = 0;
joshema216 2:ea6275d1222f 525 for (i = 0; i < LENIN1; i++){
joshema216 2:ea6275d1222f 526 DS1[i] = DE1[i + C] >> K | DE1[i + C + 1] << (7 - K);
joshema216 2:ea6275d1222f 527 if(DS1[i] == 0x00) {LENOUT1 = i; goto salir1;}
joshema216 2:ea6275d1222f 528 K++;
joshema216 2:ea6275d1222f 529 if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
joshema216 2:ea6275d1222f 530 }
joshema216 2:ea6275d1222f 531
joshema216 2:ea6275d1222f 532 salir1:
joshema216 2:ea6275d1222f 533 for (i = 0; i < LENIN1; i++){
joshema216 2:ea6275d1222f 534 pc.printf("%X", DE1[i]);
joshema216 2:ea6275d1222f 535 }
joshema216 2:ea6275d1222f 536
joshema216 2:ea6275d1222f 537 pc.printf(":\r\n");
joshema216 2:ea6275d1222f 538 for (i = 0; i < LENOUT1; i++){
joshema216 2:ea6275d1222f 539 pc.printf("%2X", DS1[i]&0x000000FF);
joshema216 2:ea6275d1222f 540 }
joshema216 2:ea6275d1222f 541 pc.printf("\r\nLENOUT GPS: %d, LENIN GPS: %2X\r\n", LENOUT1, LENIN1);
joshema216 2:ea6275d1222f 542
joshema216 2:ea6275d1222f 543 // Concatenación del mensaje en formato PDU y envío del mismo.
joshema216 2:ea6275d1222f 544 ind = 14 + LENOUT1 - 1;
joshema216 2:ea6275d1222f 545
joshema216 2:ea6275d1222f 546 GSM.printf("AT+CMGS=%d\r\n",ind);
joshema216 2:ea6275d1222f 547 pc.printf("AT+CMGS=%d\r\n",ind);
joshema216 2:ea6275d1222f 548 pc.printf(relle1);
joshema216 2:ea6275d1222f 549 GSM.printf(relle1);
joshema216 2:ea6275d1222f 550
joshema216 2:ea6275d1222f 551 for (i=0 ;i<=9; i++) {
joshema216 2:ea6275d1222f 552 pc.printf("%c",tel[i]);
joshema216 2:ea6275d1222f 553 GSM.printf("%c",tel[i]);
joshema216 2:ea6275d1222f 554 }
joshema216 2:ea6275d1222f 555
joshema216 2:ea6275d1222f 556 pc.printf(relle2);
joshema216 2:ea6275d1222f 557 GSM.printf(relle2);
joshema216 2:ea6275d1222f 558 pc.printf("%2X", LENIN1);
joshema216 2:ea6275d1222f 559 GSM.printf("%2X", LENIN1);
joshema216 2:ea6275d1222f 560
joshema216 2:ea6275d1222f 561 for (i = 0; i < LENOUT1; i++){
joshema216 2:ea6275d1222f 562 pc.printf("%02X", DS1[i]&0x000000FF);
joshema216 2:ea6275d1222f 563 GSM.printf("%02X", DS1[i]&0x000000FF);
joshema216 2:ea6275d1222f 564 }
joshema216 2:ea6275d1222f 565 wait(1);
joshema216 2:ea6275d1222f 566 GSM.putc((char)0x1A); // Ctrl - Z.
joshema216 2:ea6275d1222f 567 GSM.scanf("%s",buf); // Estado del mensaje (Envió o Error).
joshema216 2:ea6275d1222f 568 pc.printf(">%s\n",buf);
joshema216 2:ea6275d1222f 569 pc.printf("\n");
procesadores_FAC 0:b2a6aa7c0c8c 570 }
procesadores_FAC 0:b2a6aa7c0c8c 571
joshema216 2:ea6275d1222f 572 wait(2);
joshema216 2:ea6275d1222f 573 LedAzul = 1;
joshema216 2:ea6275d1222f 574 LedVerde = 0;
Giovani_Cardona 4:b1da40a75b2a 575 GSM.printf("AT+CMGD=1\r\n"); // Borra el mensaje actual (Posición "1").
Giovani_Cardona 4:b1da40a75b2a 576 pc.printf("\n%s\n\n", "Mensaje Borrado");
joshema216 2:ea6275d1222f 577 }
joshema216 2:ea6275d1222f 578
joshema216 2:ea6275d1222f 579 // COMPARA resp con "F6379B1E569701" que es "voltaje", o "F6379B1E569701" que es "Voltaje".
joshema216 2:ea6275d1222f 580 if((strncmp("F6379B1E569701", msg, 14) == 0) || (strncmp("D6379B1E569701", msg, 14) == 0)){
joshema216 2:ea6275d1222f 581 //recibe_ok();
joshema216 2:ea6275d1222f 582 LedRojo = 0; // Encender LED amarillo.
joshema216 2:ea6275d1222f 583 LedVerde = 0;
joshema216 2:ea6275d1222f 584 LedAzul = 1;
joshema216 2:ea6275d1222f 585 wait(2);
joshema216 2:ea6275d1222f 586
joshema216 2:ea6275d1222f 587 med = v.read()*3.3;
joshema216 2:ea6275d1222f 588 medi = v.read();
joshema216 2:ea6275d1222f 589 pc.printf("\n%f\n", medi);
joshema216 2:ea6275d1222f 590
joshema216 2:ea6275d1222f 591 cleanBuffer(outmed, 16);
joshema216 2:ea6275d1222f 592 if (med < 1){ // Se convierte la Medida a caracter.
joshema216 2:ea6275d1222f 593 strcat(outmed, "0");
joshema216 2:ea6275d1222f 594 ftoa(med, outmedn, 5);
joshema216 2:ea6275d1222f 595 strcat(outmed, outmedn);
joshema216 2:ea6275d1222f 596 }
joshema216 2:ea6275d1222f 597 else{
joshema216 2:ea6275d1222f 598 ftoa(med, outmed, 5);
joshema216 2:ea6275d1222f 599 }
joshema216 2:ea6275d1222f 600 strcpy(DE2,"Voltaje: ");
joshema216 2:ea6275d1222f 601 strcat(DE2,outmed);
joshema216 2:ea6275d1222f 602 pc.printf("\n%s\n\n", DE2);
joshema216 2:ea6275d1222f 603 LENIN2 = strlen(DE2);
joshema216 2:ea6275d1222f 604
joshema216 2:ea6275d1222f 605 //Conversión a octetos.
joshema216 2:ea6275d1222f 606 K = 0;
joshema216 2:ea6275d1222f 607 C = 0;
joshema216 2:ea6275d1222f 608 for (i = 0; i < LENIN2; i++){
joshema216 2:ea6275d1222f 609 DS2[i] = DE2[i + C] >> K | DE2[i + C + 1] << (7 - K);
joshema216 2:ea6275d1222f 610 if(DS2[i] == 0x00) {LENOUT2 = i; goto salir2;}
joshema216 2:ea6275d1222f 611 K++;
joshema216 2:ea6275d1222f 612 if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
joshema216 2:ea6275d1222f 613 }
joshema216 2:ea6275d1222f 614
joshema216 2:ea6275d1222f 615 salir2:
joshema216 2:ea6275d1222f 616 for (i = 0; i < LENIN2; i++){
joshema216 2:ea6275d1222f 617 pc.printf("%X", DE2[i]);
joshema216 2:ea6275d1222f 618 }
joshema216 2:ea6275d1222f 619
joshema216 2:ea6275d1222f 620 pc.printf(":\r\n");
joshema216 2:ea6275d1222f 621 for (i = 0; i < LENOUT2; i++){
joshema216 2:ea6275d1222f 622 pc.printf("%2X", DS2[i]&0x000000FF);
joshema216 2:ea6275d1222f 623 }
joshema216 2:ea6275d1222f 624 pc.printf("\r\nLENOUT VOLTAJE: %d, LENIN VOLTAJE: %2X\r\n", LENOUT2, LENIN2);
joshema216 2:ea6275d1222f 625
joshema216 2:ea6275d1222f 626 // Concatenación del mensaje en formato PDU y envío del mismo.
joshema216 2:ea6275d1222f 627 ind = 14 + LENOUT2 - 1;
joshema216 2:ea6275d1222f 628
joshema216 2:ea6275d1222f 629 GSM.printf("AT+CMGS=%d\r\n",ind);
joshema216 2:ea6275d1222f 630 pc.printf("AT+CMGS=%d\r\n",ind);
joshema216 2:ea6275d1222f 631 pc.printf(relle1);
joshema216 2:ea6275d1222f 632 GSM.printf(relle1);
joshema216 2:ea6275d1222f 633
joshema216 2:ea6275d1222f 634 for (i=0; i <= 9; i++) {
joshema216 2:ea6275d1222f 635 pc.printf("%c",tel[i]);
joshema216 2:ea6275d1222f 636 GSM.printf("%c",tel[i]);
joshema216 2:ea6275d1222f 637 }
joshema216 2:ea6275d1222f 638
joshema216 2:ea6275d1222f 639 pc.printf(relle2);
joshema216 2:ea6275d1222f 640 GSM.printf(relle2);
joshema216 2:ea6275d1222f 641 pc.printf("%2X", LENIN2);
joshema216 2:ea6275d1222f 642 GSM.printf("%2X", LENIN2);
joshema216 2:ea6275d1222f 643 /*pc.printf("0F");
joshema216 2:ea6275d1222f 644 GSM.printf("0F");*/
joshema216 2:ea6275d1222f 645
joshema216 2:ea6275d1222f 646 for (i = 0; i < LENOUT2; i++){
joshema216 2:ea6275d1222f 647 pc.printf("%02X", DS2[i]&0x000000FF);
joshema216 2:ea6275d1222f 648 GSM.printf("%02X", DS2[i]&0x000000FF);
joshema216 2:ea6275d1222f 649 }
joshema216 2:ea6275d1222f 650
joshema216 2:ea6275d1222f 651 wait(1);
joshema216 2:ea6275d1222f 652 GSM.putc((char)0x1A); // Ctrl - Z
joshema216 2:ea6275d1222f 653 GSM.scanf("%s",buf); // Estado del mensaje (Envió o Error).
joshema216 2:ea6275d1222f 654 pc.printf(">%s\n\n",buf);
procesadores_FAC 0:b2a6aa7c0c8c 655 pc.printf("\n");
procesadores_FAC 0:b2a6aa7c0c8c 656
joshema216 2:ea6275d1222f 657 wait(2);
joshema216 2:ea6275d1222f 658 LedRojo=1;
joshema216 2:ea6275d1222f 659 LedVerde=0;
joshema216 2:ea6275d1222f 660 GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Posición "0").
joshema216 2:ea6275d1222f 661 //pc.printf("\n%s\n\n", "Borro mensaje");
joshema216 2:ea6275d1222f 662 }
joshema216 2:ea6275d1222f 663 }
joshema216 2:ea6275d1222f 664 }
joshema216 2:ea6275d1222f 665 }
AaronGonzalez 1:e2bd083802c0 666 }