mide voltaje por gsm

Dependencies:   mbed

Fork of AnalogMeasurements_GSM by Juan Pablo Viana Villa

Committer:
PabloViana
Date:
Sat Nov 21 16:58:55 2015 +0000
Revision:
0:d7d64e8b652a
Analog measuremnts sent as answer using GSM Network

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PabloViana 0:d7d64e8b652a 1 /*==========================================================================================
PabloViana 0:d7d64e8b652a 2 PROGRAMA PARA EL ENVÍO DE MEDICIONES ANALÓGICAS MEDIANTE RED GSM.
PabloViana 0:d7d64e8b652a 3 ING. JUAN PABLO VIANA VILLA
PabloViana 0:d7d64e8b652a 4 UNIVERSIDAD NACIONAL DE COLOMBIA - SEDE MEDELLÍN
PabloViana 0:d7d64e8b652a 5
PabloViana 0:d7d64e8b652a 6 DESCRIPCIÓN DEL FUNCIONAMIENTO:
PabloViana 0:d7d64e8b652a 7 El programa comienza realizando la inicialización del modem GSM mediante el envío de comandos "AT", se configuraron 10 intentos de conexión, en caso de no recibir respuesta del modem el programa terminará y será necesario reiniciar la plataforma KL25z.
PabloViana 0:d7d64e8b652a 8 Una vez detectada actividad por parte del modem el programa ingresa en un bucle infinito y se pone a la espera de recibir un mensaje de texto.
PabloViana 0:d7d64e8b652a 9 El programa está constantemente tratando de leer el modem, una vez detecta el mensaje SMS entrante (+CMTI), envía al modem el comando AT para la lectura de la cadena recibida y se activa una variable bandera para el envío de la respuesta.
PabloViana 0:d7d64e8b652a 10 NOTA: La cadena entrante sólo es útil para encontrar el número remitente, no se programó restricción alguna sobre el mensaje (sirve cualquiera).
PabloViana 0:d7d64e8b652a 11 Una vez leído el mensaje e identificado el remitente se sensa el valor de entrada analógica como valor de punto flotante. Se incluye una secuencia de líneas que convierten el valor medido en caracteres ASCII de la forma "Volt=x.xV" y estos a su vez son convertidos en octetos para proceder a su envío.
PabloViana 0:d7d64e8b652a 12 La trama PDU generada se despliega en pantalla en el pc monitor y es enviada al modem GSM finalizando con el caracter ASCII submit (26 - 0x1A) para de esta manera finalizar la transmisión del valor.
PabloViana 0:d7d64e8b652a 13 ==========================================================================================
PabloViana 0:d7d64e8b652a 14 */
PabloViana 0:d7d64e8b652a 15 #include "mbed.h"
PabloViana 0:d7d64e8b652a 16 #include "mbed.h"
PabloViana 0:d7d64e8b652a 17 #include "stdio.h"
PabloViana 0:d7d64e8b652a 18 #include "string.h"
PabloViana 0:d7d64e8b652a 19
PabloViana 0:d7d64e8b652a 20 //DEFINO PUERTOS Y ENTRADAS;
PabloViana 0:d7d64e8b652a 21 Serial pc(USBTX, USBRX);//Puerto Serial monitor;
PabloViana 0:d7d64e8b652a 22 AnalogIn A(PTB1); //Entrada analógica;
PabloViana 0:d7d64e8b652a 23 Serial GSM(PTE0,PTE1); //Puerto GSM. TX - RX
PabloViana 0:d7d64e8b652a 24 Timer t; //Un temporizador.
PabloViana 0:d7d64e8b652a 25
PabloViana 0:d7d64e8b652a 26
PabloViana 0:d7d64e8b652a 27 DigitalOut LedVerde(LED2);
PabloViana 0:d7d64e8b652a 28 DigitalOut LedRojo(LED1);
PabloViana 0:d7d64e8b652a 29 DigitalOut LedAzul(LED3);
PabloViana 0:d7d64e8b652a 30
PabloViana 0:d7d64e8b652a 31 //DEFINO VARIABLES GLOBALES
PabloViana 0:d7d64e8b652a 32 char DE[30] ="Volt=3.3V";
PabloViana 0:d7d64e8b652a 33 char DS[30];
PabloViana 0:d7d64e8b652a 34 char Tel[11]="1359252144";
PabloViana 0:d7d64e8b652a 35 int i=0;
PabloViana 0:d7d64e8b652a 36 int LENOUT;
PabloViana 0:d7d64e8b652a 37 int LENIN;
PabloViana 0:d7d64e8b652a 38 float V_float;
PabloViana 0:d7d64e8b652a 39 int V_int;
PabloViana 0:d7d64e8b652a 40 char bf[100]; //En esta variable voy a leer lo que mande el GMS;
PabloViana 0:d7d64e8b652a 41
PabloViana 0:d7d64e8b652a 42
PabloViana 0:d7d64e8b652a 43 //DEFINO VARIABLES DE LAS FUNCIONES RECICLADAS;
PabloViana 0:d7d64e8b652a 44
PabloViana 0:d7d64e8b652a 45 void Rx_interrupt();
PabloViana 0:d7d64e8b652a 46 int position=0;
PabloViana 0:d7d64e8b652a 47 int intentos=0;
PabloViana 0:d7d64e8b652a 48 int lenpack=6;
PabloViana 0:d7d64e8b652a 49 int ret=1;
PabloViana 0:d7d64e8b652a 50 int longi=0;
PabloViana 0:d7d64e8b652a 51 char tel[11];
PabloViana 0:d7d64e8b652a 52 char buffer[100];
PabloViana 0:d7d64e8b652a 53 char buffermsg[100];
PabloViana 0:d7d64e8b652a 54 char buffer1[100];
PabloViana 0:d7d64e8b652a 55 char datos[100];
PabloViana 0:d7d64e8b652a 56 char NUMBER[13];
PabloViana 0:d7d64e8b652a 57 char resp[6];
PabloViana 0:d7d64e8b652a 58 char CMT[]="+CMTI";
PabloViana 0:d7d64e8b652a 59 char tam[2];
PabloViana 0:d7d64e8b652a 60 int index;
PabloViana 0:d7d64e8b652a 61 int count;
PabloViana 0:d7d64e8b652a 62 int j = 0;
PabloViana 0:d7d64e8b652a 63 int c=0;
PabloViana 0:d7d64e8b652a 64 unsigned char CtrlZ = 0x1A; // comodin de emision controlZ
PabloViana 0:d7d64e8b652a 65 bool Flag = false; // bandera
PabloViana 0:d7d64e8b652a 66 char r[]=""; //Cadena de recepcion de la trama PDU si se usa!!
PabloViana 0:d7d64e8b652a 67 char msg[256];
PabloViana 0:d7d64e8b652a 68 char char1;
PabloViana 0:d7d64e8b652a 69
PabloViana 0:d7d64e8b652a 70
PabloViana 0:d7d64e8b652a 71 //Flush serial para el buffer
PabloViana 0:d7d64e8b652a 72 void FlushGSM(void) {
PabloViana 0:d7d64e8b652a 73 char1 = 0;
PabloViana 0:d7d64e8b652a 74 while (GSM.readable()){
PabloViana 0:d7d64e8b652a 75 char1 = GSM.getc();}
PabloViana 0:d7d64e8b652a 76 return;}
PabloViana 0:d7d64e8b652a 77
PabloViana 0:d7d64e8b652a 78 void callback() {
PabloViana 0:d7d64e8b652a 79 // Note: you need to actually read from the serial to clear the RX interrupt
PabloViana 0:d7d64e8b652a 80 pc.printf("%c\n", GSM.getc());
PabloViana 0:d7d64e8b652a 81
PabloViana 0:d7d64e8b652a 82 }
PabloViana 0:d7d64e8b652a 83
PabloViana 0:d7d64e8b652a 84 /*==================================================================================================================================================================
PabloViana 0:d7d64e8b652a 85 A Continuación se añaden una serie de funciones que se usarán posteriormente en el programa principal y que son provistas por el usuario Tony63;
PabloViana 0:d7d64e8b652a 86 Su funcionamiento se ha verifcado solo hasta el alcance de este programa.
PabloViana 0:d7d64e8b652a 87 ==================================================================================================================================================================*/
PabloViana 0:d7d64e8b652a 88
PabloViana 0:d7d64e8b652a 89
PabloViana 0:d7d64e8b652a 90
PabloViana 0:d7d64e8b652a 91
PabloViana 0:d7d64e8b652a 92 //****************************************************************************************************************
PabloViana 0:d7d64e8b652a 93 //esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de
PabloViana 0:d7d64e8b652a 94 //$, count es lo que va a leer.Lo leido lo mete en buffer que es una cadena previamente definida
PabloViana 0:d7d64e8b652a 95 //incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1
PabloViana 0:d7d64e8b652a 96 //****************************************************************************************************************
PabloViana 0:d7d64e8b652a 97 int readBuffer(char *buffer,int count)
PabloViana 0:d7d64e8b652a 98 {
PabloViana 0:d7d64e8b652a 99 int i=0;
PabloViana 0:d7d64e8b652a 100 t.start(); // start timer
PabloViana 0:d7d64e8b652a 101 while(1) {
PabloViana 0:d7d64e8b652a 102 while (GSM.readable()) {
PabloViana 0:d7d64e8b652a 103 char c = GSM.getc();
PabloViana 0:d7d64e8b652a 104 if (c == '\r' || c == '\n') c = '$';
PabloViana 0:d7d64e8b652a 105 buffer[i++] = c;
PabloViana 0:d7d64e8b652a 106 if(i > count)break;
PabloViana 0:d7d64e8b652a 107 }
PabloViana 0:d7d64e8b652a 108 if(i > count)break;
PabloViana 0:d7d64e8b652a 109 if(t.read() > 3) {
PabloViana 0:d7d64e8b652a 110 t.stop();
PabloViana 0:d7d64e8b652a 111 t.reset();
PabloViana 0:d7d64e8b652a 112 break;
PabloViana 0:d7d64e8b652a 113 }
PabloViana 0:d7d64e8b652a 114 }
PabloViana 0:d7d64e8b652a 115 wait(0.5);
PabloViana 0:d7d64e8b652a 116 while(GSM.readable()) { // display the other thing..
PabloViana 0:d7d64e8b652a 117 char c = GSM.getc();
PabloViana 0:d7d64e8b652a 118 }
PabloViana 0:d7d64e8b652a 119 return 0;
PabloViana 0:d7d64e8b652a 120 }
PabloViana 0:d7d64e8b652a 121 //********************************************************************************
PabloViana 0:d7d64e8b652a 122 /* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count"
PabloViana 0:d7d64e8b652a 123 lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena
PabloViana 0:d7d64e8b652a 124 no retorna nada
PabloViana 0:d7d64e8b652a 125 */
PabloViana 0:d7d64e8b652a 126 //***************************************************************************************
PabloViana 0:d7d64e8b652a 127 void cleanBuffer(char *buffer, int count)
PabloViana 0:d7d64e8b652a 128 {
PabloViana 0:d7d64e8b652a 129 for(int i=0; i < count; i++) {
PabloViana 0:d7d64e8b652a 130 buffer[i] = '\0';
PabloViana 0:d7d64e8b652a 131 }
PabloViana 0:d7d64e8b652a 132 }
PabloViana 0:d7d64e8b652a 133 /* esta funcion de abajo envia un comando parametrizado como cadena
PabloViana 0:d7d64e8b652a 134 puede ser un comando tipo AT
PabloViana 0:d7d64e8b652a 135 */
PabloViana 0:d7d64e8b652a 136 //***************************************************************************************
PabloViana 0:d7d64e8b652a 137 void sendCmd(char *cmd)
PabloViana 0:d7d64e8b652a 138 {
PabloViana 0:d7d64e8b652a 139 GSM.puts(cmd);
PabloViana 0:d7d64e8b652a 140 }
PabloViana 0:d7d64e8b652a 141 //****************************************************************************************
PabloViana 0:d7d64e8b652a 142 /* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout"
PabloViana 0:d7d64e8b652a 143 si todo sale bien retorna un cero que en la programacion hay que validar
PabloViana 0:d7d64e8b652a 144 si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica
PabloViana 0:d7d64e8b652a 145 */
PabloViana 0:d7d64e8b652a 146 //***************************************************************************************
PabloViana 0:d7d64e8b652a 147 int waitForResp(char *resp, int timeout)
PabloViana 0:d7d64e8b652a 148 {
PabloViana 0:d7d64e8b652a 149 int len = strlen(resp);
PabloViana 0:d7d64e8b652a 150 int sum=0;
PabloViana 0:d7d64e8b652a 151 t.start();
PabloViana 0:d7d64e8b652a 152
PabloViana 0:d7d64e8b652a 153 while(1) {
PabloViana 0:d7d64e8b652a 154 if(GSM.readable()) {
PabloViana 0:d7d64e8b652a 155 char c = GSM.getc();
PabloViana 0:d7d64e8b652a 156 sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
PabloViana 0:d7d64e8b652a 157 if(sum == len)break; //ya acabo se sale
PabloViana 0:d7d64e8b652a 158 }
PabloViana 0:d7d64e8b652a 159 if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo
PabloViana 0:d7d64e8b652a 160 t.stop();
PabloViana 0:d7d64e8b652a 161 t.reset();
PabloViana 0:d7d64e8b652a 162 return -1;
PabloViana 0:d7d64e8b652a 163 }
PabloViana 0:d7d64e8b652a 164 }
PabloViana 0:d7d64e8b652a 165 t.stop(); // stop timer antes de retornar
PabloViana 0:d7d64e8b652a 166 t.reset(); // clear timer
PabloViana 0:d7d64e8b652a 167 while(GSM.readable()) { // display the other thing..
PabloViana 0:d7d64e8b652a 168 char c = GSM.getc();
PabloViana 0:d7d64e8b652a 169 }
PabloViana 0:d7d64e8b652a 170
PabloViana 0:d7d64e8b652a 171 return 0;
PabloViana 0:d7d64e8b652a 172 }
PabloViana 0:d7d64e8b652a 173 /* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta
PabloViana 0:d7d64e8b652a 174 si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar
PabloViana 0:d7d64e8b652a 175 con alguna expresion logica
PabloViana 0:d7d64e8b652a 176 */
PabloViana 0:d7d64e8b652a 177 //***************************************************************************************
PabloViana 0:d7d64e8b652a 178 int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
PabloViana 0:d7d64e8b652a 179 {
PabloViana 0:d7d64e8b652a 180 sendCmd(cmd);
PabloViana 0:d7d64e8b652a 181 return waitForResp(resp,timeout);
PabloViana 0:d7d64e8b652a 182 }
PabloViana 0:d7d64e8b652a 183 /* esta funcion de abajo chequea que el modem este vivo envia AT y le contesta con OK y espera 2 segundos
PabloViana 0:d7d64e8b652a 184 */
PabloViana 0:d7d64e8b652a 185 //***************************************************************************************
PabloViana 0:d7d64e8b652a 186 int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado
PabloViana 0:d7d64e8b652a 187 {
PabloViana 0:d7d64e8b652a 188 return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
PabloViana 0:d7d64e8b652a 189 }
PabloViana 0:d7d64e8b652a 190 /* esta funcion de abajo chequea el estado de la sim card
PabloViana 0:d7d64e8b652a 191 y si todo sale bien retorna un cero que en la programacion hay que validar
PabloViana 0:d7d64e8b652a 192 con alguna expresion logica
PabloViana 0:d7d64e8b652a 193 */
PabloViana 0:d7d64e8b652a 194 //***************************************************************************************
PabloViana 0:d7d64e8b652a 195 int checkSIMStatus(void)
PabloViana 0:d7d64e8b652a 196 {
PabloViana 0:d7d64e8b652a 197 char gprsBuffer[30];
PabloViana 0:d7d64e8b652a 198 int count = 0;
PabloViana 0:d7d64e8b652a 199 cleanBuffer(gprsBuffer,30);
PabloViana 0:d7d64e8b652a 200 while(count < 3) {
PabloViana 0:d7d64e8b652a 201 sendCmd("AT+CPIN?\r\n");
PabloViana 0:d7d64e8b652a 202 readBuffer(gprsBuffer,30);
PabloViana 0:d7d64e8b652a 203 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
PabloViana 0:d7d64e8b652a 204 break;
PabloViana 0:d7d64e8b652a 205 }
PabloViana 0:d7d64e8b652a 206 count++;
PabloViana 0:d7d64e8b652a 207 wait(1);
PabloViana 0:d7d64e8b652a 208 }
PabloViana 0:d7d64e8b652a 209
PabloViana 0:d7d64e8b652a 210 if(count == 3) {
PabloViana 0:d7d64e8b652a 211 return -1;
PabloViana 0:d7d64e8b652a 212 }
PabloViana 0:d7d64e8b652a 213 return 0;
PabloViana 0:d7d64e8b652a 214 }
PabloViana 0:d7d64e8b652a 215 /* esta funcion de abajo chequea la calidad de la señal
PabloViana 0:d7d64e8b652a 216 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
PabloViana 0:d7d64e8b652a 217 con alguna expresion logica
PabloViana 0:d7d64e8b652a 218 */
PabloViana 0:d7d64e8b652a 219 //***************************************************************************************
PabloViana 0:d7d64e8b652a 220 int checkSignalStrength(void)
PabloViana 0:d7d64e8b652a 221 {
PabloViana 0:d7d64e8b652a 222 char gprsBuffer[100];
PabloViana 0:d7d64e8b652a 223 int index,count = 0;
PabloViana 0:d7d64e8b652a 224 cleanBuffer(gprsBuffer,100);
PabloViana 0:d7d64e8b652a 225 while(count < 3) {
PabloViana 0:d7d64e8b652a 226 sendCmd("AT+CSQ\r\n");
PabloViana 0:d7d64e8b652a 227 readBuffer(gprsBuffer,25);
PabloViana 0:d7d64e8b652a 228 if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
PabloViana 0:d7d64e8b652a 229 break;
PabloViana 0:d7d64e8b652a 230 }
PabloViana 0:d7d64e8b652a 231 count++;
PabloViana 0:d7d64e8b652a 232 wait(1);
PabloViana 0:d7d64e8b652a 233 }
PabloViana 0:d7d64e8b652a 234 if(count == 3) {
PabloViana 0:d7d64e8b652a 235 return -1;
PabloViana 0:d7d64e8b652a 236 }
PabloViana 0:d7d64e8b652a 237 return index;
PabloViana 0:d7d64e8b652a 238 }
PabloViana 0:d7d64e8b652a 239
PabloViana 0:d7d64e8b652a 240 /* esta funcion de abajo inicaliza el modem se compone de un grupo de subfunciones ya definidas previamente
PabloViana 0:d7d64e8b652a 241 primero chequea que este vivo
PabloViana 0:d7d64e8b652a 242 segundo chequea el estado de la simcard
PabloViana 0:d7d64e8b652a 243 tercero chequea la intencidad de señal celular
PabloViana 0:d7d64e8b652a 244 cuarto aplica la configuracion
PabloViana 0:d7d64e8b652a 245 y si todo sale bien retorna un cero que en la programacion hay que validar
PabloViana 0:d7d64e8b652a 246 con alguna expresion logica
PabloViana 0:d7d64e8b652a 247 */
PabloViana 0:d7d64e8b652a 248 //***************************************************************************************
PabloViana 0:d7d64e8b652a 249 int init()
PabloViana 0:d7d64e8b652a 250 {
PabloViana 0:d7d64e8b652a 251 if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){
PabloViana 0:d7d64e8b652a 252 return -1;
PabloViana 0:d7d64e8b652a 253 }
PabloViana 0:d7d64e8b652a 254 if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){
PabloViana 0:d7d64e8b652a 255 return -1;
PabloViana 0:d7d64e8b652a 256 }
PabloViana 0:d7d64e8b652a 257 if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){
PabloViana 0:d7d64e8b652a 258 return -1;
PabloViana 0:d7d64e8b652a 259 }
PabloViana 0:d7d64e8b652a 260 if (0 != sendCmdAndWaitForResp("AT+CBST=0,0,1\r\n", "OK", 3)){
PabloViana 0:d7d64e8b652a 261 return -1;
PabloViana 0:d7d64e8b652a 262 }
PabloViana 0:d7d64e8b652a 263 LedVerde=0;
PabloViana 0:d7d64e8b652a 264 return 0;
PabloViana 0:d7d64e8b652a 265 }
PabloViana 0:d7d64e8b652a 266
PabloViana 0:d7d64e8b652a 267 /* esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX
PabloViana 0:d7d64e8b652a 268 y si todo sale bien retorna un cero que en la programacion hay que validar
PabloViana 0:d7d64e8b652a 269 con alguna expresion logica
PabloViana 0:d7d64e8b652a 270 */
PabloViana 0:d7d64e8b652a 271 //***************************************************************************************
PabloViana 0:d7d64e8b652a 272 int readSMSpdu(char *message, int index)
PabloViana 0:d7d64e8b652a 273 {
PabloViana 0:d7d64e8b652a 274 int i = 0;
PabloViana 0:d7d64e8b652a 275 char gprsBuffer[100];
PabloViana 0:d7d64e8b652a 276 char *p,*s;
PabloViana 0:d7d64e8b652a 277 GSM.printf("AT+CMGR=%d\r\n",index);
PabloViana 0:d7d64e8b652a 278 cleanBuffer(gprsBuffer,100);
PabloViana 0:d7d64e8b652a 279 readBuffer(gprsBuffer,100);
PabloViana 0:d7d64e8b652a 280 if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
PabloViana 0:d7d64e8b652a 281 return -1;
PabloViana 0:d7d64e8b652a 282 }
PabloViana 0:d7d64e8b652a 283 if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
PabloViana 0:d7d64e8b652a 284 p = s + 6;
PabloViana 0:d7d64e8b652a 285 while((*p != '$')&&(i < 5)) {
PabloViana 0:d7d64e8b652a 286 message[i++] = *(p++);
PabloViana 0:d7d64e8b652a 287 }
PabloViana 0:d7d64e8b652a 288 message[i] = '\0';
PabloViana 0:d7d64e8b652a 289 }
PabloViana 0:d7d64e8b652a 290 return 0;
PabloViana 0:d7d64e8b652a 291 }
PabloViana 0:d7d64e8b652a 292 /* esta funcion de abajo borra mensajes SMS del modem
PabloViana 0:d7d64e8b652a 293 y si todo sale bien retorna un cero que en la programacion hay que validar
PabloViana 0:d7d64e8b652a 294 con alguna expresion logica
PabloViana 0:d7d64e8b652a 295 */
PabloViana 0:d7d64e8b652a 296 //***************************************************************************************
PabloViana 0:d7d64e8b652a 297 int deleteSMS(int index)
PabloViana 0:d7d64e8b652a 298 {
PabloViana 0:d7d64e8b652a 299 char cmd[32];
PabloViana 0:d7d64e8b652a 300 snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
PabloViana 0:d7d64e8b652a 301 sendCmd(cmd);
PabloViana 0:d7d64e8b652a 302 return 0;
PabloViana 0:d7d64e8b652a 303 }
PabloViana 0:d7d64e8b652a 304 /*============================================================================================*/
PabloViana 0:d7d64e8b652a 305
PabloViana 0:d7d64e8b652a 306 int main()
PabloViana 0:d7d64e8b652a 307 {
PabloViana 0:d7d64e8b652a 308
PabloViana 0:d7d64e8b652a 309 int EnviarMensaje=0; //Bandera para el envío de SMS;
PabloViana 0:d7d64e8b652a 310 int TEMP;
PabloViana 0:d7d64e8b652a 311 wait(10);
PabloViana 0:d7d64e8b652a 312 pc.printf("Comienza programa de envio de mediciones analogicas mediante SMS.\r\n Se estan configurando los puertos seriales.\r\n");
PabloViana 0:d7d64e8b652a 313
PabloViana 0:d7d64e8b652a 314 //Las siguientes líneas tienen como fin configurar los puertos seriales;
PabloViana 0:d7d64e8b652a 315 GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
PabloViana 0:d7d64e8b652a 316 GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
PabloViana 0:d7d64e8b652a 317 GSM.printf("ATE0\r\n");
PabloViana 0:d7d64e8b652a 318 //Las siguientes líneas tienen como fin borrar los mensajes almacenados en el teléfono;
PabloViana 0:d7d64e8b652a 319 for(i=0;i<6;i++)
PabloViana 0:d7d64e8b652a 320 {
PabloViana 0:d7d64e8b652a 321 GSM.printf("AT+CMGD=%d\r\n",i);
PabloViana 0:d7d64e8b652a 322 wait(0.2);
PabloViana 0:d7d64e8b652a 323 }
PabloViana 0:d7d64e8b652a 324
PabloViana 0:d7d64e8b652a 325 i=0;
PabloViana 0:d7d64e8b652a 326 //Las siguientes líneas tienen por objetivo detectar el modem y realizar algunas configuaciones. Básicamente se le pregunta al módulo "AT", a lo que él debe respoder "OK"
PabloViana 0:d7d64e8b652a 327
PabloViana 0:d7d64e8b652a 328 while(init()<0)
PabloViana 0:d7d64e8b652a 329 {
PabloViana 0:d7d64e8b652a 330 LedVerde=1; //Apago el led;
PabloViana 0:d7d64e8b652a 331 LedRojo=1;//Apago el led;
PabloViana 0:d7d64e8b652a 332 LedAzul=1;//Apago el led;
PabloViana 0:d7d64e8b652a 333
PabloViana 0:d7d64e8b652a 334 i++;
PabloViana 0:d7d64e8b652a 335 if (i==10){pc.printf("Ha sido imposible establecer conexion con el modem GSM. \n\r El programa terminara y debera iniciar nuevamente la KL25z\n\r");LedRojo=0;wait(1);LedRojo=1;return 0;}
PabloViana 0:d7d64e8b652a 336 }
PabloViana 0:d7d64e8b652a 337 wait(0.5); //Esta línea no tiene ningún sentido, solo espero para que el programa parezca más interesante.
PabloViana 0:d7d64e8b652a 338 pc.printf("Se ha realizado la conexion exitosamente, ahora puede comenzar el envio de informacion. \r\n");
PabloViana 0:d7d64e8b652a 339 LedVerde=1; //Apago el led;
PabloViana 0:d7d64e8b652a 340 LedRojo=1;//Apago el led;
PabloViana 0:d7d64e8b652a 341 LedAzul=1;//Apago el led;
PabloViana 0:d7d64e8b652a 342
PabloViana 0:d7d64e8b652a 343 /*Inicia ciclo infinito*/
PabloViana 0:d7d64e8b652a 344 while (true) {
PabloViana 0:d7d64e8b652a 345
PabloViana 0:d7d64e8b652a 346 if (EnviarMensaje ==1)
PabloViana 0:d7d64e8b652a 347 {
PabloViana 0:d7d64e8b652a 348 pc.printf("****************************************************************************\r\n");
PabloViana 0:d7d64e8b652a 349 //Las siguientes líneas tienen como fin leer el voltaje y convertirlo en ASCII;
PabloViana 0:d7d64e8b652a 350 V_float=A.read()*3.3;
PabloViana 0:d7d64e8b652a 351 V_int=V_float*10; //Multiplico por 10 y almaceno en una variable tipo entero para tomar un decimal y eliminar el punto flotante;
PabloViana 0:d7d64e8b652a 352 TEMP=V_int/10;
PabloViana 0:d7d64e8b652a 353 DE[5]=TEMP+48; //Convierto el valor el caracter;
PabloViana 0:d7d64e8b652a 354 V_int = V_int-TEMP*10;
PabloViana 0:d7d64e8b652a 355 DE[7]=V_int + 48;//Convierto el valor en caracter;
PabloViana 0:d7d64e8b652a 356 //Las siguientes líneas tienen por objeto la conversión de una cadena de caracteres a octetos que puedan enviarse mediante PDU;
PabloViana 0:d7d64e8b652a 357
PabloViana 0:d7d64e8b652a 358
PabloViana 0:d7d64e8b652a 359 DE[0]=86;//V
PabloViana 0:d7d64e8b652a 360 DE[1]=111;//o
PabloViana 0:d7d64e8b652a 361 DE[2]=108;//l
PabloViana 0:d7d64e8b652a 362 DE[3]=116;//t
PabloViana 0:d7d64e8b652a 363 DE[4]=61;//=
PabloViana 0:d7d64e8b652a 364 //D[5]=;
PabloViana 0:d7d64e8b652a 365 DE[6]=46;//.
PabloViana 0:d7d64e8b652a 366 //D[7]=;//.
PabloViana 0:d7d64e8b652a 367 DE[8]=86;//V
PabloViana 0:d7d64e8b652a 368
PabloViana 0:d7d64e8b652a 369
PabloViana 0:d7d64e8b652a 370 pc.printf("\r\nVoltaje: %s\r\n", DE);
PabloViana 0:d7d64e8b652a 371 LENIN=strlen(DE); //Se mide el tamaño de la cadena;
PabloViana 0:d7d64e8b652a 372 for(i=0;i<LENIN;i++)
PabloViana 0:d7d64e8b652a 373 {DE[i]=DE[i]&0x000000FF;} //Convierto en formato 0x00;
PabloViana 0:d7d64e8b652a 374
PabloViana 0:d7d64e8b652a 375 for (i=0;i < LENIN;i++)
PabloViana 0:d7d64e8b652a 376 {
PabloViana 0:d7d64e8b652a 377 DS[i]=(DE[i]>>i|DE[i+1]<<(7-i));
PabloViana 0:d7d64e8b652a 378 LENOUT=i+1;
PabloViana 0:d7d64e8b652a 379 if(DS[i]==0){DS[i]='\0';break;}
PabloViana 0:d7d64e8b652a 380 }
PabloViana 0:d7d64e8b652a 381
PabloViana 0:d7d64e8b652a 382 pc.printf("\r\n ENVIAR SMS: ");
PabloViana 0:d7d64e8b652a 383 pc.printf("AT+CMGS=21\r\n");
PabloViana 0:d7d64e8b652a 384 wait(0.2);
PabloViana 0:d7d64e8b652a 385 GSM.printf("AT+CMGS=21\r\n"); //Indico al modem GSM que se enviará una trama PDU de longitud 21;
PabloViana 0:d7d64e8b652a 386 wait(0.2);
PabloViana 0:d7d64e8b652a 387 pc.printf("0011000A91");
PabloViana 0:d7d64e8b652a 388 GSM.printf("0011000A91"); //Identificación del mensaje y del protocolo;
PabloViana 0:d7d64e8b652a 389 pc.printf("%s", Tel);
PabloViana 0:d7d64e8b652a 390 GSM.printf("%s", Tel); //Destinatario del mensaje;
PabloViana 0:d7d64e8b652a 391 pc.printf("0000AA09");
PabloViana 0:d7d64e8b652a 392 GSM.printf("0000AA09");//Longtitud del mensaje y otros parámetros;
PabloViana 0:d7d64e8b652a 393
PabloViana 0:d7d64e8b652a 394 for(i=0;i<LENOUT-1;i++)
PabloViana 0:d7d64e8b652a 395 {
PabloViana 0:d7d64e8b652a 396 pc.printf("%2X",DS[i]&0x000000FF);
PabloViana 0:d7d64e8b652a 397 GSM.printf("%2X",DS[i]&0x000000FF); //Mensaje en octetos;
PabloViana 0:d7d64e8b652a 398
PabloViana 0:d7d64e8b652a 399 }
PabloViana 0:d7d64e8b652a 400 wait(0.5);
PabloViana 0:d7d64e8b652a 401
PabloViana 0:d7d64e8b652a 402 GSM.putc(0x1A); //Caracter ASCII 26 para el envío del SMS;
PabloViana 0:d7d64e8b652a 403 EnviarMensaje=0;
PabloViana 0:d7d64e8b652a 404 }//Enviar mensaje;
PabloViana 0:d7d64e8b652a 405
PabloViana 0:d7d64e8b652a 406 //inicia la recepcion de un mensaje de texto
PabloViana 0:d7d64e8b652a 407 if (GSM.readable()) {
PabloViana 0:d7d64e8b652a 408 readBuffer(buffer,100);
PabloViana 0:d7d64e8b652a 409 pc.printf("%s\r\n",buffer);
PabloViana 0:d7d64e8b652a 410 for(i=0;i<5;i++)
PabloViana 0:d7d64e8b652a 411 {
PabloViana 0:d7d64e8b652a 412 resp[i]=buffer[i];
PabloViana 0:d7d64e8b652a 413 }
PabloViana 0:d7d64e8b652a 414
PabloViana 0:d7d64e8b652a 415 pc.printf("%s\r\n",resp);
PabloViana 0:d7d64e8b652a 416 if(strcmp("$$+CM",resp) == 0){ //COMPARA resp con "+CMTI"
PabloViana 0:d7d64e8b652a 417 pc.printf("****************************************************************************\r\n");
PabloViana 0:d7d64e8b652a 418 pc.printf("Nuevo Mensaje de texto. \r\n");
PabloViana 0:d7d64e8b652a 419 EnviarMensaje=1;
PabloViana 0:d7d64e8b652a 420 cleanBuffer(buffer,10);
PabloViana 0:d7d64e8b652a 421 wait(0.5);
PabloViana 0:d7d64e8b652a 422 GSM.printf("AT+CMGL=0\r\n");//envio comando para leer mensaje
PabloViana 0:d7d64e8b652a 423 pc.printf("AT+CMGL=0\r\n");
PabloViana 0:d7d64e8b652a 424 //if (GSM.readable()) {
PabloViana 0:d7d64e8b652a 425 GSM.printf("AT+CMGD=0\r\n");
PabloViana 0:d7d64e8b652a 426 readBuffer(buffer,100);
PabloViana 0:d7d64e8b652a 427 pc.printf("Cadena recibida: %s\r\n",buffer);
PabloViana 0:d7d64e8b652a 428 wait(5);
PabloViana 0:d7d64e8b652a 429 i=0;
PabloViana 0:d7d64e8b652a 430 //leer telefono
PabloViana 0:d7d64e8b652a 431 for(i=0;i<10;i++){
PabloViana 0:d7d64e8b652a 432 Tel[i]=buffer[i+40];
PabloViana 0:d7d64e8b652a 433 }
PabloViana 0:d7d64e8b652a 434 pc.printf("%Remitente: %s\r\n",Tel); //Almaceno el número de teléfono del remitente
PabloViana 0:d7d64e8b652a 435
PabloViana 0:d7d64e8b652a 436
PabloViana 0:d7d64e8b652a 437
PabloViana 0:d7d64e8b652a 438 cleanBuffer(buffer,100);//ejecurar orden
PabloViana 0:d7d64e8b652a 439
PabloViana 0:d7d64e8b652a 440 }
PabloViana 0:d7d64e8b652a 441 }
PabloViana 0:d7d64e8b652a 442 }//while
PabloViana 0:d7d64e8b652a 443 }
PabloViana 0:d7d64e8b652a 444