Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of smms by
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 //*****************************************************************************************************************************************
Generated on Wed Jul 13 2022 13:17:19 by
1.7.2
