Select Page

Los celulares y la telefonía móvil son tendencia en la actualidad, por eso en esta página vamos a enseñarte como utilizar el módulo GSM SIM800L de SIMCOM para enviar SMS con Arduino. Los mensajes de texto pueden ser de gran utilidad en diversos proyectos, por ejemplo: para alertarnos de situaciones de alarma en equipos remotos, para alertarnos de intrusiones en un sistema de seguridad casero, enviar datos de telemetría, crear un localizador GPS que se comunique mediante mensajes de texto SMS, creación de alarmas vecinales, etc.

El módulo SIM800L es el componente principal de las tarjetas FONA 800 de Adafruit, por lo que podemos utilizar la librería realizada para estas tarjetas con los módulos económicos que montan el SIM800L, como el que tenemos a la venta en nuestra tienda virtual. En este tutorial nos enfocamos en el uso de la librería de Adafruit, pero también mostramos como puede realizarse el envío de mensajes de texto enviando comandos AT directamente al módulo GSM, esto ultimo es principalmente con fines didácticos, ya que el método preferido será el uso de una librería.

En la foto principal de este artículo vemos el circuito que hemos armado para las pruebas de envío de SMS con arduino. También se observan los equipos que alimentan el experimento.

 

Materiales necesarios para las prácticas

Para esta experiencia requerimos los siguientes materiales:

De manera alternativa, podemos utilizar los shield de Adafruit:

 

Conexiones para Enviar SMS con Arduino y SIM800L

Para usar el SIM800 es necesario contar con una fuente de alimentación de 4.0 volts (el SIM800 acepta voltajes en el rango de 3.4 a 4.4 volts). Muchas personas utilizan baterías de polímero de litio para alimentarlo, aunque si no se desea estar cargando constantemente las baterías recomendamos usar una fuente de alimentación ajustable como las que encontramos en nuestra tienda virtual, mismas que estaremos utilizando en nuestras pruebas y que ajustaremos para una salida de 4 volts a partir de los 9 con los que alimentaremos todo el equipo (incluyendo el arduino).

En este punto hay que hacer énfasis en el hecho de que no vale utilizar directamente las salidas de 3.3 volts ni 5 volts de arduino, debido a que 5 volts es demasiado para el SIM800 y 3.3 volts esta por abajo del rango permitido. Además, el puerto USB de la computadora y el arduino en si mismo no es capaz de suministrar la corriente necesaria para el funcionamiento del módulo SIM800L. Para que el experimento tenga éxito, una alimentación impecable para el SIM800L es necesaria.

Nuestra conexión de la energía quedó de la siguiente manera:

Las conexiones de datos con el módulo GSM SIM800L se realizan mediante la UART. Debemos conectar el TX de Arduino al RX del SIM800L y el RX del Arduino al TX del SIM800L (cruzadas). Debemos respetar los niveles de entrada del SIM800L el cual es de 2.8 volts. Para esto podemos usar un simple divisor resistivo en el lado TX del arduino o un adaptador de niveles lógicos, nosotros optamos por un divisor resistivo formado por dos resistencias de 330 ohms: Hemos destacado nuestro convertidor de niveles para la comunicación en dirección al SIM800L, ya que los 5 volts de salida del Arduino pueden dañar el SIM800L.

De manera alternativa a la fuente de alimentación, podemos utilizar una batería de polímero de litio para alimentar el SIM800L, tal como se muestra a continuación.

 

Programación para envío de mensaje SMS con Arduino y SIM800L

En este caso, vamos a simular que queremos desarrollar una alarma que nos alerte mediante un mensaje de texto a nuestro celular cuando alguien abre una puerta, para simular el sensor de la puerta, podemos utilizar un switch común insertado en el protoboard. Con la librería FONA, el programa queda de la siguiente manera:

/**
   GeekFactory - "INNOVATING TOGETHER"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   SKETCH PARA ENVIAR SMS CON ARDUINO UTILIZANDO LA LIBRERIA DE ADAFRUIT FONA.
   ESTE SKETCH SIMULA UNA ALARMA EN LA CUAL AL OPRIMIR UN BOTON SE ENVIA UN MENSAJE SMS
   ALERTANDO DE UNA INTRUSION. PODEMOS SUSTITUIR EL BOTON POR UN SENSOR MAGNETICO PARA
   PUERTAS Y VENTANAS, DE FORMA QUE ESTE EJEMPLO PUEDE VOLVERSE UNA ALARMA FUNCIONAL.
*/
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"

// CONFIGURACION DE UART GSM
#define CONFIG_GSM_RXPIN 4
#define CONFIG_GSM_TXPIN 3
#define CONFIG_GSM_BAUDRATE 9600

// CONFIGURACION DEL NUMERO DESTINO DEL MENSAJE SMS
#define CONFIG_GSM_SMS_DESTINATION "+52155XXXXXXXX"

// PIN UTILIZADO COMO ENTRADA PARA DESENCADENAR EL ENVIO DE UN MENSAJE
#define CONFIG_ALARM_PIN 5

// PUERTO SERIE EMULADO: EL ARDUINO UNO TIENE SOLO 1 UART
// EN EL CONSTRUCTOR DE SOFTWARESERIAL SE ESPECIFICAN LOS PINES PARA RX Y TX
SoftwareSerial swseri = SoftwareSerial(CONFIG_GSM_RXPIN, CONFIG_GSM_TXPIN);

// OBJETO ADAFRUIT_FONA USADO PARA COMUNICARSE CON EL SIM800L
Adafruit_FONA fona = Adafruit_FONA(10);

void setup() {
  // PREPARAR PINES IO
  pinMode(CONFIG_ALARM_PIN, INPUT_PULLUP);

  // PREPARAR LOS PUERTOS SERIALES A LA VELOCIDAD CONFIGURADA
  swseri.begin(CONFIG_GSM_BAUDRATE);
  Serial.begin(CONFIG_GSM_BAUDRATE);

  // IMPRIMIR EL ENCABEZADO INCIAL
  Serial.println(F("----------------------------------------------------"));
  Serial.println(F("    EJEMPLO ALARMA CONTRA INTRUSOS CON ALERTA SMS   "));
  Serial.println(F("            http://www.geekfactory.mx              "));
  Serial.println(F("----------------------------------------------------"));

  // INICIAR LA COMUNICACION CON EL MODULO GSM
  // PASAMOS REFERENCIA AL PUERTO SERIE USADO PARA LA COMUNICACION CON EL MODEM
  if (fona.begin(swseri))
    Serial.println(F("MODULO GSM OK"));
  else
  {
    // BLOQUEAR LA EJECUCIÓN EN ESTE PUNTO SI NO SE ENCUENTRA MODULO GSM O FALLA LA COMUNICACIÓN CON ESTE
    Serial.println(F("NO SE ENCUENTRA MODULO GSM"));
    while (1);
  }

  // AQUI SE REALIZA EL ENVIO DEL MENSAJE SMS
  // INDICAMOS EL NUMERO DESTINO Y EL CUERPO DEL MENSAJE
  if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "Alarma SMS encendiendo!!!")) {
    Serial.println(F("ERROR"));
  } else {
    Serial.println(F("ENVIADO"));
  }
}

void loop() {
  // ESPERAR CAMBIO DE ESTADO EN EL PIN
  if (!digitalRead(CONFIG_ALARM_PIN))
  {
    // RETARDO PARA LIDIAR CON REBOTES Y RUIDO
    delay(100);
    // VOLVEMOS A REVISAR EL ESTADO DEL PIN
    if (!digitalRead(CONFIG_ALARM_PIN))
    {
      if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "MENSAJE DE ALERTA DEL SISTEMA DE ALARMA DOMESTICA!!!")) {
        Serial.println(F("ERROR AL ENVIAR MENSAJE DE ALARMA"));
      } else {
        Serial.println(F("MENSAJE DE ALARMA ENVIADO"));
      }
      // PARA NO ENVIAR DEMASIADOS MENSAJES SEGUIDOS
      delay(5000);
    }
  }
}

 

Código para envío de SMS con Arduino y SIM800L sin librería (solo comandos AT).

En caso de que deseemos prescindir de la librería, el programa puede quedar como se muestra más abajo. La verdad, estamos simplificando al extremo las cosas aquí y solamente es para ilustrar lo sencillo que es controlar el módulo GSM / GPRS SIM800L mediante los comandos AT. El método más robusto para enviar SMS con arduino es el que se indica más arriba, mediante la librería de Adafruit.

/**
   GeekFactory - "INNOVATING TOGETHER"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   SKETCH PARA ENVIAR SMS CON ARDUINO TRAVÉS DE MODEM GSM SIM800L. AL MOMENTO
   DE ARRANCAR EL SKETCH SE ENVÍA EL MENSAJE DE TEXTO, LUEGO EL ARDUINO QUEDA EN MODO DE
   PUENTE USB-UART PARA PODER SEGUIR ENVIANDO COMANDOS AT AL MODULO GSM.

   ESTE SKETCH CREA UN UART EMULADO POR SOFTWARE EN LOS PINES INDICADOS Y REDIRIGE
   LOS DATOS DESDE Y HACIA EL UART POR HARDWARE EN LOS PINES 0 Y 1 DEL ARDUINO UNO.
   ESTA DISEÑADO PENSANDO EN LA TARJETA UNO, YA QUE EL MEGA SI DISPONE DE VARIOS
   UART POR HARDWARE Y PODRIA REALIZARSE SIN RECURRIR A SOFTWARESERIAL.

*/
#include <SoftwareSerial.h>

// CONFIGURACION DE UART GSM
#define CONFIG_GSM_RXPIN 4
#define CONFIG_GSM_TXPIN 3
#define CONFIG_GSM_BAUDRATE 9600

// PUERTO SERIE EMULADO: EL ARDUINO UNO TIENE SOLO 1 UART
// EN EL CONSTRUCTOR DE SOFTWARESERIAL SE ESPECIFICAN LOS PINES PARA RX Y TX
SoftwareSerial swseri = SoftwareSerial(CONFIG_GSM_RXPIN, CONFIG_GSM_TXPIN);

void setup()
{
  // PREPARAR LOS PUERTOS SERIALES A LA VELOCIDAD CONFIGURADA
  swseri.begin(CONFIG_GSM_BAUDRATE);
  Serial.begin(CONFIG_GSM_BAUDRATE);

  // IMPRIMIR EL ENCABEZADO INCIAL
  Serial.println(F("----------------------------------------------------"));
  Serial.println(F("  EJEMPLO PARA ENVIAR SMS CON ARDUINO Y MODULO GSM  "));
  Serial.println(F("            http://www.geekfactory.mx              "));
  Serial.println(F("----------------------------------------------------"));

  // ENVIAR LOS COMANDOS AT AL MODEM PARA EL ENVIO DEL MENSAJE SMS
  // CONFIGURAR EL MODULO PARA ENVIO DE MENSAJES EN MODO TEXTO (OTRA OPCION ES EL MODO PDU)
  swseri.println("AT+CMGF=1");
  delay(100);

  // ENVIAR EL COMANDO DE ENVIO DE SMS INCLUYENDO EL DESTINATARIO DEL MENSAJE
  swseri.println("AT+CMGS=\"+521XXXXXXXXX\"");
  delay(100);

  // ENVIAR EL CUERPO DEL MENSAJE
  swseri.print("HOLA MUNDO SMS DESDE ARDUINO!");
  delay(500);

  // ENVIAR EL CARACTER DE CONTROL ASCII 26 (SUB) 0X1A INDICANDO EL FINAL DEL CUERPO DEL MENSAJE
  swseri.print(char(0x1A));
  delay(2000);
}

void loop()
{
  // SI HAY DATOS EN LA INTERFAZ SERIAL POR SOFTWARE, ESCRIBIRLOS EN EL UART FISICO
  if (swseri.available())
  {
    Serial.write(swseri.read());
  }

  // SI HAY DATOS EN LA INTERFAZ SERIAL POR HARDWARE, ESCRIBIRLOS EN EL UART EMULADO
  if (Serial.available())
  {
    swseri.write(Serial.read());
  }
}

En este programa no hacemos caso a las respuestas del módulo GSM, por lo tanto, no hay una manera sencilla de determinar si algo salio mal al momento de enviar el mensaje, sin embargo, este programa se deja a disposición de los lectores para fines didácticos.

 

Conclusión y repaso

  • En este tutorial aprendimos como dar alimentación al módulo SIM800L y las conexiones básicas entre este y el arduino.
  • Aprendimos a utilizar la librería FONA de Adafruit para controlar el SIM800L y mandar mensajes SMS.
  • Aprendimos a realizar el envío de mensajes SMS utilizando comandos AT desde arduino en caso de no querer utilizar una librería externa.
  • Este tutorial funciona como introducción a los módulos SIM800 y shields FONA de Adafruit que funcionan gracias al SIM800L.
  • Aprendimos que este programa puede funcionar con otros módulos GSM, ya que los comandos para enviar mensajes de texto son estándar entre los fabricantes.
shares