d.a. santana / Mbed 2 deprecated smms

Dependencies:   GPS_G mbed

Fork of smms by deiwid ricaurte

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