Trabajo, en el cual se envia un mensaje al celular, el cual actua como modem, y en el mensaje esta para activar una alarma segun el mensaje que se envie
Dependencies: DebouncedIn mbed
Fork of CLASEDELGSM by
main.cpp@2:44e88001ce29, 2015-11-24 (annotated)
- Committer:
- GermanD
- Date:
- Tue Nov 24 05:19:14 2015 +0000
- Revision:
- 2:44e88001ce29
- Parent:
- 1:6b506dde0a6e
Trabajo, en el cual se envia un mensaje al celular, el cual actua como modem, y en el mensaje esta para activar una alarma segun el mensaje que se envie
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tony63 | 0:edc50cf04b46 | 1 | // Programa para enviar desde la FRDMKL25Z un mensaje de texto en formatp PDU |
tony63 | 0:edc50cf04b46 | 2 | // Como modem usa un celular SIEMENS a56i |
tony63 | 0:edc50cf04b46 | 3 | // ENVIAR -----la palabra "ALARMA 1" |
tony63 | 0:edc50cf04b46 | 4 | // |
tony63 | 0:edc50cf04b46 | 5 | |
tony63 | 0:edc50cf04b46 | 6 | // OJO CON ESTO |
tony63 | 0:edc50cf04b46 | 7 | // conector del siemens cable verde es RX conectelo a PTE0 cable blanco es TX conectelo a PTE1 |
tony63 | 0:edc50cf04b46 | 8 | #include "mbed.h" |
tony63 | 0:edc50cf04b46 | 9 | #include "DebouncedIn.h" |
tony63 | 0:edc50cf04b46 | 10 | #include "stdio.h" |
tony63 | 0:edc50cf04b46 | 11 | #include "string.h" |
tony63 | 0:edc50cf04b46 | 12 | Timer t; |
tony63 | 0:edc50cf04b46 | 13 | DigitalOut LedVerde(LED2); |
tony63 | 0:edc50cf04b46 | 14 | DigitalOut LedRojo(LED1); |
tony63 | 0:edc50cf04b46 | 15 | DigitalOut LedAzul(LED3); |
tony63 | 0:edc50cf04b46 | 16 | DebouncedIn button1(PTC12); //señal que inicia el envio del mensaje |
tony63 | 0:edc50cf04b46 | 17 | Serial GSM(PTE0,PTE1); //Configura puerto UART de la FRDMKL25Z |
tony63 | 0:edc50cf04b46 | 18 | Serial pc(USBTX,USBRX);//Configura puerto USB a la consola serial del PC conectado. |
tony63 | 0:edc50cf04b46 | 19 | void Rx_interrupt(); |
tony63 | 0:edc50cf04b46 | 20 | int position=0; |
GermanD | 2:44e88001ce29 | 21 | int intentos=0; |
tony63 | 0:edc50cf04b46 | 22 | int lenpack=6; |
GermanD | 2:44e88001ce29 | 23 | int ret=1; |
tony63 | 0:edc50cf04b46 | 24 | int longi=0; |
tony63 | 1:6b506dde0a6e | 25 | char tel[11]; |
tony63 | 0:edc50cf04b46 | 26 | char DE[50]; |
tony63 | 1:6b506dde0a6e | 27 | char buffer[100]; |
GermanD | 2:44e88001ce29 | 28 | char buffermsg[100]; |
GermanD | 2:44e88001ce29 | 29 | char buffer1[100]; |
tony63 | 1:6b506dde0a6e | 30 | char datos[100]; |
GermanD | 2:44e88001ce29 | 31 | char NUMBER[13]; |
GermanD | 2:44e88001ce29 | 32 | char resp[6]; |
GermanD | 2:44e88001ce29 | 33 | char CMT[]="+CMTI"; |
GermanD | 2:44e88001ce29 | 34 | char tam[2]; |
tony63 | 0:edc50cf04b46 | 35 | int index; |
tony63 | 0:edc50cf04b46 | 36 | int count; |
tony63 | 0:edc50cf04b46 | 37 | int i = 0; |
tony63 | 1:6b506dde0a6e | 38 | int j = 0; |
tony63 | 0:edc50cf04b46 | 39 | int c=0; |
tony63 | 0:edc50cf04b46 | 40 | unsigned char CtrlZ = 0x1A; // comodin de emision controlZ |
tony63 | 0:edc50cf04b46 | 41 | bool Flag = false; // bandera |
tony63 | 0:edc50cf04b46 | 42 | char r[]=""; //Cadena de recepcion de la trama PDU si se usa!! |
tony63 | 0:edc50cf04b46 | 43 | char msg[256]; |
tony63 | 0:edc50cf04b46 | 44 | char char1; |
tony63 | 0:edc50cf04b46 | 45 | //Flush serial para el buffer |
tony63 | 0:edc50cf04b46 | 46 | void FlushGSM(void) { |
tony63 | 0:edc50cf04b46 | 47 | char1 = 0; |
GermanD | 2:44e88001ce29 | 48 | while (GSM.readable()){ // lee lo que le entra por el puerto GSM |
GermanD | 2:44e88001ce29 | 49 | char1 = GSM.getc();} // y lo pone en la variable hcar1 |
tony63 | 0:edc50cf04b46 | 50 | return;} |
tony63 | 0:edc50cf04b46 | 51 | |
tony63 | 0:edc50cf04b46 | 52 | void callback() { |
tony63 | 0:edc50cf04b46 | 53 | // Note: you need to actually read from the serial to clear the RX interrupt |
tony63 | 0:edc50cf04b46 | 54 | pc.printf("%c\n", GSM.getc()); |
tony63 | 0:edc50cf04b46 | 55 | |
tony63 | 0:edc50cf04b46 | 56 | } |
GermanD | 2:44e88001ce29 | 57 | //**************************************************************************************************************** |
GermanD | 2:44e88001ce29 | 58 | //esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de |
GermanD | 2:44e88001ce29 | 59 | //$, count es lo que va a leer.Lo leido lo mete en buffer que es una cadena previamente definida |
GermanD | 2:44e88001ce29 | 60 | //incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1 |
GermanD | 2:44e88001ce29 | 61 | //**************************************************************************************************************** |
tony63 | 0:edc50cf04b46 | 62 | int readBuffer(char *buffer,int count) |
tony63 | 0:edc50cf04b46 | 63 | { |
tony63 | 0:edc50cf04b46 | 64 | int i=0; |
tony63 | 0:edc50cf04b46 | 65 | t.start(); // start timer |
tony63 | 0:edc50cf04b46 | 66 | while(1) { |
GermanD | 2:44e88001ce29 | 67 | while (GSM.readable()) { // leelo que está entrando por el GSM |
GermanD | 2:44e88001ce29 | 68 | char c = GSM.getc(); // asigna el valor que entra a c |
tony63 | 0:edc50cf04b46 | 69 | if (c == '\r' || c == '\n') c = '$'; |
GermanD | 2:44e88001ce29 | 70 | buffer[i++] = c; // aumenta la posición del buffer y coloca c en ella |
GermanD | 2:44e88001ce29 | 71 | if(i > count)break; // si i es mayor que lo que lee para y sale del ciclo infinito |
tony63 | 0:edc50cf04b46 | 72 | } |
GermanD | 2:44e88001ce29 | 73 | if(i > count)break; |
GermanD | 2:44e88001ce29 | 74 | if(t.read() > 3) { // si se demora mas de 3 segundos |
GermanD | 2:44e88001ce29 | 75 | t.stop(); // para el reloj y |
GermanD | 2:44e88001ce29 | 76 | t.reset(); // lo resetea |
tony63 | 0:edc50cf04b46 | 77 | break; |
tony63 | 0:edc50cf04b46 | 78 | } |
tony63 | 0:edc50cf04b46 | 79 | } |
tony63 | 0:edc50cf04b46 | 80 | wait(0.5); |
tony63 | 0:edc50cf04b46 | 81 | while(GSM.readable()) { // display the other thing.. |
tony63 | 0:edc50cf04b46 | 82 | char c = GSM.getc(); |
tony63 | 0:edc50cf04b46 | 83 | } |
tony63 | 0:edc50cf04b46 | 84 | return 0; |
tony63 | 0:edc50cf04b46 | 85 | } |
GermanD | 2:44e88001ce29 | 86 | //******************************************************************************** |
tony63 | 0:edc50cf04b46 | 87 | /* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count" |
GermanD | 2:44e88001ce29 | 88 | lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena |
tony63 | 0:edc50cf04b46 | 89 | no retorna nada |
tony63 | 0:edc50cf04b46 | 90 | */ |
tony63 | 0:edc50cf04b46 | 91 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 92 | void cleanBuffer(char *buffer, int count) |
tony63 | 0:edc50cf04b46 | 93 | { |
tony63 | 0:edc50cf04b46 | 94 | for(int i=0; i < count; i++) { |
tony63 | 0:edc50cf04b46 | 95 | buffer[i] = '\0'; |
tony63 | 0:edc50cf04b46 | 96 | } |
tony63 | 0:edc50cf04b46 | 97 | } |
tony63 | 0:edc50cf04b46 | 98 | /* esta funcion de abajo envia un comando parametrizado como cadena |
GermanD | 2:44e88001ce29 | 99 | puede ser un comando tipo AT |
tony63 | 0:edc50cf04b46 | 100 | */ |
tony63 | 0:edc50cf04b46 | 101 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 102 | void sendCmd(char *cmd) |
tony63 | 0:edc50cf04b46 | 103 | { |
tony63 | 0:edc50cf04b46 | 104 | GSM.puts(cmd); |
tony63 | 0:edc50cf04b46 | 105 | } |
GermanD | 2:44e88001ce29 | 106 | //**************************************************************************************** |
tony63 | 0:edc50cf04b46 | 107 | /* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout" |
tony63 | 0:edc50cf04b46 | 108 | si todo sale bien retorna un cero que en la programacion hay que validar |
tony63 | 0:edc50cf04b46 | 109 | si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 110 | */ |
tony63 | 0:edc50cf04b46 | 111 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 112 | int waitForResp(char *resp, int timeout) |
tony63 | 0:edc50cf04b46 | 113 | { |
GermanD | 2:44e88001ce29 | 114 | int len = strlen(resp); // mide la longitud del string |
tony63 | 0:edc50cf04b46 | 115 | int sum=0; |
tony63 | 0:edc50cf04b46 | 116 | t.start(); |
tony63 | 0:edc50cf04b46 | 117 | |
tony63 | 0:edc50cf04b46 | 118 | while(1) { |
GermanD | 2:44e88001ce29 | 119 | if(GSM.readable()) { |
GermanD | 2:44e88001ce29 | 120 | char c = GSM.getc(); // pone lo que le entra por GSM en la variable c |
tony63 | 0:edc50cf04b46 | 121 | sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c |
tony63 | 0:edc50cf04b46 | 122 | if(sum == len)break; //ya acabo se sale |
tony63 | 0:edc50cf04b46 | 123 | } |
tony63 | 0:edc50cf04b46 | 124 | if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo |
tony63 | 0:edc50cf04b46 | 125 | t.stop(); |
tony63 | 0:edc50cf04b46 | 126 | t.reset(); |
GermanD | 2:44e88001ce29 | 127 | return -1; // devuelve -1 como "fallo" |
tony63 | 0:edc50cf04b46 | 128 | } |
tony63 | 0:edc50cf04b46 | 129 | } |
tony63 | 0:edc50cf04b46 | 130 | t.stop(); // stop timer antes de retornar |
tony63 | 0:edc50cf04b46 | 131 | t.reset(); // clear timer |
tony63 | 0:edc50cf04b46 | 132 | while(GSM.readable()) { // display the other thing.. |
tony63 | 0:edc50cf04b46 | 133 | char c = GSM.getc(); |
tony63 | 0:edc50cf04b46 | 134 | } |
tony63 | 0:edc50cf04b46 | 135 | |
tony63 | 0:edc50cf04b46 | 136 | return 0; |
tony63 | 0:edc50cf04b46 | 137 | } |
tony63 | 0:edc50cf04b46 | 138 | /* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta |
tony63 | 0:edc50cf04b46 | 139 | si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar |
tony63 | 0:edc50cf04b46 | 140 | con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 141 | */ |
tony63 | 0:edc50cf04b46 | 142 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 143 | int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout) |
tony63 | 0:edc50cf04b46 | 144 | { |
tony63 | 0:edc50cf04b46 | 145 | sendCmd(cmd); |
tony63 | 0:edc50cf04b46 | 146 | return waitForResp(resp,timeout); |
tony63 | 0:edc50cf04b46 | 147 | } |
tony63 | 0:edc50cf04b46 | 148 | /* esta funcion de abajo chequea que el modem este vivo envia AT y le contesta con OK y espera 2 segundos |
tony63 | 0:edc50cf04b46 | 149 | */ |
tony63 | 0:edc50cf04b46 | 150 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 151 | int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado |
tony63 | 0:edc50cf04b46 | 152 | { |
tony63 | 0:edc50cf04b46 | 153 | return sendCmdAndWaitForResp("AT\r\n", "OK", 2); |
tony63 | 0:edc50cf04b46 | 154 | } |
tony63 | 0:edc50cf04b46 | 155 | /* esta funcion de abajo chequea el estado de la sim card |
tony63 | 0:edc50cf04b46 | 156 | y si todo sale bien retorna un cero que en la programacion hay que validar |
tony63 | 0:edc50cf04b46 | 157 | con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 158 | */ |
tony63 | 0:edc50cf04b46 | 159 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 160 | int checkSIMStatus(void) |
tony63 | 0:edc50cf04b46 | 161 | { |
tony63 | 0:edc50cf04b46 | 162 | char gprsBuffer[30]; |
tony63 | 0:edc50cf04b46 | 163 | int count = 0; |
tony63 | 0:edc50cf04b46 | 164 | cleanBuffer(gprsBuffer,30); |
tony63 | 0:edc50cf04b46 | 165 | while(count < 3) { |
GermanD | 2:44e88001ce29 | 166 | sendCmd("AT+CPIN?\r\n"); // envia el comando AT para ver que le devuelve |
tony63 | 0:edc50cf04b46 | 167 | readBuffer(gprsBuffer,30); |
tony63 | 0:edc50cf04b46 | 168 | if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) { |
tony63 | 0:edc50cf04b46 | 169 | break; |
tony63 | 0:edc50cf04b46 | 170 | } |
tony63 | 0:edc50cf04b46 | 171 | count++; |
tony63 | 0:edc50cf04b46 | 172 | wait(1); |
tony63 | 0:edc50cf04b46 | 173 | } |
GermanD | 2:44e88001ce29 | 174 | // si la simcard no responde envia -1 |
GermanD | 2:44e88001ce29 | 175 | if(count == 3) { |
tony63 | 0:edc50cf04b46 | 176 | return -1; |
tony63 | 0:edc50cf04b46 | 177 | } |
tony63 | 0:edc50cf04b46 | 178 | return 0; |
tony63 | 0:edc50cf04b46 | 179 | } |
tony63 | 0:edc50cf04b46 | 180 | /* esta funcion de abajo chequea la calidad de la señal |
GermanD | 2:44e88001ce29 | 181 | 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 |
tony63 | 0:edc50cf04b46 | 182 | con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 183 | */ |
tony63 | 0:edc50cf04b46 | 184 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 185 | int checkSignalStrength(void) |
tony63 | 0:edc50cf04b46 | 186 | { |
tony63 | 0:edc50cf04b46 | 187 | char gprsBuffer[100]; |
tony63 | 0:edc50cf04b46 | 188 | int index,count = 0; |
GermanD | 2:44e88001ce29 | 189 | cleanBuffer(gprsBuffer,100); // siempre hacemos esto para garantizar que el buffer esté limpio y no haga nada raro |
tony63 | 0:edc50cf04b46 | 190 | while(count < 3) { |
GermanD | 2:44e88001ce29 | 191 | sendCmd("AT+CSQ\r\n"); // envia un comando al odem y para verificar si la señal está buena |
GermanD | 2:44e88001ce29 | 192 | readBuffer(gprsBuffer,25); // lee lo que devuelve el modem desde el buffer |
GermanD | 2:44e88001ce29 | 193 | if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) { // verifica que el nivel de cobertura sea bueno |
tony63 | 0:edc50cf04b46 | 194 | break; |
tony63 | 0:edc50cf04b46 | 195 | } |
tony63 | 0:edc50cf04b46 | 196 | count++; |
tony63 | 0:edc50cf04b46 | 197 | wait(1); |
tony63 | 0:edc50cf04b46 | 198 | } |
tony63 | 0:edc50cf04b46 | 199 | if(count == 3) { |
GermanD | 2:44e88001ce29 | 200 | return -1; // si no es lo esperado devuelve un erro con -1 |
tony63 | 0:edc50cf04b46 | 201 | } |
tony63 | 0:edc50cf04b46 | 202 | return index; |
tony63 | 0:edc50cf04b46 | 203 | } |
tony63 | 0:edc50cf04b46 | 204 | |
tony63 | 0:edc50cf04b46 | 205 | /* esta funcion de abajo inicaliza el modem se compone de un grupo de subfunciones ya definidas previamente |
tony63 | 0:edc50cf04b46 | 206 | primero chequea que este vivo |
tony63 | 0:edc50cf04b46 | 207 | segundo chequea el estado de la simcard |
tony63 | 0:edc50cf04b46 | 208 | tercero chequea la intencidad de señal celular |
tony63 | 0:edc50cf04b46 | 209 | cuarto aplica la configuracion |
tony63 | 0:edc50cf04b46 | 210 | y si todo sale bien retorna un cero que en la programacion hay que validar |
tony63 | 0:edc50cf04b46 | 211 | con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 212 | */ |
tony63 | 0:edc50cf04b46 | 213 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 214 | int init() |
tony63 | 0:edc50cf04b46 | 215 | { |
GermanD | 2:44e88001ce29 | 216 | if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){ |
GermanD | 2:44e88001ce29 | 217 | return -1; |
GermanD | 2:44e88001ce29 | 218 | } |
GermanD | 2:44e88001ce29 | 219 | if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){ |
GermanD | 2:44e88001ce29 | 220 | return -1; |
GermanD | 2:44e88001ce29 | 221 | } |
GermanD | 2:44e88001ce29 | 222 | if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){ |
tony63 | 0:edc50cf04b46 | 223 | return -1; |
GermanD | 2:44e88001ce29 | 224 | } |
GermanD | 2:44e88001ce29 | 225 | if (0 != sendCmdAndWaitForResp("AT+CBST=0,0,1\r\n", "OK", 3)){ |
tony63 | 0:edc50cf04b46 | 226 | return -1; |
GermanD | 2:44e88001ce29 | 227 | } |
GermanD | 2:44e88001ce29 | 228 | LedVerde=0; |
GermanD | 2:44e88001ce29 | 229 | return 0; |
GermanD | 2:44e88001ce29 | 230 | } |
GermanD | 2:44e88001ce29 | 231 | |
tony63 | 0:edc50cf04b46 | 232 | /* esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX |
tony63 | 0:edc50cf04b46 | 233 | y si todo sale bien retorna un cero que en la programacion hay que validar |
tony63 | 0:edc50cf04b46 | 234 | con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 235 | */ |
tony63 | 0:edc50cf04b46 | 236 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 237 | int readSMSpdu(char *message, int index) |
tony63 | 0:edc50cf04b46 | 238 | { |
tony63 | 0:edc50cf04b46 | 239 | int i = 0; |
tony63 | 0:edc50cf04b46 | 240 | char gprsBuffer[100]; |
tony63 | 0:edc50cf04b46 | 241 | char *p,*s; |
tony63 | 0:edc50cf04b46 | 242 | GSM.printf("AT+CMGR=%d\r\n",index); |
tony63 | 0:edc50cf04b46 | 243 | cleanBuffer(gprsBuffer,100); |
tony63 | 0:edc50cf04b46 | 244 | readBuffer(gprsBuffer,100); |
tony63 | 0:edc50cf04b46 | 245 | if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) { |
tony63 | 0:edc50cf04b46 | 246 | return -1; |
tony63 | 0:edc50cf04b46 | 247 | } |
tony63 | 0:edc50cf04b46 | 248 | if(NULL != ( s = strstr(gprsBuffer,"+32"))) { |
tony63 | 0:edc50cf04b46 | 249 | p = s + 6; |
tony63 | 0:edc50cf04b46 | 250 | while((*p != '$')&&(i < 5)) { |
tony63 | 0:edc50cf04b46 | 251 | message[i++] = *(p++); |
tony63 | 0:edc50cf04b46 | 252 | } |
tony63 | 0:edc50cf04b46 | 253 | message[i] = '\0'; |
tony63 | 0:edc50cf04b46 | 254 | } |
tony63 | 0:edc50cf04b46 | 255 | return 0; |
tony63 | 0:edc50cf04b46 | 256 | } |
tony63 | 0:edc50cf04b46 | 257 | /* esta funcion de abajo borra mensajes SMS del modem |
tony63 | 0:edc50cf04b46 | 258 | y si todo sale bien retorna un cero que en la programacion hay que validar |
tony63 | 0:edc50cf04b46 | 259 | con alguna expresion logica |
tony63 | 0:edc50cf04b46 | 260 | */ |
tony63 | 0:edc50cf04b46 | 261 | //*************************************************************************************** |
tony63 | 0:edc50cf04b46 | 262 | int deleteSMS(int index) |
tony63 | 0:edc50cf04b46 | 263 | { |
tony63 | 0:edc50cf04b46 | 264 | char cmd[32]; |
tony63 | 0:edc50cf04b46 | 265 | snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); |
tony63 | 0:edc50cf04b46 | 266 | sendCmd(cmd); |
tony63 | 0:edc50cf04b46 | 267 | return 0; |
tony63 | 0:edc50cf04b46 | 268 | } |
GermanD | 2:44e88001ce29 | 269 | //************************************************************************************ |
tony63 | 0:edc50cf04b46 | 270 | |
GermanD | 2:44e88001ce29 | 271 | //RUTINA PRINCIPAL******************************************************************************************* |
tony63 | 0:edc50cf04b46 | 272 | int main(void) |
GermanD | 2:44e88001ce29 | 273 | { |
GermanD | 2:44e88001ce29 | 274 | //configuramos los puertos seriales |
GermanD | 2:44e88001ce29 | 275 | GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600 |
GermanD | 2:44e88001ce29 | 276 | GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART |
tony63 | 0:edc50cf04b46 | 277 | //apagamos los 3 leds |
tony63 | 0:edc50cf04b46 | 278 | LedVerde=1; |
tony63 | 0:edc50cf04b46 | 279 | LedRojo=1; |
tony63 | 0:edc50cf04b46 | 280 | LedAzul=1; |
GermanD | 2:44e88001ce29 | 281 | //quito el eco del modem |
GermanD | 2:44e88001ce29 | 282 | GSM.printf("ATE0\r\n"); |
GermanD | 2:44e88001ce29 | 283 | pc.printf("ATE0\r\n"); |
GermanD | 2:44e88001ce29 | 284 | for(i=0;i<6;i++){ |
GermanD | 2:44e88001ce29 | 285 | GSM.printf("AT+CMGD=%d\r\n",i); |
GermanD | 2:44e88001ce29 | 286 | wait(0.2); |
GermanD | 2:44e88001ce29 | 287 | } |
GermanD | 2:44e88001ce29 | 288 | //cleanBuffer(buffer,10); |
GermanD | 2:44e88001ce29 | 289 | //definicion de algunas variables |
tony63 | 0:edc50cf04b46 | 290 | lenpack=6; //tamaño de "ALARMA" |
GermanD | 2:44e88001ce29 | 291 | //Configuro el Modem, le doy solo 10 intentos si esos fracasan se bloquea y prende intermitente el led rojo |
GermanD | 2:44e88001ce29 | 292 | inicio:if(init()<0){ |
GermanD | 2:44e88001ce29 | 293 | intentos++; |
GermanD | 2:44e88001ce29 | 294 | if (intentos==10){goto loop1;} |
GermanD | 2:44e88001ce29 | 295 | goto inicio; |
GermanD | 2:44e88001ce29 | 296 | } |
GermanD | 2:44e88001ce29 | 297 | //cleanBuffer(buffer,50); |
GermanD | 2:44e88001ce29 | 298 | //inicia el programa ciclico |
GermanD | 2:44e88001ce29 | 299 | //esperar señales de alarma por boton1 |
GermanD | 2:44e88001ce29 | 300 | //se envia "Alarma1" |
GermanD | 2:44e88001ce29 | 301 | //al telefono que envio mensaje antes |
GermanD | 2:44e88001ce29 | 302 | |
GermanD | 2:44e88001ce29 | 303 | //********************************************************************************************************************* |
GermanD | 2:44e88001ce29 | 304 | while(1){ |
GermanD | 2:44e88001ce29 | 305 | if (button1.falling()) |
GermanD | 2:44e88001ce29 | 306 | { |
tony63 | 0:edc50cf04b46 | 307 | wait(2); |
tony63 | 0:edc50cf04b46 | 308 | if (!button1) |
GermanD | 2:44e88001ce29 | 309 | { |
GermanD | 2:44e88001ce29 | 310 | //inicia el envio de un sms |
GermanD | 2:44e88001ce29 | 311 | index=19; |
GermanD | 2:44e88001ce29 | 312 | GSM.printf("AT+CMGS=%d\r\n",index); |
GermanD | 2:44e88001ce29 | 313 | wait(0.2); |
GermanD | 2:44e88001ce29 | 314 | GSM.printf("0011000A91"); |
GermanD | 2:44e88001ce29 | 315 | GSM.printf("%s",tel); |
GermanD | 2:44e88001ce29 | 316 | GSM.printf("0000AA07417658DE0EC7"); |
GermanD | 2:44e88001ce29 | 317 | GSM.printf("\r\n"); |
GermanD | 2:44e88001ce29 | 318 | wait(0.2); |
GermanD | 2:44e88001ce29 | 319 | GSM.putc(0x1A); //el mensaje ya fue enviado con esto |
GermanD | 2:44e88001ce29 | 320 | for(i=0;i<6;i++){ |
GermanD | 2:44e88001ce29 | 321 | LedVerde=1; |
GermanD | 2:44e88001ce29 | 322 | wait(0.5); |
GermanD | 2:44e88001ce29 | 323 | LedVerde=0; |
GermanD | 2:44e88001ce29 | 324 | wait(0.5); |
GermanD | 2:44e88001ce29 | 325 | } |
GermanD | 2:44e88001ce29 | 326 | } |
GermanD | 2:44e88001ce29 | 327 | } |
GermanD | 2:44e88001ce29 | 328 | |
GermanD | 2:44e88001ce29 | 329 | |
GermanD | 2:44e88001ce29 | 330 | |
GermanD | 2:44e88001ce29 | 331 | //inicia la recepcion de un mensaje de texto |
GermanD | 2:44e88001ce29 | 332 | if (GSM.readable()) { |
GermanD | 2:44e88001ce29 | 333 | readBuffer(buffer,100); |
GermanD | 2:44e88001ce29 | 334 | pc.printf("%s\r\n",buffer); |
GermanD | 2:44e88001ce29 | 335 | for(i=0;i<5;i++) |
GermanD | 2:44e88001ce29 | 336 | { |
GermanD | 2:44e88001ce29 | 337 | resp[i]=buffer[i]; |
GermanD | 2:44e88001ce29 | 338 | } |
GermanD | 2:44e88001ce29 | 339 | |
GermanD | 2:44e88001ce29 | 340 | //el programa empieza a verificar que le llego el mensaje |
GermanD | 2:44e88001ce29 | 341 | //para que le llegue la cadena larga de caracteres, hay se detecta el numero telefonico |
GermanD | 2:44e88001ce29 | 342 | //ya que en la cadena nos envia caracteres "basura" que no necesitamos |
GermanD | 2:44e88001ce29 | 343 | |
GermanD | 2:44e88001ce29 | 344 | pc.printf("%s\r\n",resp); |
GermanD | 2:44e88001ce29 | 345 | if(strcmp("$$+CM",resp) == 0){ //COMPARA resp con "+CMTI" |
GermanD | 2:44e88001ce29 | 346 | pc.printf("llego MSG\r\n"); |
GermanD | 2:44e88001ce29 | 347 | cleanBuffer(buffer,10); |
GermanD | 2:44e88001ce29 | 348 | wait(0.5); |
GermanD | 2:44e88001ce29 | 349 | GSM.printf("AT+CMGL=0\r\n");//envio comando para leer mensaje |
GermanD | 2:44e88001ce29 | 350 | pc.printf("AT+CMGL=0\r\n"); |
GermanD | 2:44e88001ce29 | 351 | //if (GSM.readable()) { |
GermanD | 2:44e88001ce29 | 352 | GSM.printf("AT+CMGD=0\r\n"); |
GermanD | 2:44e88001ce29 | 353 | readBuffer(buffer,100); |
GermanD | 2:44e88001ce29 | 354 | pc.printf("%s\r\n",buffer); |
GermanD | 2:44e88001ce29 | 355 | wait(5); |
GermanD | 2:44e88001ce29 | 356 | //leer telefono |
GermanD | 2:44e88001ce29 | 357 | for(i=0;i<10;i++){ |
GermanD | 2:44e88001ce29 | 358 | tel[i]=buffer[i+40]; |
GermanD | 2:44e88001ce29 | 359 | } |
GermanD | 2:44e88001ce29 | 360 | pc.printf("%s-\r\n",tel); |
GermanD | 2:44e88001ce29 | 361 | //leer tamaño |
GermanD | 2:44e88001ce29 | 362 | for(i=0;i<2;i++){ |
GermanD | 2:44e88001ce29 | 363 | tam[i]=buffer[i+68]; |
GermanD | 2:44e88001ce29 | 364 | } |
GermanD | 2:44e88001ce29 | 365 | pc.printf("%s-\r\n",tam); |
GermanD | 2:44e88001ce29 | 366 | //leer mensaje |
GermanD | 2:44e88001ce29 | 367 | for(i=0;i<14;i++){ |
GermanD | 2:44e88001ce29 | 368 | msg[i]=buffer[i+70]; |
GermanD | 2:44e88001ce29 | 369 | } |
GermanD | 2:44e88001ce29 | 370 | |
GermanD | 2:44e88001ce29 | 371 | //lee el resto del mensaje de los valores que necesitamos al final de la cadena para hacer el codigo |
GermanD | 2:44e88001ce29 | 372 | |
GermanD | 2:44e88001ce29 | 373 | pc.printf("%s-\r\n",msg); |
GermanD | 2:44e88001ce29 | 374 | //decodificar mensaje |
GermanD | 2:44e88001ce29 | 375 | //comparar mensaje |
GermanD | 2:44e88001ce29 | 376 | if(strcmp("417658DE0EC700",msg) == 0){ //COMPARA resp con "417658DE0EC700" que es Alarma1 |
GermanD | 2:44e88001ce29 | 377 | LedVerde=1; |
GermanD | 2:44e88001ce29 | 378 | LedAzul=0; |
GermanD | 2:44e88001ce29 | 379 | wait(15); |
GermanD | 2:44e88001ce29 | 380 | LedAzul=1; |
GermanD | 2:44e88001ce29 | 381 | LedVerde=0; |
GermanD | 2:44e88001ce29 | 382 | } |
GermanD | 2:44e88001ce29 | 383 | // cuando se le envia el mensaje conociendo lo anterior, y si el mensaje es prender la alarma, |
GermanD | 2:44e88001ce29 | 384 | // este preunde el led corresponiente indicando que se activo la alarma, con el mensaje que le llego al telefono |
GermanD | 2:44e88001ce29 | 385 | if(strcmp("417658DE0ECB00",msg) == 0){ //COMPARA resp con "417658DE0ECB00" que es Alarma2 |
GermanD | 2:44e88001ce29 | 386 | LedVerde=1; |
GermanD | 2:44e88001ce29 | 387 | LedRojo=0; |
GermanD | 2:44e88001ce29 | 388 | wait(15); |
GermanD | 2:44e88001ce29 | 389 | LedRojo=1; |
GermanD | 2:44e88001ce29 | 390 | LedVerde=0; |
GermanD | 2:44e88001ce29 | 391 | } |
GermanD | 2:44e88001ce29 | 392 | |
GermanD | 2:44e88001ce29 | 393 | |
GermanD | 2:44e88001ce29 | 394 | //ejecurar orden //ya se ejecuto |
GermanD | 2:44e88001ce29 | 395 | //08-D6379B1E569763 esto es Voltaje1 |
GermanD | 2:44e88001ce29 | 396 | //finalmente limpa la memoria para que pueda recibir nuevos mensajes |
GermanD | 2:44e88001ce29 | 397 | |
GermanD | 2:44e88001ce29 | 398 | cleanBuffer(buffer,100); |
GermanD | 2:44e88001ce29 | 399 | |
GermanD | 2:44e88001ce29 | 400 | } |
tony63 | 1:6b506dde0a6e | 401 | } |
GermanD | 2:44e88001ce29 | 402 | |
GermanD | 2:44e88001ce29 | 403 | |
GermanD | 2:44e88001ce29 | 404 | } |
GermanD | 2:44e88001ce29 | 405 | |
GermanD | 2:44e88001ce29 | 406 | |
GermanD | 2:44e88001ce29 | 407 | //********************************************************************************************************************** |
GermanD | 2:44e88001ce29 | 408 | loop1: LedRojo=0; |
GermanD | 2:44e88001ce29 | 409 | wait(0.3); |
GermanD | 2:44e88001ce29 | 410 | LedRojo=1; |
GermanD | 2:44e88001ce29 | 411 | wait(0.3); |
GermanD | 2:44e88001ce29 | 412 | goto loop1; |
GermanD | 2:44e88001ce29 | 413 | |
tony63 | 0:edc50cf04b46 | 414 | } |