prueba sps

Dependencies:   GPS_G mbed

main.cpp

Committer:
deiwidricaurte
Date:
2016-11-28
Revision:
0:c55614493217

File content as of revision 0:c55614493217:

#include "mbed.h"
#include "string.h"
#include "math.h"
#include "GPS.h"
//---Configuraciones---
Timer t;
AnalogIn input(PTB3);
DigitalOut LedVerde(LED2);
DigitalOut LedRojo(LED1);
DigitalOut LedAzul(LED3);
Serial pc(USBTX,USBRX); //Configura puerto UART de la 
Serial GSM(PTE0,PTE1);//Configura la entrada serial del celular
DigitalOut ledr(PTE29);//Led indicador
DigitalIn chan(PTC3);//Pulsador para iniciar la configuración del celular
GPS gps(PTE22,PTE23);//configuración de los pines de comunicación con el GPS purto com del pc q envia las coordenadas
//---Subrutinas---
int readBuffer(char *buffer,int count);//Subrutina para leer el buffer
void enviar(int LENIN1,char *DS,char *numero);//subrutina para enviar mensaje
void borrar_todo(void);//subrutina para reiniciar las variables
void config(void);//configuración del celular
//---Variables para paquetes---
char buffer[100],Bkupbuffer[100];//buffer's de almacenación de mensajes
char celular[10];
char ENCA[255]={"http://maps.google.com/maps?q="};//para enviar las coordenadas en google encabezado  despues del encabezado
char ENCA2[255]={"el voltaje es: "};//para enviar el voltaje
char DS[255];
char DS2[255];
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
//---Variables para coordenadas---
char coorden[50]={NULL};
char aux[50]={NULL};
int num;
int longi_entera=0,lati_entera=0,longi_decimal=0,lati_decimal=0;
//---Variables como contadores---
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;
//*****************************************************************************************************************************************
//*****************************************************************************************************************************************
//es recomendable iniciar siempre oprimiendo el boton de configuración.
int main(void)
{
inicio: 
LedVerde=0;
LedRojo=1;
LedAzul=0;
borrar_todo();//Ejecuta la rutina que reinicia todas las variables del programaledr=1;
GSM.baud(9600);//configura los baudios de la comunicación en 9600
GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
wait(1);
pc.printf("conectado al pc \r\n ");//indicador de conexión
GSM.printf("AT+CMGD=1\r\n");//Borrar los mensajes del celular
    while(1) 
    {
 //________________________________________________________________________________________________________________________________________
        if(aa==0)//si se preciona, se procede a cofigurar el celular con comandos AT
        {
        config();
        num = input*10;      //agrando el numero de cero a mil
                int jj=0;
                pc.printf("\n spp %d",num);
                while(num>0)
                {
                aux[jj]=(num%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden
                num=num/10;
                if(num<1){
                    break;
                    }
                pc.printf("\n %c",aux[jj]);
                jj++;
                }
                if(num==0){
                    aux[jj]==48;
                    }
                pc.printf("\n sss %c",aux);
        aa=1;
        }           
 //________________________________________________________________________________________________________________________________________
            if (GSM.readable()) //esperar llegada de mensaje del celular
            {
            readBuffer(buffer,100);//guardar el mensaje en el buffer
            i=0;
            pc.printf(buffer);//imprimir el mensaje
                if(buffer[14]=='1'||buffer[6]=='R'){bandera++;}
                if(bandera==2)//compara si ya llegó el mensaje al celular y hay que borrarlo
                {
                    for(gh=0;gh<=99;gh++)//guardamos el mensaje almacenado en el buffer en una variable auxiliar
                    {    
                    Bkupbuffer[gh]=buffer[gh];
                    }
                //pc.printf("\r\n%c\r\n %c\r\n %c\r\n %c\r\n",Bkupbuffer[68],Bkupbuffer[69],Bkupbuffer[70],Bkupbuffer[71]);
                wait(0.5);
                GSM.printf("AT+CMGD=1\r\n");//borrar mensaje recibido
                bandera=0;
                }
            }
 //________________________________________________________________________________________________________________________________________
        if((buffer[10]=='S')&& (buffer[11]=='M'))//compara si el mensaje es un mensaje de texto que llegó al celular
        {
        pc.printf("\r\n Llego mensaje\r\n ");     
        buffer[10]=' ';//limpia los espacios del Buffer
        buffer[11]=' ';
        GSM.printf("AT+CMGR=%c\r\n",buffer[14]);//solicitar mesaje al celular
        //pc.printf("AT+CMGR=%c\r\n",buffer[14]);
        buffer[14]=' ';
        i=0;
        }
 //________________________________________________________________________________________________________________________________________
        if(Bkupbuffer[68]=='C'&& Bkupbuffer[69]=='3'&&Bkupbuffer[70]=='A'&& Bkupbuffer[71]=='7'&& Bkupbuffer[72]=='1'&& Bkupbuffer[73]=='4')//recibió ELE (Extincion Level Event)
        {
            buffer[68]=' ';
            Bkupbuffer[68]=' ';
            for(st=68;st<=73;st++)    
            {
            Bkupbuffer[st]=' ';//limpia el espacio del buffer para evitar ingresar de nuevo, si no ha llegado otro mensaje con la contraseña
            }
        
        pc.printf("Adquiriendo coordenadas del GPS...\r\n");//Adquiriendo coordenadas del GPS...
            if(gps.sample())//Si las coordenadas se obtienen correctamente:
            {
                        for(ro=30;ro<=255;ro++)
                        {
                        ENCA[ro]='\0';
                        }
                        ro=0;
                     
            longi_entera=(int)gps.longitude;//Adquiere la parte entera de la longitud del GPS
            lati_entera=(int)gps.latitude;//Adquiere la parte entera de la latitud del GPS
            longi_decimal=abs((gps.longitude-(int)gps.longitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS
            lati_decimal=abs((gps.latitude-(int)gps.latitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS
            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
                while(longi_decimal>0)
                {
                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
                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
                pc.printf("%c",coorden[j]);
                j++;
                }
            coorden[j]='.';//Se adiciona el punto, para la parte decimal
            pc.printf("%c",coorden[j]);//se muestra en el terminal la posición j de la longitud
            j++;
                if(longi_entera<0)//si la longitud es menor a cero se multiplica por -1
                {
                negativo=1;
                longi_entera=longi_entera*-1;
                }
                while(longi_entera>0)
                {
                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
                longi_entera=longi_entera/10;
                pc.printf("%c",coorden[j]);
                j++;
                }
                if(negativo==1)//si negativo es 1 al vector de caracteres se le adiciona un '-'
                {
                coorden[j]='-';
                pc.printf("%c",coorden[j]);
                j++;
                }
            negativo=0;//reinicia la variable para hacer lo mismo con la longitud
            coorden[j]=',';
            pc.printf("%c",coorden[j]);
            j++;
                while(lati_decimal>0)
                {
                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
                lati_decimal=lati_decimal/10;
                pc.printf("%c",coorden[j]);
                j++;
                }
            coorden[j]='.';//adiciona el punto al vector para indicar la parte decimal
            pc.printf("%c",coorden[j]);
            j++;
                if(lati_entera<0)
                {
                negativo=1;
                lati_entera=lati_entera*-1;
                }
                while(lati_entera>0)
                {
                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
                lati_entera=lati_entera/10;
                pc.printf("%c",coorden[j]);
                j++;
                }
                if(negativo==1)
                {
                coorden[j]='-';
                pc.printf("%c",coorden[j]);
                j++;
                }
            pc.printf("\r\n");
            j--;
            z=strlen(ENCA);//hace z = al tamaño de la variable ENCA
                for(i=j;i>=0;i--)
                {
                ENCA[z]=coorden[i];//guarda las coordenadas en un vector auxiliar ENCA en orden
                z++;
                }
            pc.printf(ENCA);
            pc.printf("\r\n");
            LENIN1=strlen(ENCA);//toma el tamaño del vector ENCA
                for (i=0;i < LENIN1;i++)//algoritmo para pasar de septetos a octetos
                {
                DS[i]=ENCA[i+C]>>K | ENCA[i+C+1]<<(7-K);
                    if (DS[i]==0x00) {LENOUT=i; goto salir;}//cuando 
                K++;
                    if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
                }
//--------------------------------------------------------------
salir:          for(i=38;i<48;i++)//Se extrae el número del celular 
                {
                celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer
                }//de respaldo
                wait(0.5);
            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
            wait(14);
            goto inicio;
            }//if GPS
                else
                {
                    for(i=38;i<48;i++)//Se extrae el número del celular 
                    {
                    celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer
                    }//de respaldo
                wait(0.5);  
                GSM.printf("at+cmgs=%d\r\n",37);//inicio de envío de mensaje
                pc.printf("at+cmgs=%d\r\n",37);
                wait(0.5);
                GSM.printf("0011000A91"); 
                pc.printf("0011000A91"); 
                    for(p=0;p<10;p++)
                    {
                    GSM.printf("%c",celular[p]);
                    pc.printf("%c",celular[p]);
                    }
                    
                GSM.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Relleno + Número de octetos + mensaje
                pc.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Error, intente mas tarde...
                wait(0.5);
                GSM.putc(0x1A);//fin de envío de mensaje                
                    for(ro=0;ro<=100;ro++)//borrar el buffer y el respaldo para habilitar una nueva recepción
                    {
                    buffer[ro]='\0';
                    Bkupbuffer[ro]='\0';
                    }
                ro=0; 
                wait(0.5);
                }          
        }//if ELE
            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
            {
                num = input*10;      //agrando el numero de cero a mil
                int jj=0;
                pc.printf("\n spp %d",num);
                while(num>0)
                {
                aux[jj]=(num%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden
                num=num/10;
                if(num<1){
                    break;
                    }
                pc.printf("\n %c",aux[jj]);
                jj++;
                }
                if(num==0){
                    aux[jj]==48;
                    }
                pc.printf("\n sss %c",aux);
                int z;
                z=strlen(ENCA2);//hace z = al tamaño de la variable ENCA
                for(i=j;i>=0;i--)
                {
                ENCA2[z]=aux[i];//guarda las coordenadas en un vector auxiliar ENCA en orden
                z++;
                }
                
                LENIN12=strlen(ENCA2);//toma el tamaño del vector ENCA
                for (i=0;i < LENIN12;i++)//algoritmo para pasar de septetos a octetos
                {
                DS2[i]=ENCA2[i+C]>>K | ENCA2[i+C+1]<<(7-K);
                    if (DS2[i]==0x00) {LENOUT2=i; goto salir2;}//cuando 
                K++;
                    if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
                }
                //
                //
salir2:         for(i=38;i<48;i++)//Se extrae el número del celular 
                {
                celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer
                }//de respaldo
                wait(0.5);
                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
                wait(14);
                
                goto inicio;
            }
            else
            {
                for(ro=0;ro<=100;ro++)
                {
                buffer[ro]='\0';
                }
                ro=0;
  
            }                                          
    }//while
}//main
//*****************************************************************************************************************************************
//*****************************************************************************************************************************************
int readBuffer(char *buffer,int count)//Recepción por comunicación serial con el celular
{
t.start(); 
    while(1) 
    {
        while (GSM.readable())//si hay algo que leer en la comunicación
        {
        char c = GSM.getc();
        if (c == '\r' || c == '\n') c = '$';//remplaza los espacios y saltos de linea por comodín
        buffer[i++] = c;//almacena la información en una cadena de caracteres "buffer"
        if(i > count)break;
        }
        if(i > count)break;
        if(t.read() > 3) 
        {
        t.stop();
        t.reset();
        break;
        }
    }
wait(0.5);
    while(GSM.readable())
    {  
    char c = GSM.getc();
    }
return 0;
}
//*****************************************************************************************************************************************
//*****************************************************************************************************************************************
void enviar(int LENIN1,char *DS,char *numero)
{
GSM.printf("at+cmgs=%d\r\n",13+LENIN1);//Comando para enviar el mensaje, empieza con la longitud total -1
pc.printf("at+cmgs=%d\r\n",13+LENIN1);
wait(0.5);
GSM.printf("0011000A91");//Envía relleno
pc.printf("0011000A91"); 
    for(p=0;p<10;p++)//Envía el número del celular trocado
    {
    GSM.printf("%c",celular[p]);
    pc.printf("%c",celular[p]);
    } 
GSM.printf("0000AA");//Envía segundo relleno
pc.printf("0000AA"); 
    if(LENIN1<=15)//Si es menor a 15 le adiciona un 0 al comienzo de la dirección
    {
    pc.printf("0");
    GSM.printf("0");
    pc.printf("%X",LENIN1);//Envía la longitud del mensaje
    GSM.printf("%X",LENIN1);
    }
    else
    {    
    pc.printf("%2X",LENIN1);
    GSM.printf("%2X",LENIN1);
    }
    for (p=0;p < LENIN1;p++)//envía el número de caracteres del mensaje
    {
        if(DS[p]<=15)//agrega ceros a cada número menos a 15 en el mensaje
        {
        pc.printf("0");
        GSM.printf("0");
        pc.printf("%X",DS[p]);
        GSM.printf("%X",DS[p]);
        }
        else
        {    
        pc.printf("%2X",DS[p]&0x000000FF);
        GSM.printf("%2X",DS[p]&0x000000FF);
        }
    }
wait(0.5);
GSM.putc(0x1A);//culmina el envío del mensaje
pc.putc(0x1A);          
}
//*****************************************************************************************************************************************
//*****************************************************************************************************************************************
void borrar_todo(void)//reinicia todas las varaibles del programa
{
    for(ro=0;ro<=50;ro++)
    {
    coorden[ro]='\0';
    }
    ro=0;
    for(ro=0;ro<=100;ro++)
    {
    buffer[ro]='\0';
    Bkupbuffer[ro]='\0';
    }
    for(ro=0;ro<=255;ro++)
    {
    DS[ro]='\0';
    }
    ro=0;
    for(ro=0;ro<=10;ro++)
    {
    celular[ro]='\0';
    }
ro=0;
LENIN=0;LENIN1=0;LENOUT=0;
longi_entera=0;lati_entera=0;longi_decimal=0;lati_decimal=0;
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;
ledr=0;
}
//*****************************************************************************************************************************************
//*****************************************************************************************************************************************
void config(void)//setear la configuración en el celular
{
        GSM.printf("AT\r\n");
        pc.printf("AT\r\n");
        wait(0.5);
        GSM.printf("AT+CNMI=1,1\r\n");
        pc.printf("AT+CNMI=1,1\r\n");
        wait(0.5);
        GSM.printf("AT+CMGF=0\r\n");
        pc.printf("AT+CMGF=0\r\n");
        wait(0.5);
        GSM.printf("ATE\r\n");//eco
        pc.printf("ATE\r\n");
        wait(0.5);
        GSM.printf("CBST=0,0,1\r\n");
        pc.printf("CBST=0,0,1\r\n");
        wait(0.5);
        LedVerde=0;
        LedRojo=0;
        LedAzul=1;

}