prueba sps

Dependencies:   GPS_G mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "string.h"
00003 #include "math.h"
00004 #include "GPS.h"
00005 //---Configuraciones---
00006 Timer t;
00007 AnalogIn input(PTB3);
00008 DigitalOut LedVerde(LED2);
00009 DigitalOut LedRojo(LED1);
00010 DigitalOut LedAzul(LED3);
00011 Serial pc(USBTX,USBRX); //Configura puerto UART de la 
00012 Serial GSM(PTE0,PTE1);//Configura la entrada serial del celular
00013 DigitalOut ledr(PTE29);//Led indicador
00014 DigitalIn chan(PTC3);//Pulsador para iniciar la configuración del celular
00015 GPS gps(PTE22,PTE23);//configuración de los pines de comunicación con el GPS purto com del pc q envia las coordenadas
00016 //---Subrutinas---
00017 int readBuffer(char *buffer,int count);//Subrutina para leer el buffer
00018 void enviar(int LENIN1,char *DS,char *numero);//subrutina para enviar mensaje
00019 void borrar_todo(void);//subrutina para reiniciar las variables
00020 void config(void);//configuración del celular
00021 //---Variables para paquetes---
00022 char buffer[100],Bkupbuffer[100];//buffer's de almacenación de mensajes
00023 char celular[10];
00024 char ENCA[255]={"http://maps.google.com/maps?q="};//para enviar las coordenadas en google encabezado  despues del encabezado
00025 char ENCA2[255]={"el voltaje es: "};//para enviar el voltaje
00026 char DS[255];
00027 char DS2[255];
00028 int LENIN=0,LENIN1=0,LENOUT=0,LENIN12=0,LENOUT2=0;//Tamaño de los datos de la función de conversión de entrada y salida
00029 //---Variables para coordenadas---
00030 char coorden[50]={NULL};
00031 char aux[50]={NULL};
00032 int num;
00033 int longi_entera=0,lati_entera=0,longi_decimal=0,lati_decimal=0;
00034 //---Variables como contadores---
00035 int i=0,count=0,bandera=0,gh=0,negativo=0,K=0,C=0,p=0,j=0,z=0,ro=0,st=0,sol=0,aa=0;
00036 //*****************************************************************************************************************************************
00037 //*****************************************************************************************************************************************
00038 //es recomendable iniciar siempre oprimiendo el boton de configuración.
00039 int main(void)
00040 {
00041 inicio: 
00042 LedVerde=0;
00043 LedRojo=1;
00044 LedAzul=0;
00045 borrar_todo();//Ejecuta la rutina que reinicia todas las variables del programaledr=1;
00046 GSM.baud(9600);//configura los baudios de la comunicación en 9600
00047 GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
00048 wait(1);
00049 pc.printf("conectado al pc \r\n ");//indicador de conexión
00050 GSM.printf("AT+CMGD=1\r\n");//Borrar los mensajes del celular
00051     while(1) 
00052     {
00053  //________________________________________________________________________________________________________________________________________
00054         if(aa==0)//si se preciona, se procede a cofigurar el celular con comandos AT
00055         {
00056         config();
00057         num = input*10;      //agrando el numero de cero a mil
00058                 int jj=0;
00059                 pc.printf("\n spp %d",num);
00060                 while(num>0)
00061                 {
00062                 aux[jj]=(num%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden
00063                 num=num/10;
00064                 if(num<1){
00065                     break;
00066                     }
00067                 pc.printf("\n %c",aux[jj]);
00068                 jj++;
00069                 }
00070                 if(num==0){
00071                     aux[jj]==48;
00072                     }
00073                 pc.printf("\n sss %c",aux);
00074         aa=1;
00075         }           
00076  //________________________________________________________________________________________________________________________________________
00077             if (GSM.readable()) //esperar llegada de mensaje del celular
00078             {
00079             readBuffer(buffer,100);//guardar el mensaje en el buffer
00080             i=0;
00081             pc.printf(buffer);//imprimir el mensaje
00082                 if(buffer[14]=='1'||buffer[6]=='R'){bandera++;}
00083                 if(bandera==2)//compara si ya llegó el mensaje al celular y hay que borrarlo
00084                 {
00085                     for(gh=0;gh<=99;gh++)//guardamos el mensaje almacenado en el buffer en una variable auxiliar
00086                     {    
00087                     Bkupbuffer[gh]=buffer[gh];
00088                     }
00089                 //pc.printf("\r\n%c\r\n %c\r\n %c\r\n %c\r\n",Bkupbuffer[68],Bkupbuffer[69],Bkupbuffer[70],Bkupbuffer[71]);
00090                 wait(0.5);
00091                 GSM.printf("AT+CMGD=1\r\n");//borrar mensaje recibido
00092                 bandera=0;
00093                 }
00094             }
00095  //________________________________________________________________________________________________________________________________________
00096         if((buffer[10]=='S')&& (buffer[11]=='M'))//compara si el mensaje es un mensaje de texto que llegó al celular
00097         {
00098         pc.printf("\r\n Llego mensaje\r\n ");     
00099         buffer[10]=' ';//limpia los espacios del Buffer
00100         buffer[11]=' ';
00101         GSM.printf("AT+CMGR=%c\r\n",buffer[14]);//solicitar mesaje al celular
00102         //pc.printf("AT+CMGR=%c\r\n",buffer[14]);
00103         buffer[14]=' ';
00104         i=0;
00105         }
00106  //________________________________________________________________________________________________________________________________________
00107         if(Bkupbuffer[68]=='C'&& Bkupbuffer[69]=='3'&&Bkupbuffer[70]=='A'&& Bkupbuffer[71]=='7'&& Bkupbuffer[72]=='1'&& Bkupbuffer[73]=='4')//recibió ELE (Extincion Level Event)
00108         {
00109             buffer[68]=' ';
00110             Bkupbuffer[68]=' ';
00111             for(st=68;st<=73;st++)    
00112             {
00113             Bkupbuffer[st]=' ';//limpia el espacio del buffer para evitar ingresar de nuevo, si no ha llegado otro mensaje con la contraseña
00114             }
00115         
00116         pc.printf("Adquiriendo coordenadas del GPS...\r\n");//Adquiriendo coordenadas del GPS...
00117             if(gps.sample())//Si las coordenadas se obtienen correctamente:
00118             {
00119                         for(ro=30;ro<=255;ro++)
00120                         {
00121                         ENCA[ro]='\0';
00122                         }
00123                         ro=0;
00124                      
00125             longi_entera=(int)gps.longitude;//Adquiere la parte entera de la longitud del GPS
00126             lati_entera=(int)gps.latitude;//Adquiere la parte entera de la latitud del GPS
00127             longi_decimal=abs((gps.longitude-(int)gps.longitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS
00128             lati_decimal=abs((gps.latitude-(int)gps.latitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS
00129             pc.printf("http://maps.google.com/maps?q=%f,%f\r\n", gps.latitude,gps.longitude);//encabezado que será impreso en el terminal y luego en el mensaje
00130                 while(longi_decimal>0)
00131                 {
00132                 coorden[j]=(longi_decimal%10)+48;//se toma la parte decimal de la longitud y se pasa a ASCII y guarda en el vector coorden
00133                 longi_decimal=longi_decimal/10;//se divide por 10 para hacer mas iteracines en caso de que el número de elementos seamayor a uno
00134                 pc.printf("%c",coorden[j]);
00135                 j++;
00136                 }
00137             coorden[j]='.';//Se adiciona el punto, para la parte decimal
00138             pc.printf("%c",coorden[j]);//se muestra en el terminal la posición j de la longitud
00139             j++;
00140                 if(longi_entera<0)//si la longitud es menor a cero se multiplica por -1
00141                 {
00142                 negativo=1;
00143                 longi_entera=longi_entera*-1;
00144                 }
00145                 while(longi_entera>0)
00146                 {
00147                 coorden[j]=(longi_entera%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden
00148                 longi_entera=longi_entera/10;
00149                 pc.printf("%c",coorden[j]);
00150                 j++;
00151                 }
00152                 if(negativo==1)//si negativo es 1 al vector de caracteres se le adiciona un '-'
00153                 {
00154                 coorden[j]='-';
00155                 pc.printf("%c",coorden[j]);
00156                 j++;
00157                 }
00158             negativo=0;//reinicia la variable para hacer lo mismo con la longitud
00159             coorden[j]=',';
00160             pc.printf("%c",coorden[j]);
00161             j++;
00162                 while(lati_decimal>0)
00163                 {
00164                 coorden[j]=(lati_decimal%10)+48;//se toma la parte decimal de la latitud y se pasa a ASCII y guarda en el vector coorden
00165                 lati_decimal=lati_decimal/10;
00166                 pc.printf("%c",coorden[j]);
00167                 j++;
00168                 }
00169             coorden[j]='.';//adiciona el punto al vector para indicar la parte decimal
00170             pc.printf("%c",coorden[j]);
00171             j++;
00172                 if(lati_entera<0)
00173                 {
00174                 negativo=1;
00175                 lati_entera=lati_entera*-1;
00176                 }
00177                 while(lati_entera>0)
00178                 {
00179                 coorden[j]=(lati_entera%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden
00180                 lati_entera=lati_entera/10;
00181                 pc.printf("%c",coorden[j]);
00182                 j++;
00183                 }
00184                 if(negativo==1)
00185                 {
00186                 coorden[j]='-';
00187                 pc.printf("%c",coorden[j]);
00188                 j++;
00189                 }
00190             pc.printf("\r\n");
00191             j--;
00192             z=strlen(ENCA);//hace z = al tamaño de la variable ENCA
00193                 for(i=j;i>=0;i--)
00194                 {
00195                 ENCA[z]=coorden[i];//guarda las coordenadas en un vector auxiliar ENCA en orden
00196                 z++;
00197                 }
00198             pc.printf(ENCA);
00199             pc.printf("\r\n");
00200             LENIN1=strlen(ENCA);//toma el tamaño del vector ENCA
00201                 for (i=0;i < LENIN1;i++)//algoritmo para pasar de septetos a octetos
00202                 {
00203                 DS[i]=ENCA[i+C]>>K | ENCA[i+C+1]<<(7-K);
00204                     if (DS[i]==0x00) {LENOUT=i; goto salir;}//cuando 
00205                 K++;
00206                     if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
00207                 }
00208 //--------------------------------------------------------------
00209 salir:          for(i=38;i<48;i++)//Se extrae el número del celular 
00210                 {
00211                 celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer
00212                 }//de respaldo
00213                 wait(0.5);
00214             enviar(LENIN1,DS,celular);//Ejecuta la rutina de envío de mensaje, con el tamaño del mensaje, las coordenadas en septetos y el número del celular
00215             wait(14);
00216             goto inicio;
00217             }//if GPS
00218                 else
00219                 {
00220                     for(i=38;i<48;i++)//Se extrae el número del celular 
00221                     {
00222                     celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer
00223                     }//de respaldo
00224                 wait(0.5);  
00225                 GSM.printf("at+cmgs=%d\r\n",37);//inicio de envío de mensaje
00226                 pc.printf("at+cmgs=%d\r\n",37);
00227                 wait(0.5);
00228                 GSM.printf("0011000A91"); 
00229                 pc.printf("0011000A91"); 
00230                     for(p=0;p<10;p++)
00231                     {
00232                     GSM.printf("%c",celular[p]);
00233                     pc.printf("%c",celular[p]);
00234                     }
00235                     
00236                 GSM.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Relleno + Número de octetos + mensaje
00237                 pc.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Error, intente mas tarde...
00238                 wait(0.5);
00239                 GSM.putc(0x1A);//fin de envío de mensaje                
00240                     for(ro=0;ro<=100;ro++)//borrar el buffer y el respaldo para habilitar una nueva recepción
00241                     {
00242                     buffer[ro]='\0';
00243                     Bkupbuffer[ro]='\0';
00244                     }
00245                 ro=0; 
00246                 wait(0.5);
00247                 }          
00248         }//if ELE
00249             else if(Bkupbuffer[68]=='D'&& Bkupbuffer[69]=='6'&&Bkupbuffer[70]=='2'&& Bkupbuffer[71]=='7'&& Bkupbuffer[72]=='1'&& Bkupbuffer[73]=='3')//compara mensaje para leer voltje
00250             {
00251                 num = input*10;      //agrando el numero de cero a mil
00252                 int jj=0;
00253                 pc.printf("\n spp %d",num);
00254                 while(num>0)
00255                 {
00256                 aux[jj]=(num%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden
00257                 num=num/10;
00258                 if(num<1){
00259                     break;
00260                     }
00261                 pc.printf("\n %c",aux[jj]);
00262                 jj++;
00263                 }
00264                 if(num==0){
00265                     aux[jj]==48;
00266                     }
00267                 pc.printf("\n sss %c",aux);
00268                 int z;
00269                 z=strlen(ENCA2);//hace z = al tamaño de la variable ENCA
00270                 for(i=j;i>=0;i--)
00271                 {
00272                 ENCA2[z]=aux[i];//guarda las coordenadas en un vector auxiliar ENCA en orden
00273                 z++;
00274                 }
00275                 
00276                 LENIN12=strlen(ENCA2);//toma el tamaño del vector ENCA
00277                 for (i=0;i < LENIN12;i++)//algoritmo para pasar de septetos a octetos
00278                 {
00279                 DS2[i]=ENCA2[i+C]>>K | ENCA2[i+C+1]<<(7-K);
00280                     if (DS2[i]==0x00) {LENOUT2=i; goto salir2;}//cuando 
00281                 K++;
00282                     if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
00283                 }
00284                 //
00285                 //
00286 salir2:         for(i=38;i<48;i++)//Se extrae el número del celular 
00287                 {
00288                 celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer
00289                 }//de respaldo
00290                 wait(0.5);
00291                 enviar(LENIN12,DS2,celular);//Ejecuta la rutina de envío de mensaje, con el tamaño del mensaje, las coordenadas en septetos y el número del celular
00292                 wait(14);
00293                 
00294                 goto inicio;
00295             }
00296             else
00297             {
00298                 for(ro=0;ro<=100;ro++)
00299                 {
00300                 buffer[ro]='\0';
00301                 }
00302                 ro=0;
00303   
00304             }                                          
00305     }//while
00306 }//main
00307 //*****************************************************************************************************************************************
00308 //*****************************************************************************************************************************************
00309 int readBuffer(char *buffer,int count)//Recepción por comunicación serial con el celular
00310 {
00311 t.start(); 
00312     while(1) 
00313     {
00314         while (GSM.readable())//si hay algo que leer en la comunicación
00315         {
00316         char c = GSM.getc();
00317         if (c == '\r' || c == '\n') c = '$';//remplaza los espacios y saltos de linea por comodín
00318         buffer[i++] = c;//almacena la información en una cadena de caracteres "buffer"
00319         if(i > count)break;
00320         }
00321         if(i > count)break;
00322         if(t.read() > 3) 
00323         {
00324         t.stop();
00325         t.reset();
00326         break;
00327         }
00328     }
00329 wait(0.5);
00330     while(GSM.readable())
00331     {  
00332     char c = GSM.getc();
00333     }
00334 return 0;
00335 }
00336 //*****************************************************************************************************************************************
00337 //*****************************************************************************************************************************************
00338 void enviar(int LENIN1,char *DS,char *numero)
00339 {
00340 GSM.printf("at+cmgs=%d\r\n",13+LENIN1);//Comando para enviar el mensaje, empieza con la longitud total -1
00341 pc.printf("at+cmgs=%d\r\n",13+LENIN1);
00342 wait(0.5);
00343 GSM.printf("0011000A91");//Envía relleno
00344 pc.printf("0011000A91"); 
00345     for(p=0;p<10;p++)//Envía el número del celular trocado
00346     {
00347     GSM.printf("%c",celular[p]);
00348     pc.printf("%c",celular[p]);
00349     } 
00350 GSM.printf("0000AA");//Envía segundo relleno
00351 pc.printf("0000AA"); 
00352     if(LENIN1<=15)//Si es menor a 15 le adiciona un 0 al comienzo de la dirección
00353     {
00354     pc.printf("0");
00355     GSM.printf("0");
00356     pc.printf("%X",LENIN1);//Envía la longitud del mensaje
00357     GSM.printf("%X",LENIN1);
00358     }
00359     else
00360     {    
00361     pc.printf("%2X",LENIN1);
00362     GSM.printf("%2X",LENIN1);
00363     }
00364     for (p=0;p < LENIN1;p++)//envía el número de caracteres del mensaje
00365     {
00366         if(DS[p]<=15)//agrega ceros a cada número menos a 15 en el mensaje
00367         {
00368         pc.printf("0");
00369         GSM.printf("0");
00370         pc.printf("%X",DS[p]);
00371         GSM.printf("%X",DS[p]);
00372         }
00373         else
00374         {    
00375         pc.printf("%2X",DS[p]&0x000000FF);
00376         GSM.printf("%2X",DS[p]&0x000000FF);
00377         }
00378     }
00379 wait(0.5);
00380 GSM.putc(0x1A);//culmina el envío del mensaje
00381 pc.putc(0x1A);          
00382 }
00383 //*****************************************************************************************************************************************
00384 //*****************************************************************************************************************************************
00385 void borrar_todo(void)//reinicia todas las varaibles del programa
00386 {
00387     for(ro=0;ro<=50;ro++)
00388     {
00389     coorden[ro]='\0';
00390     }
00391     ro=0;
00392     for(ro=0;ro<=100;ro++)
00393     {
00394     buffer[ro]='\0';
00395     Bkupbuffer[ro]='\0';
00396     }
00397     for(ro=0;ro<=255;ro++)
00398     {
00399     DS[ro]='\0';
00400     }
00401     ro=0;
00402     for(ro=0;ro<=10;ro++)
00403     {
00404     celular[ro]='\0';
00405     }
00406 ro=0;
00407 LENIN=0;LENIN1=0;LENOUT=0;
00408 longi_entera=0;lati_entera=0;longi_decimal=0;lati_decimal=0;
00409 i=0;count=0;bandera=0;gh=0;negativo=0;K=0;C=0;p=0;j=0;z=0;ro=0;sol=0;st=0;
00410 ledr=0;
00411 }
00412 //*****************************************************************************************************************************************
00413 //*****************************************************************************************************************************************
00414 void config(void)//setear la configuración en el celular
00415 {
00416         GSM.printf("AT\r\n");
00417         pc.printf("AT\r\n");
00418         wait(0.5);
00419         GSM.printf("AT+CNMI=1,1\r\n");
00420         pc.printf("AT+CNMI=1,1\r\n");
00421         wait(0.5);
00422         GSM.printf("AT+CMGF=0\r\n");
00423         pc.printf("AT+CMGF=0\r\n");
00424         wait(0.5);
00425         GSM.printf("ATE\r\n");//eco
00426         pc.printf("ATE\r\n");
00427         wait(0.5);
00428         GSM.printf("CBST=0,0,1\r\n");
00429         pc.printf("CBST=0,0,1\r\n");
00430         wait(0.5);
00431         LedVerde=0;
00432         LedRojo=0;
00433         LedAzul=1;
00434 
00435 }