bclose

MÓDULO GSM/GPRS: recibir llamadas y SMS

Seguimos trabajando con el módulo GPRS

Objetivos

 

 

    • Recibir llamadas y SMS.
    • Identificar quién nos llama.
    • Mostrar los SMS en el monitor serie.
 

Material requerido.

Imagen de Arduino UNO Arduino UNO o equivalente
modulo gprs Un Shield GPRS SIM900
conexiones Algunos cables de protoboard.
Power supply

 Una fuente de alimentación para Arduino.

tienda online prometec

RECIBIR LLAMADAS

 

Ya vimos en la sesión anterior cómo conectar y poner en marcha el módulo GPRS, y si alguien probó en ese momento a llamar a la tarjeta que tenemos colocada en el SIM900, habrá visto como da tono normalmente.

Sin embargo no habrá visto nada que indique que se está recibiendo una llamada, aunque si nos fijamos veremos como uno de los LEDs de la tarjeta se apaga mientras se recibe. Así que lo que vamos a hacer es que nos avise mediante el monitor serie cuando las reciba.

En principio la única diferencia hasta llegar al loop va a ser que declararemos una variable global de tipo char para guardar los caracteres que nos lleguen del SIM900.

char incoming_char = 0; //Variable para guardar los caracteres que envía el SIM900

En el loop simplemente comprobaremos que se están enviando caracteres desde el SIM900 y los iremos mostrando por el monitor serie.

void loop()
   {
      if (SIM900.available() > 0)
         {
            incoming_char = SIM900.read(); //Guardamos el caracter que llega desde el SIM900
            Serial.print(incoming_char); //Mostramos el caracter en el monitor serie
         }
   }

Si ahora probáis a hacer una llamada al número que tengáis en la tarjeta del SIM900 veréis que en el monitor serie mostrará la palabra “RING” una vez por cada tono, y terminará con un “NO CARRIER”.

monitor serie llamada sim900

Pero muchas veces puede sernos muy útil saber quién nos está llamando para, por ejemplo, realizar una acción sólo si nos llama un número determinado (cosa que veremos en la próxima sesión). Para ello utilizaremos el comando “AT+CLIP=1\r”. Si queremos desactivarlo sólo tenemos que volver a ponerlo a 0. Y con esto ya tendríamos el programa completo para recibir llamadas.

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // 10 y 11 para el Arduino Mega. Configura el puerto serie para el SIM900

char incoming_char = 0; //Variable para guardar los caracteres que envia el SIM900

void setup()
   {
      //digitalWrite(9, HIGH); // Descomentar para activar la alimentación de la tarjeta por Software
      //delay(1000); 
      //digitalWrite(9, LOW);
      delay (5000);  //Nos damos un tiempo para encender el GPRS y la alimentación de la tarjeta
      SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
      Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
      Serial.println("OK");
      delay (1000);
      SIM900.println("AT + CPIN = \"XXXX\""); //Comando AT para introducir el PIN de la tarjeta
      delay(25000); //Tiempo para que encuentre una RED
      Serial.println("PIN OK");
      SIM900.print("AT+CLIP=1\r"); //Activamos la identificación de llamada.
      delay(1000);
}

void loop()
   {
      if (SIM900.available() > 0)
         {
             incoming_char = SIM900.read(); //Guardamos el caracter que llega desde el SIM900
             Serial.print(incoming_char); //Mostramos el caracter en el monitor serie
         }
   }
monitor serie sim900 ring clip

 

RECIBIR SMS

 

Para recibir también correctamente los SMS, sólo tenemos que incluir un par de comandos AT más en el setup. Uno ya lo conocemos de la sesión anterior, que configura el módulo para poder enviar y recibir SMS “AT+CMGF=1\r”. Y también incluiremos el comando “AT+CNMI=2,2,0,0,0\r” que lo configura para que nos envíe por el puerto serie los SMS que nos lleguen.

Así el programa completo para recibir llamadas y SMS quedaría así:

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900

char incoming_char = 0; //Variable para guardar los caracteres que envía el SIM900

void setup()
   {
      //digitalWrite(9, HIGH); // Descomentar para activar la alimentación de la tarjeta por Software
      //delay(1000); 
      //digitalWrite(9, LOW);
      delay (5000);  // Nos damos un tiempo para encender el GPRS y la alimentación de la tarjeta
      SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
      Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
      Serial.println("OK");
      delay (1000);
      SIM900.println("AT + CPIN = \"XXXX\""); //Comando AT para introducir el PIN de la tarjeta
      delay(25000); //Tiempo para que encuentre una RED
      Serial.println("PIN OK");
      SIM900.print("AT+CLIP=1\r"); // Activamos la identificación de llamadas
      delay(1000);
      SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
      delay(1000);
      SIM900.print("AT+CNMI=2,2,0,0,0\r"); //Configuramos el módulo para que nos muestre los SMS recibidos por comunicacion serie
      delay(1000);
   }

void loop()
   {
      if (SIM900.available() > 0)
         {
            incoming_char = SIM900.read(); //Guardamos el caracter que llega desde el SIM900
            Serial.print(incoming_char); //Mostramos el caracter en el monitor serie
         }
   }

Y cuando recibamos un mensaje se nos mostrará por el monitor serie tanto el número desde el que se envía como el contenido del SMS, con la fecha y hora del envío. Y si nos fijamos, al contrario que en las llamadas, el número vendrá con el prefijo internacional, en mi caso el +34 que pertenece a España.

SMS monitor serie sim900

Y como siempre, podéis descargar el programa completo aquí: recibir_llamadas_y_SMS.

En la siguiente sesión utilizaremos lo que hemos aprendido para que nuestro Arduino se ponga en contacto con nosotros si fuera necesario, y a que realice ciertas órdenes utilizando llamadas y SMS, y asegurándonos de que sólo responda ante nosotros.

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Cómo recibir llamadas y SMS y mostrarlas por el puerto serie.
    • A identificar quién nos está llamando.
    • Ya sabemos recibir y enviar llamadas y SMS.
 
 
 

LikeUsOnFacebook_Icon

(42) Comments

  • Buenas! Tengo un duda, ‘el SIM800L se programa igual que SIM900?, o sea, ¿el código explicado acá me serviría igual para el SIM800L, o tendría que realizar algún cambio?

    • Jesus, supiste cómo enviar y recibir sms con el 800l, tengo la mism duda…

      • Pues al parecer se programan igual, solo que el sim800l utiliza una mayor velocidad de comunicación, pero de resto es lo mismo creo. Leí por ahí que como ambos módulos utilizan los mismo comandos AT, se programan igual.

  • Hola, buenas a todos

    En mi caso, recibo las llamadas, pero no recibo los SMS. La consola al principio me escupe esto:

    OK
    PIN OK
    AT+CPIN=”****”

    OK
    AT+CLIP=1

    OK
    AT+CMGF=1

    OK
    AT+CNMI=2

    Es raro que la última instrucción no la muestre completamente?

    • Hola Antonio, prueba con este otro programa que es un poco más completo a ver si te funciona. Un saludo.

  • Muchas gracias por el tutorial, me ha servido mucho para un proyecto que estoy realizando.

    Solo quería consultar, como puedo contestar una llamada que le haga al módulo y entablar una conversación estable entre mi telefóno y el sim900? necesito que el módulo responda automáticamente y mantenga la llamada hasta que desde el telefóno decida cortarla.

    Espero puedan ayudarme con esta información, muchas gracias de antemano.

    • Hola ÓscarPara descolgar leo por ahí que es el comando “ATA” aunque no lo he probado. Si lo pruebas ya nos contarás si funciona. Un saludo.

    • Pablo Ibaceta

    Buenos días, en la recepción de mensajes tengo un problema, cuando le envío al modulo SMS que contengan un acento por ejemplo toda la trama pasa a codificarse en hexadecimal mostrado en ascii por supuesto y me es inutil toda la trama.. sabes de algún comando para que esto no suceda? Saludos

    • Hola Pablo, pues no lo había pensado, suponía que te saldría un caracter raro en la letra con acento y el resto bien. A ver si le puedo echar un ojo. UN saludo.

    • Andres Suarez

    3. Cordial saludo desde Colombia! primeramente gracias por la excelente y detallada explicación. De verdad que valoro la información que estoy viendo en tus tutoriales, porque es muy clara y concreta. Por otro lado, yo estoy usando un ESP8266 Versión 12E programado con el IDE de Arduino, además estoy usando una SIM808 que No viene en la Shield (https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQuE5SBGPzEKQhF17cYLIRspw33ky6ebtd9PxptOmk85VWu22pO). Hasta ahora no he visto tutoriales que trabajen solo con este módulo, pero hasta ahora me he sabido defender bien. Este tutorial me FUNCIONÓ casi bien, pero he visto que es muy probable que los inconvenientes que a veces tengo no sean por el código, ni si quiera se si los problemas que tengo son con mi módulo. El hecho es que ya hice un programa funcional y que hala perfecto para enviar desde un celular un mensaje de texto y que en el código de Arduino al recibir ese mensaje permita que la SIM808 lea las coordenadas de GPS y me envíe por medio de un mensaje de texto la longitud y la latitud.
    Básicamente los problemas que pude evadir, pero que deseo saber el porqué, es que a veces la SIM de la nada, pierde la conexión a la red GPRS, es decir que el led que ya parpadeaba cada 4 segundos, de un momento a otro después de que probé el código de este ejemplo, comienza a parpadear más de seguido y la llamada se cae y no puedo volver a llamar porque no vuelve a coger la señal, lo único que hasta ahora puedo hacer es desconectar la alimentación de la SIM808 y volverla a conectar, y esperar que milagrosamente algunas veces si se conecte y otras veces no. Siguiendo paso a paso este tutorial, si logré recibir el mensaje RING en el monitor serial, además que se visualizaba el numero del que estaba llamando (tal cual como debería suceder), pero al cuarto tono de llamada, la SIM808 pierde señal. si hay alguien que sepa porque sucede esto, o que esté trabajando con un módulo igual al mío, sería de gran ayuda intercambiar ideas y opiniones. Gracias por quien me pueda ayudar! 😉

    • Hola Andrés, esos problemas suelen deberse a la que la alimentación del módulo es insuficiente. En mi caso alimento por separado el módulo y el arduino, y el módulo con un alimentador de 9V y 1A. Un saludo

    • Fernando

    Hola Andrew, hice todo tal cual describís con mi arduino UNO. Lo único que cambie es que enciendo el gprs con el PIN 2 en lugar del 9. Para mandar msjs me funciona perfectamente, pero al recibir, no importa que le mande recibe el caracter: “ÿ”.
    Sabrás que estoy haciendo mal? Puede ser que se queme solo el Tx del Módulo? El modulo es idéntico al tuyo.

    Saludos!

    • Hola Fernando, pues me parecería raro que se te haya quemado ese pin. Parece un problema de velocidad de comunicación, pero es muy raro si te envía los mensajes correctamente. El programa que envía y recibe SMS es el mismo?

    • V

    Gracias por tu aporte es muy útil, quería hacer una consulta ! Estoy usando el SIM900 para activar o desactivar algo , cuando reciba un SMS , sé que debo usar el comando AT+ CNMI 2,2,0,0,0 , al realizarlo funcionaba correctamente y en el serial podía ver el texto del SMS q recibía el módulo pero de pronto , ya no recibe nada ! Ni ejecuta ninguna accion!
    Probé el envío de mensajes y lo realiza correctamente pero no la recepción , es posible q se haya averiado únicamente esa opción? Consideras q algo este mal en el código ? Porfa ayúdame

    • Hola Vane, cuando le envías comandos AT recibes algo por el puerto serie? Puedes probar con un programa facilillo para enviarle los comandos a mano con el monitor serie y ver si al enviarle por ejemplo “AT” te devuelve “OK”. Si sí te devuelve el problema no estaría en la comunicación GPRS/ARduino sino que sería un problema en el GPRS. Pruébalo y me cuentas a ver.

    • Miguel Angel

    Disculpa, hay alguna manera de mandar el numero de quien llama o manda el msn a una variable?

    • Hola Miguel Ángel, pues podrías guardar todo lo que te llega por el puerto serie en una variable y despúes usar un idexof para encontrar el número de quien te ha llamado y mandarlo a una variable. Un saludo.

  • Cuando se usa un puerto serie en lugar de los piner 7 y 8 o 9 y 10 (en mi caso en un mega uso los pines 14 y 15), la escucha del puerto serie no funciona. Esto se puede arreglar no usando la librería softwareserial (no es necesaria y no funciona bien sobre pines serial reales). Se debe quitar el include y la línea con SoftwareSerial SIM900(X,Y);. Para no tener que cambiar el código basta con meter un “#define SIM900 Serial3”. Con esto el código funciona

    • Asi es Juan,

      Si usas un Mega no conviene que utilices librerias para manejar puertos serie.

      Solo la usabamos con el arduino UNO para no cortar la posibilidad de actualizar el programa

  • Buenos dias,

    Estoy haciendo un proyecto con la placa de “Arduino Mega 2560” y una “SIM900”. He hecho el mismo programa que nos habeis mostrado y cuando envio el mensaje desde mi movil, en la pantalla me aparece, “OK”, “PIN OK” y ya esta, no me aparece lo siguiente, que es desde que numero se envia el mensaje y el mensaje mismo.
    He conectado dos cables por salida, uno al RX1 y el otro al TX1, como me ha dicho mi profesor, pero no se porque el mensaje no se envia del todo, cual podria ser el fallo?

    Saludos,

    • Nuestro programa utiliza la librería SoftwareSerial porque los Arduino Uno sólo tienen un puerto serie. De todas formas también puedes usarla con el MEGA (está indicado en la sesión).

      Pero si vas a utilizar el puerto serie número 1 del MEGA (tiene varios) no hace falta usar esa librería, simplemente utilizarias la instrucción Serial1.xxxx dodnde nosotros usamos SIM900.xxxx, y conectar correctamente el MEGA y el GPRS. Un saludo.

    • Alberto

    ¡Hola!
    ¡¡¡¡¡¡¡Funciona!!!!!!!.
    Cambiando en Arduino Mega los pines 7 por el 10 y 8 por el 11 funciona tal y como indica el tutorial.

    Muchas gracias Iván.
    Salu2.

    • Hola Alberto, me alegro que lo hayamnos solucionado! Me lo apunto y en cuanto puedo añado la explicación al tutorial. Un saludote!

    • Alberto

    Hola;
    Agradecer de antemano la labor de los tutoriales pues nos instruyen de manera clara y sencilla en el universo Arduino.
    Comentaros que yo tambien tengo el mismo problema. Utilizo un Arduino Mega (ya que no logro subir y compilar el programa en un arduino UNO, pero eso es otro caso a parte) y el mismo GPRS que el tutorial, he probado a encender un LED dentro de la condición “if (SIM900.available() > 0)” y no se enciende sin embargo si que lo hace fuera de esta condición, por lo que deduzco que el problema está en la recepciónde datos del GPRS al Arduino Mega. Probaré la solución que propone Iván y os comento algo.

    Salu2!.

    • Hola Alberto, la cuestión es que por lo visto el pin 8 del Arduino Mega no se puede usar con la librería Sofware Serial. y claro como no recibe ningún dato no entra nunca en ese bucle, por lo que no puedes encender el LED dentro de él.

      Prueba a usar los pines 10 y 11 del Arduino como comentaba a ver si te funciona. Un saludote!

  • Hola, gracias por el tutorial, tengo el mismo problema que Andrew, la diferencia es que yo lo hago con hardwareSerial del arduino mega, y uso la misma shield del tutorial, a mi tampoco me muestra el RING y los mensajes que envío desde el celular, como te aparece en el tutorial en el monitor serial, que puede ser?; hay que configurar algo mas en el shield para recibir llamadas y mensajes? y tengo una duda si deseo programar una hora predeterminada para enviar mensajes con la shield, o cada cierto tiempo, lo haría con un delay o un reloj? o existe un comando AT?. Gracias por la información y el tiempo brindado.

    • Hola Gabriel, prueba la última opción que le he dado a Andrew a ver si te funciona, yo es que ahora mismo no tengo un Mega para probarlo.

      Por otra parte, la solución fácil que se me ocurre es utilizar un RTC para obtener la hora correcta y enviar el mensaje cuando quieras. Tienes aquí una sesión sobre los RTC: https://www.prometec.net/relojes-rtc/

      Un saludote!

  • Buenos días Ivan,
    Esta es la shield que estoy utilizando: https://drive.google.com/open?id=1VBF2M5rVUryQtoml0c7Lwh_F1p2QygMZ8g
    Cuando la conecto al Mega, como te dije, funcina enciando y recibiendo, por que en el movil desde el que mando el mensaje a la shield me indica “entregado”.
    Lo que no tengo nada pero que nada claro es como hacer eso de los pines que me indicas. Es decir, ¿como hago si el 8 no es el adecuado?
    Lamento tanta molestia, pero llevo meses con este tema hasta que vi estos tutoriales y la verdad, son de mucha ayuda, pero en este punto estoy CIEGO.
    Gracias

    • Hola Andrew, no es ninguna molestia, estamos para ayudar. Creo que el error puede venir por lo siguiente. Según he leído por ahí dice que el Arduino Mega es compatible con la librería Software Serial en todos los pines, pero sin embargo al leer la documentación de la librería no todos lo son, y entre ellos no está el pin 8.

      Prueba a utilizar los pines 10 y 11, es decir, conecta los pines 7 y 8 del GPRS a los pines 10 y 11 de Arduino Mega, y cambia esta instrucción SoftwareSerial SIM900(7, 8); por esta SoftwareSerial SIM900(10, 11); y me cuentas a ver.

      Y si no ahora que me he dado cuenta, el Arduino Mega tiene varios puertos serie, podrías utilizar cualquiera que no sea el 1 (0 Rx y 1 Tx), aunque no se si estás familiarizado con esto.

      Prueba lo que te comento primero y si no funciona probamos otras cosas. Un saludote!

      • En cuanto a lo de los Pines 7 y 8 del GPRS . . . no tengo ni idea de cuales son , por que como te mostré en la imagen (https://drive.google.com/open?id=1VBF2M5rVUryQtoml0c7Lwh_F1p2QygMZ8g) no están numerados…¿Serán los mismos que coinciden con el 7 y 8 del Mega?

        “Y si no ahora que me he dado cuenta, el Arduino Mega tiene varios puertos serie, podrías utilizar cualquiera que no sea el 1 (0 Rx y 1 Tx), aunque no se si estás familiarizado con esto.” -> Pues no. No lo estoy y realmente me gustaría saber a que te refieres. En la placa tengo puestos los conectores RX y TX en SWSerial. ¿?

        • Hola Andrew, a ver los pines 7 y 8 del GPRS son los que tenemos marcados en el tutorial que se conectan al 7 y 8 del Arduino. En tu foto de los de abajo el que setá junto antesy el que esta justo después de la pequeña separación que hay. Es decir el primero por la izquierda sería el 0, el siguiente el 1… y así hasta el 7 y 8.

          En cuanto a la otra cuestión: usamos la libreria software serial para simular un puerto serie usando dos pines que no sean el 0 y el 1 del Arduino uno, que son los encargados de realizar la comunicación serie. El Mega tiene más puertos serie (los que vienen marcados con Rx y Tx) pero de momento vamos a dejar esto. Pruebea a ver si te funciona conectando com o te digo los pines 7 y 8 del GPRS a los pines 10 y 11 del Mega y cambiando la instrucción que te comentaba y me cuentas a ver.

          Un saludote!

          • FUNCIONA OK!!!
            Gracias Ivan por tu paciencia.

          • Lo que sucede ahora es que al enviar los mandatos al grps el monitor los muestra pero muy lento, es decir, al enviarle el SIM900.print(“AT+CLIP=1\r”); en el monitor se muestra AT+CLIP=1 a razón de 2 segundos para mostrar cada letra. 🙁
            Pero si, consigue mostrar mensaje.

          • Hola Andrew! Bueno al menos algo hemos avanzado jejeje. Pues la verdad es que no se me ocurre que puede ser. Estás usando el programa que tenemos subido en la sesiÓn Si no es así mira que no tengas algún delay dentro del loop o de alguna de las funciones que pueda estar haciendo eso.

            Un saludote.

          • Solucionado.
            Le he quitado la linea * SIM900.print(“AT+CNMI=2,2,0,0,0\r”); * y ahora no tiene ese retardo del que te hablaba, me muestra mensajes y realiza llamadas.

            Saludones!

  • Hola. Muy buenas explicaciones. Enhorabuena.
    Utilizo arduino Mega 2560 y una Sim900.
    Todo lo anterior a este ejemplo funciona perfectamente.
    Este último ejemplo, al compilarlo, es cierto que recibe llamadas, por que se oye el tono y si descuelgo puedo hablar y comunicar (utilizo auriculares y mic conectado a la sim900).
    El caso es que no muestra en el monitor los RING ni los mensajes que se le envien, y si que los recibe por que en el teléfono donde los envio tengo activado “recibir mensaje de recepción”.
    No se que puede pasar, la verdad.

    • Hola Andrew, lo primero supongo que tendrás bien seleccionada la velocidad del monitor serie correctamente a 19200 baudios.

      En caso de que así sea, ¿en la sesión anterior te realizaba correctamente las llamadas y los SMS, no? En ese caso el problema estaría en la recepción de los mensajes desde el GPRS al Arduino, que se realiza usando el pin 8.

      Yo no he probado a usarlo con un Mega, pero no debería haber problema en teoría. De todas formas cuando me contestes eso seguimos mirando a ver. La programación la he comprobado por si acaso y funciona correctamente (usando un UNO). Un saludo.

      • Cierto, las llamadas y los SMS los envia OK. El prolema es la recepción.
        Me pierdo cuando me indicas lo del Pin 8, supongo que te refieres al Pin 8 del ¿GPRS?

        • Hola Andrew, en teoría el shield utiliza los pines 7 y 8 del shield y del Arduino para comunicarse entre sí. Uno para enviar datos y otro para recibir. Esos datos luego los vemos nosotros por el monitor serie que utiliza los pines 0 y 1. Creo que me he equivocado y en realidad es el pin 7 el que envía los datos que le llegan al shield hacia Arduino.

          Si envías los SMS y las llamadas correctamente significa que Arduino es capaz de enviarle órdenes al GPRS, pero parece que en tu caso no recibe los datos que deberían llegarle desde el GPRS.

          ¿Estás utilizando el mismo módulo GPRS que he usado yo para la sesión? Comprueba también que tengas bien puesto los bridges para usar los pines 7 y 8 y correctamente enchufados los cables, no vaya a ser que esté mal colocado alguno. un saludote!

Give a Reply

WordPress Anti-Spam by WP-SpamShield