desktop

Proyecto con modulo SIM800L

Buenas!!! Me encuentro en un proyecto el cual consiste en el aviso por mensaje de texto cuando se produce la activación de una protección eléctrica en un tablero de control. Uso un Atmega328P-PU, programo con el ID de Arduino y el módulo GSM es el SIM800L.
El sistema, básicamente, envía un sms a un determinado número de teléfono celular avisando el corte de luz de una casa.
La función principal ya está realizada, pero me encontré con un inconveniente muy importante: una de las funciones que quiero agregarle al sistema es que se pueda consultar el saldo de la línea que éste utiliza mediante un sms, mediante los siguientes pasos:

1- envío al dispositivo un sms con la palabra "Saldo" desde mi celular.
2- el dispositivo detecta que le llegó un sms con la palabra "Saldo" y envía un sms a la compañía consultando el saldo.
3- cuando el dispositivo recibe el sms de respuesta de la compañía, este reenvía el mismo mensaje a mi teléfono, desde el cual se ha consultado el saldo.

La función que realiza esto es la siguiente:

Código:
void saldo()// 
{
  int i;
  Comando = "";    // variable string                          
  delay(500);
  mySerial.println("AT+CMGF=1");        // Activamos la funcion de envio de SMS
  delay(1000);                           // Pequeña pausa
  mySerial.println("AT+CMGS=\"444\"");  // Marco número de consulta de Saldo Movistar
  delay(1000);                           // Pequeña pausa
  mySerial.println("saldo");
  delay(500);                                    // Pequeña pausa
  mySerial.println(char(26));                      // Enviamos el equivalente a Control+Z 
  delay(1000);                                    // Pequeña pausa
  mySerial.println("");                          // Enviamos una linea vacia
  for (int i=0;i<10;i++)// espero unos segundo 
  {
   delay(1000);
  }
  int x=0;
  do
  {
  if (mySerial.available())// cuando tengo algo en el serial es que la compañia me contestó
  {                                //Si hay datos disponibles
    delay(100);
    Comando = mySerial.readString(); //Los almacenamos en la variable Comando
    delay(1000);
    x=1;
  }
  }while (x==0);
    delay(1000);
    mySerial.println("AT+CMGF=1");        // Activamos la funcion de envio de SMS
    delay(100);                           // Pequeña pausa
    mySerial.println("AT+CMGS=\"1130xxxxxx\"");  // Marco número...
    delay(1000);                           // Pequeña pausa
    mySerial.print(comando);//reenvío la contestación de la compañía
    delay(1000);                                    // Pequeña pausa
    mySerial.println(char(26));                      // Enviamos el equivalente a Control+Z 
    delay(1000);                                    // Pequeña pausa
    mySerial.println("");                          // Enviamos una linea vacia
    delay(1000);
    Comando = "";                              //Vaciamos la variable
}

Mi inconveniente se encuentra en la variable "comando", ya que cuando el dispositivo tiene que reenviar el mensaje con el saldo, envía caracteres sin sentido (hasta envía fragmentos de otros comandos AT) como lo siguiente:

+CMT: "01130xxxxxx","","16/08/08,20:45:06-12"
Saldo
AT+CMGF=1

OK
AT+CMGS="444"

> saldo
>
>
+CMGS: 7

OK

+CMT: "444","","16/08/08,20:45:20-12"
Tu saldo actual es de 1.25 pesos. Sin credito? Podes llamar por cobrar marcando 19 +Cod Area+Nro Movistar sin 0 ni 15. Ej 191153210000 Infowebmovistar.
AT+CMGF=1

OK
AT+CMGS="1130xxxxxx"

> AT+¨S”TŠj
> OKCáAT+CMÔªO$“¤CC!þsaldo>
> >
> +
>
+CMGS: 9

Qué estoy haciendo mal??? Espero haber sido claro.

Muchas gracias como siempre!!!
 
he usado el sim908 y sim900, suponiendo que el core es parecido.

Debes cambiar el tipo de formato de texto con el que responde, no recuerdo el comando.

Reviso mis archivos y si lo encuentro te lo paso.

Saludos!!

Me parece que es esa configuración.


/*
AT+CMGF – Set SMS Text Mode or SMS PDU Mode

AT+CMGS – Send SMS Command in Text Mode

Checa este link http://www.electrodragon.com/w/SIM908_SIM900_Common_AT_Commands

*/
 
Última edición:
he usado el sim908 y sim900, suponiendo que el core es parecido.

Debes cambiar el tipo de formato de texto con el que responde, no recuerdo el comando.

Reviso mis archivos y si lo encuentro te lo paso.

Saludos!!

Gracias por tu respuesta electroconico!!! Espero puedas ayudarme porque no le estoy encontrando la solución... que no quede duda que sigo buscando como todo pesimista ;)
 
he usado el sim908 y sim900, suponiendo que el core es parecido.

Debes cambiar el tipo de formato de texto con el que responde, no recuerdo el comando.

Reviso mis archivos y si lo encuentro te lo paso.

Saludos!!

Me parece que es esa configuración.


/*
AT+CMGF – Set SMS Text Mode or SMS PDU Mode

AT+CMGS – Send SMS Command in Text Mode

Checa este link http://www.electrodragon.com/w/SIM908_SIM900_Common_AT_Commands

*/

Eso es lo primero que hago... fijate en la línea que dice AT+CMGF=1, ahí configuro modo texto
 
Lo otro que podrías hacer es meter.los comandos por una temrinalr serial asi descartas algun problema.con arduino o sus librerías.

Eso mismo estoy haciendo!!!! A medida que realizo las pruebas, chequeo online (mediante monitor serie) el tráfico de datos entre el módulo GSM y el micro, así como la comunicación del módulo con la compañía...

Lo que no estoy seguro si estoy haciendo bien es el tratamiento de los datos que tomo del puerto serie, es decir, cómo estoy tomando el texto que recibe el módulo y lo guardo en la variable "Comando" para luego utilizarlos.
Básicamente, tomo ese texto en Comando (Comando=mySerial.readString();) que es "string", y luego, quiero enviar eso mismo (mySerial.print(comando);)

¿Habrá otra forma de tomar los datos sin que sea necesario un string? Quizás el envío se complique por ser de ese tipo la variable y no ser, por decir algo, char...
 
Encontré el inconveniente!!! El módulo GSM puede trabajar a una velocidad de hasta 115200 baudios y así estaba configurado junto con mi programa, por lo que le bajé la velocidad de comunicación a 9600 y el sistema dejó de responder erráticamente.

Igualmente hay algo que no entiendo... alguien sabe si al usar el comando serial.readstring se vacía el buffer serial? Es que necesito usar el buffer dos veces (una como string y otra como char) y en la segunda me encuentro con que no puedo recuperar nada del mismo...
 
Buenas!!! Me encuentro en un proyecto el cual consiste en el aviso por mensaje de texto cuando se produce la activación de una protección eléctrica en un tablero de control. Uso un Atmega328P-PU, programo con el ID de Arduino y el módulo GSM es el SIM800L.
El sistema, básicamente, envía un sms a un determinado número de teléfono celular avisando el corte de luz de una casa.
La función principal ya está realizada, pero me encontré con un inconveniente muy importante: una de las funciones que quiero agregarle al sistema es que se pueda consultar el saldo de la línea que éste utiliza mediante un sms, mediante los siguientes pasos:

1- envío al dispositivo un sms con la palabra "Saldo" desde mi celular.
2- el dispositivo detecta que le llegó un sms con la palabra "Saldo" y envía un sms a la compañía consultando el saldo.
3- cuando el dispositivo recibe el sms de respuesta de la compañía, este reenvía el mismo mensaje a mi teléfono, desde el cual se ha consultado el saldo.

La función que realiza esto es la siguiente:

Código:
void saldo()//
{
  int i;
  Comando = "";    // variable string                        
  delay(500);
  mySerial.println("AT+CMGF=1");        // Activamos la funcion de envio de SMS
  delay(1000);                           // Pequeña pausa
  mySerial.println("AT+CMGS=\"444\"");  // Marco número de consulta de Saldo Movistar
  delay(1000);                           // Pequeña pausa
  mySerial.println("saldo");
  delay(500);                                    // Pequeña pausa
  mySerial.println(char(26));                      // Enviamos el equivalente a Control+Z
  delay(1000);                                    // Pequeña pausa
  mySerial.println("");                          // Enviamos una linea vacia
  for (int i=0;i<10;i++)// espero unos segundo
  {
   delay(1000);
  }
  int x=0;
  do
  {
  if (mySerial.available())// cuando tengo algo en el serial es que la compañia me contestó
  {                                //Si hay datos disponibles
    delay(100);
    Comando = mySerial.readString(); //Los almacenamos en la variable Comando
    delay(1000);
    x=1;
  }
  }while (x==0);
    delay(1000);
    mySerial.println("AT+CMGF=1");        // Activamos la funcion de envio de SMS
    delay(100);                           // Pequeña pausa
    mySerial.println("AT+CMGS=\"1130xxxxxx\"");  // Marco número...
    delay(1000);                           // Pequeña pausa
    mySerial.print(comando);//reenvío la contestación de la compañía
    delay(1000);                                    // Pequeña pausa
    mySerial.println(char(26));                      // Enviamos el equivalente a Control+Z
    delay(1000);                                    // Pequeña pausa
    mySerial.println("");                          // Enviamos una linea vacia
    delay(1000);
    Comando = "";                              //Vaciamos la variable
}

Mi inconveniente se encuentra en la variable "comando", ya que cuando el dispositivo tiene que reenviar el mensaje con el saldo, envía caracteres sin sentido (hasta envía fragmentos de otros comandos AT) como lo siguiente:



Qué estoy haciendo mal??? Espero haber sido claro.

Muchas gracias como siempre!!!

Hola Ingeniero18 Cómo estás ¿? Mira justamente busco hacer lo mismo, tengo un sensor de movimiento en casa que me envía msj cuando detecta movimiento , lo que no he logrado y estoy buscando hacer es lo mismo que hiciste vos , en tratar de consultar el Saldo de la SIM. Esto lo tengo conectado con Arduino Mega pPro y Sim 800l
 
Hola Ingeniero18 Cómo estás ¿? Mira justamente busco hacer lo mismo, tengo un sensor de movimiento en casa que me envía msj cuando detecta movimiento , lo que no he logrado y estoy buscando hacer es lo mismo que hiciste vos , en tratar de consultar el Saldo de la SIM. Esto lo tengo conectado con Arduino Mega pPro y Sim 800l
Y cual es el problema con el código posteado?
 
Hola El Problema que no se como arrancar o poder hacerlo funcionar.. yo puedo hacer que me envíe msj y todo eso.. pero nose como hacer para leer lo que recibo x el monitor serial , para luego enviarlo
 
Las funciones del codigo no te devuelven el mensaje?

Si es asi, habría que ver si existe algún comando AT para leer el mensaje.

Luego lo procesas dentro del Arduino.

Puedes recibir y leer el mensaje que tu envias?
 
Si el tema que no quiero copiar y pegar, quiero llegar a entender paso a paso..yo le envió la palabra saldo al.sim 800l lo recibe y se lo.reenvia a la compañía.. y la compañía me.responde y yo veo el.msj x el.monitor serial, pero nose como tomar el msj de la.compañia, para re enviarlo nuevamente al.numero.que consulto el.saldo.. Te Agradezco x tu Ayuda e Interés
 
De la misma forma que lees el mensaje que le envias con "Saldo" y oo reenvias (si es que lo haces así), pero... Ahí va la lógica de funcionamiento.

1) Espero un mensaje, si recibo la palabra clave "Saldo", envío ese mensaje a la operadora, sino hago otra cosa...

2) Espero un mensaje, si recibo, quiere decir que la operadora me respondió o me llegó otra cosa que debo procesar.

3) Identifico el número del mensaje recibido, si es de la operadora guardo el mensaje en una variable, sino hago otra cosa...

4) Preparo y envío el mensaje guardado en la variable a mi número.

5) Vuelvo al punto 1...


Puede ser muchísimo mas complejo, con maquina de estado, condiciones, etc... Eso ya lo manejas tu.
 
Si el tema que no quiero copiar y pegar, quiero llegar a entender paso a paso..yo le envió la palabra saldo al.sim 800l lo recibe y se lo.reenvia a la compañía.. y la compañía me.responde y yo veo el.msj x el.monitor serial, pero nose como tomar el msj de la.compañia, para re enviarlo nuevamente al.numero.que consulto el.saldo.. Te Agradezco x tu Ayuda e Interés
Si querías entender paso a paso, para empezar no debiste hacerlo en el IDE de Arduino, en ese caso, hubieras realizado en código en C. Lo que yo puedo mencionar es que en C existe una función llamada strtok, el cual te ayuda a seleccionar partes de una cadena de texto en base a un token que puede ser unas comillas, un asterisco, comas, dos puntos, etc. Una vez seleccionado puedes guardarlo en una variable que lo usaras para reenviarlo.
 
Atrás
Arriba