+ Este programa funciona con el modem GSM en un celular SIEMENS A56i. + Reconoce el mensaje 'Voltaje' y devuelve un mensaje a un numero especificado el voltaje sensado en PTB0 (ADC). + Reconoce el mensaje 'Pwm####' siendo #### un valor entre 0000 y 1000 y activa la salida PWM PTE20 con su ciclo de dureza en este rango. + El conector se distingue asi: - Cable verde es RX conectelo a PTE0. - Cable blanco es TX conectelo a PTE1.
Fork of ALARMA_FINCA_GSM7 by
Diff: main.cpp
- Revision:
- 2:b249143245d8
- Parent:
- 1:9dc429267e43
--- a/main.cpp Sun Nov 05 07:15:28 2017 +0000 +++ b/main.cpp Fri Dec 01 15:19:02 2017 +0000 @@ -1,45 +1,75 @@ -/*************************Alarma para una finca********************************************************* -Como modem usa un celular SIEMENS a56i -Envia el mensaje intruso en rionegro -Como modem GSM usa un celular SIEMENS A56i -El conector se distingue asi: -Cable verde es RX conectelo a PTE0 cable blanco es TX conectelo a PTE1 -La alarma se dispara segun la señal de un sensor PIR que se le filtra el ruido -La alarma puede hacer accionamientos como: -Accionamiento Permanente de una sirena -Accionaminto temporizado de una sirena -Accionamiento de un Mensaje de voz reperido y temporizado +/* + + Este programa funciona con el modem GSM en un celular SIEMENS A56i. + + Reconoce el mensaje 'Voltaje' y devuelve un mensaje a un numero + especificado el voltaje sensado en PTB0 (ADC). + + Reconoce el mensaje 'Pwm####' siendo #### un valor entre 0000 y 1000 y + activa la salida PWM PTE20 con su ciclo de dureza en este rango. + + El conector se distingue asi: + - Cable verde es RX conectelo a PTE0. + - Cable blanco es TX conectelo a PTE1. + + + Realizado por: Carolina Velez Castaño + Daniel Sebastian Múnera Toro + Robinson Sneider Álvarez Valle + + + Universidad Nacional de Colombia sede Medellín */ #include "mbed.h" -#include "DebouncedIn.h" #include "stdio.h" #include "string.h" +#include <math.h> int i,ret; +int K,C,LENOUT,LENIN,LENOUT1, LENIN1, LENOUT2, LENIN2, ind; Timer t; -DigitalOut LedVerde(LED2); -DigitalOut LedRojo(LED1); -DigitalOut LedAzul(LED3); -DigitalOut Camara(PTD4); -DigitalOut Sirena(PTA2); -DigitalOut Luces(LED3); -DebouncedIn PIR(PTA13); //señal que inicia el envio del mensaje + +DigitalOut LedRojo(LED1,1); +DigitalOut LedVerde(LED2,1); +DigitalOut LedAzul(LED3,1); + Serial GSM(PTE0,PTE1); //Configura puerto UART de la FRDMKL25Z Serial pc(USBTX,USBRX);//Configura puerto USB a la consola serial del PC conectado. -char buffer[100]; + +AnalogIn input0(PTB0); +PwmOut pwm0(PTE20); + +char msg[15]; +char msg0[13]; +char msg1[7]; +char msg2[9]; +char analogStr[20]; +char gs[20]; +char input0_char[10]; + +char DE1[255]; +char DS1[255]; +char DE2[255]; +char DS2[255]; +char buffer[512]; char resp[6]; -char tel[21]; -char tam [3]; -char msg [15]; -//***************************************FUNCIONES EN C********************* -//**************************************************************************************************************** -//esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de -//$, count es lo que va a leer.Lo leido lo mete en buffer que es una cadena previamente definida -//incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1 -//**************************************************************************************************************** -int readBuffer(char *buffer,int count) -{ +char tam[2]; +char mensaje[100]; +char buf[100]; + +char tel[10] = {'0','3','3','5','4','5','2','1','5','8'}; +char relle1[10] = {'0','0','1','1','0','0','0','A','9','1'}; +char relle2[6] = {'0','0','0','0','A','A'}; +char message[] = "0011000A9103354521580000AA03"; + +//******************************FUNCIONES EN C********************************** + +/******************************************************************************* + Funciones para el formato PDU +*******************************************************************************/ + +/******************************************************************************* + Lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de '$', + count es lo que va a leer; Lo leido lo mete en buffer que es una cadena + previamente definida incorpora medida de tiempo si se demora mas de tres + segundos retorna fracaso con -1 +*******************************************************************************/ +int readBuffer(char *buffer,int count){ int i=0; t.start(); // start timer while(1) { @@ -62,34 +92,32 @@ } return 0; } -//******************************************************************************** -/* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count" -lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena -no retorna nada -*/ -//*************************************************************************************** -void cleanBuffer(char *buffer, int count) -{ + + +/******************************************************************************* + Limpia o borra todo un "buffer" de tamaño "count" lo revisa elemento por + elemento y le mete el caracter null que indica fin de cadena no retorna nada +*******************************************************************************/ +void cleanBuffer(char *buffer, int count){ for(int i=0; i < count; i++) { buffer[i] = 0; } } -/* esta funcion de abajo envia un comando parametrizado como cadena -puede ser un comando tipo AT -*/ -//*************************************************************************************** -void sendCmd(char *cmd) -{ + +/******************************************************************************* + Envia un comando parametrizado como cadena puede ser un comando tipo AT +*******************************************************************************/ +void sendCmd(char *cmd){ GSM.puts(cmd); } -//**************************************************************************************** -/* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout" -si todo sale bien retorna un cero que en la programacion hay que validar -si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica -*/ -//*************************************************************************************** -int waitForResp(char *resp, int timeout) -{ + +/******************************************************************************* + Espera la respuesta de un comando que debe ser identica a la cadena "resp" y + un tiempo 'timeout' si todo sale bien retorna un cero que en la programacion + hay que validar si algo sale mal (no se parece o se demora mucho) retorna -1 + que debera validarse con alguna expresion logica +*******************************************************************************/ +int waitForResp(char *resp, int timeout){ int len = strlen(resp); int sum=0; t.start(); @@ -114,31 +142,30 @@ return 0; } -/* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta -si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout) -{ + +/******************************************************************************* + Se encarga de enviar el comando y esperar la respuesta si todo sale bien + retorna un cero(herencia de las funciones contenedoras) que en la + programacion hay que validar con alguna expresion logica +*******************************************************************************/ +int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout){ sendCmd(cmd); return waitForResp(resp,timeout); } -/* esta funcion de abajo chequea que el modem este vivo envia AT y le contesta con OK y espera 2 segundos -*/ -//*************************************************************************************** -int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado -{ + +/******************************************************************************* + Chequea que el modem este vivo envia AT y le contesta con OK y espera 2 + segundos +*******************************************************************************/ +int powerCheck(void){ return sendCmdAndWaitForResp("AT\r\n", "OK", 2); } -/* esta funcion de abajo chequea el estado de la sim card -y si todo sale bien retorna un cero que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int checkSIMStatus(void) -{ +/******************************************************************************* + Chequea el estado de la sim card y si todo sale bien retorna un cero que en + la programacion hay que validar con alguna expresion logica +*******************************************************************************/ +int checkSIMStatus(void){ char gprsBuffer[30]; int count = 0; cleanBuffer(gprsBuffer,30); @@ -157,13 +184,13 @@ } return 0; } -/* esta funcion de abajo chequea la calidad de la señal -y si todo sale bien retorna con el valor de señal util o un -1 si no es aceptable, en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int checkSignalStrength(void) -{ + +/******************************************************************************* + Chequea la calidad de la señal y si todo sale bien retorna con el valor de + señal util o un -1 si no es aceptable, en la programacion hay que validar + con alguna expresion logica +*******************************************************************************/ +int checkSignalStrength(void){ char gprsBuffer[100]; int index,count = 0; cleanBuffer(gprsBuffer,100); @@ -182,206 +209,249 @@ return index; } -//*********************esta funcion inicializa el modem*************** -int init() -{ +/******************************************************************************* + Inicializa el modem +*******************************************************************************/ +int init(){ if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 5)){ return -1; - } + } if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 5)){ return -1; - } + } if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 5)){ return -1; - } + } if (0 != sendCmdAndWaitForResp("AT+CBST=0,0,1\r\n", "OK", 5)){ return -1; + } + return 0; +} + + +/******************************************************************************* + Funciones para el manejo de las cadenas +*******************************************************************************/ + +/******************************************************************************* + Pasa de septetos a octetos +*******************************************************************************/ +void SepToOct(char *DE, char *DS){ + LENIN = strlen(DE); // Se mide el tamaño de la cadena de entrada + int K=0;int C=0; int i=0; + for (i=0;i < LENIN;i++){ + DS[i]=DE[i+C]>>K | DE[i+C+1]<<(7-K); + if (DS[i]==0x00) {LENOUT=i; goto salir99;} // Fin de la transformacion + K++; + if (K==7) {K=0;C++;} // Se chequea que ya se acabaron los bits en un ciclo de conversion. + } + salir99: + for (i=0;i<LENOUT;i++){ + DS[i]=DS[i]&0x000000FF; } - return 0; - } + return; +} -//*****************SE INICIA EL PROGRAMA PRINCIPAL******************************************************* -int main() { - LedVerde=1; //APAGO LOS LEDS - LedRojo=1; - LedAzul=1; - LedRojo=0; // PRENDO EL LED ROJO +/******************************************************************************* + Pasa de octetos a septetos +*******************************************************************************/ +void OctToSep(char *DE, char *DS){ + int LENIN = strlen(DE); + int LENOUT = LENIN*8/7; + K = 7; + C = 0; + DS[0] = DE[0] & 0x7F; // la primera sola + for (i=1;i < LENOUT;i++){ // inicia el algoritmo + DS[i]=(DE[i-1-C]>>K | DE[i-C]<<(8-K))& 0x7F; //valido para todos + if (K==0) {K=8;C++;} + K--; + } + return; + } + +//*****************SE INICIA EL PROGRAMA PRINCIPAL****************************** +int main(){ + LedRojo = 0; + LedVerde = 1; + LedAzul = 1; + + pwm0 = 0; -//****************CONFIGURAMOS EL MODEM GSM (TELEFONO CELULAR SIEMENS A56i) -inicio1: + //****************CONFIGURAMOS EL MODEM GSM (TELEFONO CELULAR SIEMENS A56i) + inicio1: ret = init(); if(ret==0){ - LedRojo=1; - LedVerde=0; + LedRojo = 1; + LedVerde = 0; + LedAzul = 1; } else{ - wait(5); - goto inicio1; + wait(5); + goto inicio1; } -//******************************************************************************************* -//inicia la recepcion de un mensaje de texto -while(1){ - if (GSM.readable()) { + + while(1){ + // Inicia la recepcion de un mensaje de texto + if (GSM.readable()){ readBuffer(buffer,6); pc.printf("%s\r\n",buffer); - for(i=0;i<5;i++) - { - resp[i]=buffer[i]; + for(i=0;i<5;i++){ + resp[i]=buffer[i]; } pc.printf("%s\r\n",resp); - if(strcmp("$$+CM",resp) == 0){ //COMPARA resp con "+CMTI" - pc.printf("llegoo MSG\r\n"); + if(strcmp("$$+CM",resp) == 0){ // Compara respuesta con "+CMTI" + pc.printf("Llego MSG\r\n"); cleanBuffer(buffer,6); - GSM.printf("AT+CMGL=0");//envio comando para leer mensaje - GSM.putc(0x0D);//envoi du caractere \n + GSM.printf("AT+CMGL=0"); // Envio comando para leer mensaje + GSM.putc(0x0D); // Envio de caracterer \n pc.printf("AT+CMGL=0\r\n"); - loop1: if (GSM.readable()) { + loop1: + if (GSM.readable()){ readBuffer(buffer,100); pc.printf("%s\r\n",buffer); goto seguir1; + } + goto loop1; + seguir1: + //leer telefono + for(i=0;i<10;i++){ + tel[i]=buffer[i+50]; + } + pc.printf("%s-\r\n",tel); + + // Leer tamaño + for(i=0;i<2;i++){ + tam[i]=buffer[i+78]; + } + pc.printf("%s-\r\n",tam); + + // Leer mensaje + for(i=0;i<14;i++){ + msg[i]=buffer[i+80]; + } + pc.printf("%s-\r\n",msg); + + // Dividir mensaje, facilita comparación de tramas + for(i=0;i<12;i++){ // Solo guarda 12 posiciones del + msg0[i]=buffer[i+80];; // mensaje porque los ultimos dos + } // caracteres pueden dañar la + pc.printf("%s-\r\n",msg0); // comparación por los cambios del + // operador. + for(i=0;i<6;i++){ + msg1[i]=buffer[i+80];; + } + pc.printf("%s-\r\n",msg1); + for(i=0;i<8;i++){ + msg2[i]=buffer[i+86];; + } + pc.printf("%s-\r\n",msg2); + + GSM.printf("AT+CMGD=0"); // Envio comando para borrar mensaje + GSM.putc(0x0D); // Envio de caracter \n + wait(1); + GSM.printf("AT+CMGD=1"); // Envio comando para borrar mensaje + GSM.putc(0x0D); // Envio de caracter \n + wait(1); + + // Comparar mensaje + /* + Cadenas compara 'Voltaje' + D6379B1E569701 + D6379B1E56971B + */ + if(strcmp("D6379B1E5697",msg0) == 0){ // Compara con "Voltaje" + LedRojo = 1; + LedVerde = 1; + LedAzul = 0; + + sprintf(input0_char,"%.2f",input0.read()*3.3); + cleanBuffer(gs,20); + SepToOct(input0_char,gs); + //pc.printf("%s\n",input0_char); + + // Envio del mensaje + GSM.printf("AT+CMGS=16\n\r"); + wait_ms(200); + GSM.printf(message); // Imprime cabecera + for (i=0;i<3;i++){ + GSM.printf("%2X",gs[i]&0x000000FF); // Imprime conversión } - goto loop1; - //leer telefono - seguir1: for(i=0;i<10;i++){ - tel[i]=buffer[i+50]; - } - pc.printf("%s-\r\n",tel); - //leer tamaño - for(i=0;i<2;i++){ - tam[i]=buffer[i+78]; - } - pc.printf("%s-\r\n",tam); - //leer mensaje - for(i=0;i<14;i++){ - msg[i]=buffer[i+80]; - } - pc.printf("%s-\r\n",msg); - GSM.printf("AT+CMGD=0");//envio comando para borrar mensaje - GSM.putc(0x0D);//envoi du caractere \n - wait(1); - GSM.printf("AT+CMGD=1");//envio comando para borrar mensaje - GSM.putc(0x0D);//envoi du caractere \n - wait(1); - //decodificar mensaje - //comparar mensaje - if(strcmp("417658DE0EC700",msg) == 0){ //COMPARA resp con "417658DE0EC700" que es Alarma1 - LedVerde=1; - LedAzul=0; - wait(15); - LedAzul=1; - LedVerde=0; - } - if(strcmp("417658DE0ECB00",msg) == 0){ //COMPARA resp con "417658DE0ECB00" que es Alarma2 - LedVerde=1; - LedRojo=0; - wait(15); - LedRojo=1; - LedVerde=0; - } - - - //ejecurar orden //ya se ejecuto - //08-D6379B1E569763 esto es Voltaje1 - - - cleanBuffer(buffer,100); - + wait_ms(200); + GSM.putc((char)0x1A); + wait(10); + + ///si el operador contesta con mensaje borrar de nuevo + GSM.printf("AT+CMGD=0");//envio comando para borrar mensaje + GSM.putc(0x0D); //envio de caracter \n + wait(1); + GSM.printf("AT+CMGD=1");//envio comando para borrar mensaje + GSM.putc(0x0D); //envio de caracter \n + wait(1); + + //wait(5); + LedRojo = 1; + LedVerde = 0; + LedAzul = 1; } + + /* + Cadenas compara 'Pwm000' + D07B1B0683C100 + D07B1B0683C11A + */ + if(strcmp("D07B1B",msg1) == 0){ // Compara con "Pwm" + cleanBuffer(gs,20); + OctToSep(msg2,gs); + + pwm0 = gs[0]/100.0; + + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(1); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(1); + LedRojo = 1; LedVerde = 0; LedAzul = 1; + } + + if(strcmp("D07B3B",msg1) == 0){ // Compara con "Pwm1000" + pwm0 = 1; + + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 1; + wait(.5); + LedRojo = 1; LedVerde = 1; LedAzul = 0; + wait(.5); + LedRojo = 1; LedVerde = 0; LedAzul = 1; + } + + cleanBuffer(buffer,100); } - - - - -//***************ALARMA POR ACTIVACION PIR*************************************************** - if (PIR.falling()) - { - wait(1); - if (!PIR) - { - -//**********se envia la palabra Intrusos en rionegro a cuatro telefonos diferentes.... -//******Gustavo - GSM.printf("AT+CMGS=50\n\r"); - wait_ms(200); - GSM.printf("0011000A9113223717370000AA2A21970B19CE83926EBABC3E7FCF41453788190699D3EE7118442E83A4E9B7BB7C96BF5DAE10"); - wait_ms(200); - GSM.putc((char)0x1A); - wait(10); - ///si el operador contesta con mensaje borrar de nuevo - GSM.printf("AT+CMGD=0");//envio comando para borrar mensaje - GSM.putc(0x0D);//envoi du caractere \n - wait(1); - GSM.printf("AT+CMGD=1");//envio comando para borrar mensaje - GSM.putc(0x0D);//envoi du caractere \n - wait(1); - } - } - - -}// while -}// main -/* -// P -/* GSM.printf("AT+CMGS=50\n\r"); - wait_ms(200); - GSM.printf("0011000A91-00000000-0000AA2A21970B19CE83926EBABC3E7FCF41453788190699D3EE7118442E83A4E9B7BB7C96BF5DAE10"); - wait_ms(200); - GSM.putc((char)0x1A); -// Y - GSM.printf("AT+CMGS=50\n\r"); - wait_ms(200); - GSM.printf("0011000A91-00000000-0000AA2A21970B19CE83926EBABC3E7FCF41453788190699D3EE7118442E83A4E9B7BB7C96BF5DAE10"); - wait_ms(200); - GSM.putc((char)0x1A); -// S - GSM.printf("AT+CMGS=50\n\r"); - wait_ms(200); - GSM.printf("0011000A91-00000000-0000AA2A21970B19CE83926EBABC3E7FCF41453788190699D3EE7118442E83A4E9B7BB7C96BF5DAE10"); - wait_ms(200); - GSM.putc((char)0x1A); - - wait(30); -} -} -} //while -} //main - -/* -Camara on - -da esto - +CMGL: 1,0,,26 -0791751330512411040AA1132237173700006150709060250A09C3703B2C0F83DE6E - -Camara of da esto -+CMGL: 2,0,,26 -0791751330080089040AA1132237173700006150709001520A09C3703B2C0F83DE66 - -OK - -Sirena on -da esto - -+CMGL: 3,0,,26 -0791751330512411040AA1132237173700006150709031540A09D3B4BCEC0E83DE6E - -OK - -Sirena of - -da esto -+CMGL: 4,0,,26 -0791751330512411040AA1132237173700006150709051750A09D3B4BCEC0E83DE66 - -OK - -Alarma 1 - -+CMGL: 1,0,,25 -0791751330512411040AA1132237173700006150702153640A08417658DE0E8362 -5 - - - -*/ \ No newline at end of file + } +} \ No newline at end of file