Enviar Recibir SMS y llamar con el módulo SIM800L GSM y Arduino Deja un comentario

Cómo funciona el módulo SIM800L GSM y Arduino

Ya sea que quieras escuchar lo que sucede en tu casa que está a kilómetros de distancia o activar el sistema de rociadores en tu jardín sólo con una llamada silenciosa; entonces el módulo GSM/GPRS SIM800L sirve como un sólido punto de lanzamiento para que empieces con la domótica y el Internet de las Cosas.

El módulo SIM800L GSM/GPRS es un módem GSM en miniatura, que puede ser integrado en un gran número de proyectos de IO. Puedes usar este módulo para lograr casi todo lo que un teléfono celular normal puede; mensajes de texto SMS, hacer o recibir llamadas telefónicas, conectarse a Internet a través de GPRS, TCP/IP, y más! Para colmo, el módulo soporta una red GSM/GPRS cuatribanda, lo que significa que funciona prácticamente en cualquier parte del mundo.

Descripción del hardware del módulo GSM/GPRS SIM800L

En el corazón del módulo hay un chip celular SIM800L GSM de SimCom. El voltaje de funcionamiento del chip es de 3,4V a 4,4V, lo que lo convierte en un candidato ideal para el suministro directo de baterías LiPo. Esto lo convierte en una buena opción para integrarlo en proyectos sin mucho espacio.

Todos los pines de datos necesarios del chip SIM800L GSM se abren a un 0.1″ cabeceras de paso. Esto incluye los pines necesarios para la comunicación con un microcontrolador sobre UART. El módulo soporta una tasa de baudios de 1200bps a 115200bps con detección automática de baudios.

El módulo necesita una antena externa para conectarse a una red. El módulo suele venir con una antena helicoidal y se suelda directamente al pin de la red en el PCB. El tablero también tiene un conector U.FL en caso de que quieras mantener la antena lejos del tablero.

Hay un socket SIM en la parte de atrás. Cualquier tarjeta SIM micro activada de 2G funcionaría perfectamente. La dirección correcta para insertar la tarjeta SIM está normalmente grabada en la superficie del enchufe de la SIM.

Este módulo mide sólo 1 pulgada² pero contiene una sorprendente cantidad de características en su pequeño marco. Algunas de ellas se enumeran a continuación:

  • Soporta la banda cuádruple: GSM850, EGSM900, DCS1800 y PCS1900
  • Conéctate a cualquier red global GSM con cualquier SIM 2G
  • Hacer y recibir llamadas de voz usando un altavoz externo 8Ω y un micrófono electret
  • Enviar y recibir mensajes SMS
  • Enviar y recibir datos GPRS (TCP/IP, HTTP, etc.)
  • Escanear y recibir emisiones de radio FM
  • Transmitir energía:
    • Clase 4 (2W) para GSM850
    • Clase 1 (1W) para el DCS1800
  • Conjunto de comandos AT basados en serie
  • Conectores FL para antenas celulares
  • Acepta la tarjeta micro SIM

Indicadores de estado de los LED

Hay un LED en la parte superior derecha del módulo celular SIM800L que indica el estado de tu red móvil. Parpadeará a varias velocidades para mostrar en qué estado se encuentra:

  • Parpadea cada 1s. El módulo está funcionando pero aún no se ha conectado a la red móvil. Luz de red LED parpadeante Conexión GPRS activa
  • Pestañeo cada 2s. La conexión de datos GPRS que solicitó está activa. LED de luz de red Parpadeo Conexión de red establecida.
  • Parpadea cada 3s. El módulo ha hecho contacto con la red móvil y puede enviar/recibir voz y SMS.

Selección de la antena

Se requiere una antena para usar el módulo para cualquier tipo de comunicación de voz o datos, así como algunos comandos SIM. Por lo tanto, la selección de una antena podría ser algo crucial. Hay dos maneras de agregar una antena a tu módulo SIM800L.

La primera es una antena GSM helicoidal que normalmente viene con el módulo y se suelda directamente al pin NET en el PCB. Esta antena es muy útil para proyectos que necesitan ahorrar espacio pero que tienen dificultades para obtener conectividad, especialmente si su proyecto está en el interior.

Llama a GSM850 199 mA EGSM900 216 mA DCS1800 146 mA PCS1900 131 mA GPRS 453 mA Ráfaga de transmisión 2 A

Como el módulo SIM800L no viene con regulador de voltaje incorporado, se requiere una fuente de alimentación externa ajustada a un voltaje entre 3.4V y 4.4V (Ideal 4.1V). La fuente de alimentación también debe ser capaz de suministrar 2A de corriente de sobrecarga, de lo contrario el módulo seguirá apagándose. Aquí hay algunas opciones que puede considerar para alimentar correctamente su módulo GSM.

Batería de Li-Po de 3.7v (Recomendado)

Una de las cosas interesantes de las baterías de Li-Po es que su voltaje está generalmente en el rango de 3.7V – 4.2V, perfecto para el módulo SIM800L. Cualquier batería de iones de litio/polímeros de 1200mAh o más grande es la mejor, ya que puede proporcionar el rango de voltaje correcto incluso durante los picos de 2 Amperios.

SIM800L GSMPinout

El módulo SIM800L tiene un total de 12 pines que lo conectan al mundo exterior. Las conexiones son las siguientes:


delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
updateSerial();
mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println("AT+CREG?"); //Check whether it has registered in the network
updateSerial();
}

void loop()
{
updateSerial();
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

El código comienza incluyendo una biblioteca SoftwareSerial.h e inicializándola con los pines de Arduino a los que se conecta el Tx y Rx del módulo SIM800L.

#include

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

En la función de configuración: inicializamos un enlace de comunicación en serie entre Arduino, Arduino IDE y el módulo SIM800L a una velocidad de 9600 baudios.

//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);

Ahora que hemos establecido una conexión básica, intentaremos comunicarnos con el módulo SIM800L enviando comandos AT.

  • AT – Es el comando AT más básico. También inicializa el Auto-baud’er. Si funciona, deberías ver el eco de los caracteres AT y luego OK, diciéndote que está bien y que te está entendiendo correctamente. Puedes enviar algunos comandos para consultar el módulo y obtener información sobre él, como por ejemplo
  • AT+CSQ – Comprueba la “fuerza de la señal” – el primer # es la fuerza en dB, debería ser mayor que alrededor de 5. Más alto es mejor. Por supuesto que depende de tu antena y de tu ubicación.
  • AT+CCID – Obtener el número de la tarjeta SIM – esto prueba que la tarjeta SIM se encuentra bien y puede verificar que el número está escrito en la tarjeta.
  • AT+CREG? Comprueba que estás registrado en la red. El segundo número debe ser 1 o 5. 1 indica que estás registrado en la red doméstica y 5 indica que estás en la red de roaming. Aparte de estos dos números indica que no estás registrado en ninguna red.

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
updateSerial();
mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println("AT+CREG?"); //Check whether it has registered in the network
updateSerial();

En la parte de bucle del código, llamamos a la función personalizada llamada updateSerial() que espera continuamente cualquier entrada del monitor serie y la envía al módulo SIM800L a través del pin D2 (Rx del módulo). También lee continuamente el pin D3 (Tx del módulo) si el módulo SIM800L tiene alguna respuesta.

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

Deberías ver abajo la salida en el monitor serie.


delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CMGS="+ZZxxxxxxxxxx"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
updateSerial();
mySerial.print("Last Minute Engineers | lastminuteengineers.com"); //text content
updateSerial();
mySerial.write(26);
}

void loop()
{
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

El código es casi igual al anterior, excepto por el fragmento de código. Una vez que se establece la conexión, enviamos los comandos AT de abajo:

  • AT+CMGF=1 – Selecciona el formato del mensaje SMS como texto. El formato por defecto es Unidad de Datos de Protocolo (PDU)
  • AT+CMGS=+ZZxxxxxxxxxx – Envía un SMS al número de teléfono especificado. El mensaje de texto introducido seguido de un carácter “Ctrl+z” se trata como un SMS. “Ctrl+z” es en realidad un 26º carácter no impreso descrito como “sustituto” en la tabla ASCII. Por lo tanto, necesitamos enviar 26DEC (1AHEX) una vez que enviemos un mensaje.

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CMGS="+ZZxxxxxxxxxx"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
updateSerial();
mySerial.print("Last Minute Engineers | lastminuteengineers.com"); //text content
updateSerial();
mySerial.write(26);

El bucle se mantiene vacío ya que queremos enviar un SMS sólo una vez. Si deseas enviar un SMS una vez más, sólo tienes que pulsar la tecla RESET en tu Arduino. Y entonces enviará al mensaje al número de teléfono designado.

Código de Arduino para Lectura de SMS

Ahora programemos nuestro Arduino para leer los mensajes entrantes. Este sketch es muy útil cuando se necesita activar una acción cuando se recibe un SMS específico. Por ejemplo, cuando el Arduino recibe un SMS, puedes darle instrucciones para activar o desactivar un relé.

#include

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();
}

void loop()
{
updateSerial();
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

El código es similar al anterior, excepto por el fragmento de código de abajo. Una vez que se establece la conexión, enviamos abajo los comandos AT:

  • AT+CMGF=1 – Selecciona el formato del mensaje SMS como texto. El formato por defecto es Unidad de Datos de Protocolo (PDU)
  • AT+CNMI=1,2,0,0,0 – especifica cómo se deben manejar los mensajes SMS recién llegados. De esta manera, puede indicar al módulo SIM800L que reenvíe los mensajes SMS recién llegados directamente al PC o que los guarde en el almacenamiento de mensajes y luego notifique al PC sobre su ubicación en el almacenamiento de mensajes.

Su respuesta comienza con +CMT: Todos los campos de la respuesta están separados por comas y el primer campo es el número de teléfono. El segundo campo es el nombre de la persona que envía el SMS. El tercer campo es una marca de tiempo mientras que el cuarto campo es el mensaje real.

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();

Ten en cuenta que esta vez NO hemos mantenido la función de bucle vacía, ya que estamos buscando mensajes SMS recién llegados. Una vez que envíe el SMS al módulo GSM SIM800L, verá la salida en el monitor serial.

Si tu mensaje es lo suficientemente largo como el nuestro, entonces probablemente lo recibirás con algunos caracteres que faltan. Esto no se debe a un código defectuoso. El búfer de recepción de SoftwareSerial se está llenando y descartando caracteres. No estás leyendo lo suficientemente rápido del buffer.

La solución más simple para esto es aumentar el tamaño del búfer del SoftwareSerial de su tamaño predeterminado de 64 bytes a 256 bytes (o más pequeño, dependiendo de lo que funcione para usted).

En un PC con Windows, ve a C:Ficheros de programa (x86) -> Arduino -> hardware -> Arduino -> avr -> bibliotecas -> SoftwareSerial (-> src para la nueva versión del IDE de Arduino) Abre SoftwareSerial.h y cambie la línea:

// RX buffer size
#define _SS_MAX_RX_BUFF 64

a

// RX buffer size
#define _SS_MAX_RX_BUFF 256

Guarda el archivo y vuelve a ejecutar el código.

Código de Arduino para hacer una llamada

Ahora programemos a nuestro Arduino para que haga la llamada. Este sketch es muy útil cuando quieres que tu Arduino haga una llamada de SOS/estrés en caso de emergencia como que se exceda la temperatura o alguien entre en tu casa.

Antes de probar el código, tienes que introducir el número de teléfono. Busca la cadena ZZxxxxxxxxxx y sustituye ZZ por el código del condado y xxxxxxxxxx por el número de teléfono de 10 dígitos.

#include

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK
updateSerial();

mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // change ZZ with country code and xxxxxxxxxxx with phone number to dial
updateSerial();
delay(20000); // wait for 20 seconds...
mySerial.println("ATH"); //hang up
updateSerial();
}

void loop()
{
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

Para realizar una llamada se utilizan los comandos AT:

  • ATD+ +ZZxxxxxxxxxx; – Marca un número determinado. El modificador de punto y coma (;) al final separa la cadena de marcado en múltiples comandos de marcado. Todos los comandos excepto el último deben terminar con el modificador punto y coma (;).
  • ATH – Cuelga la llamada

mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // change ZZ with country code and xxxxxxxxxxx with phone number to dial
updateSerial();
delay(20000); // wait for 20 seconds...
mySerial.println("ATH"); //hang up
updateSerial();

Código de Arduino para recibir la llamada

Recibir una llamada no requiere ningún código especial, sólo tienes que seguir escuchando el módulo SIM800L. Sin embargo, puede que encuentres este esquema muy útil, cuando necesites desencadenar una acción cuando se reciba una llamada de un número de teléfono específico.

#include

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);

Serial.println("Initializing...");
}

void loop()
{
updateSerial();
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

La llamada entrante suele indicarse con un “ANILLO” en el monitor de serie seguido del número de teléfono y el identificador de llamadas. Para aceptar o colgar una llamada se utilizan los siguientes comandos AT:

ATA – Acepta la llamada entrante.

ATH – Cuelga la llamada. Al colgar la llamada envía NO CARRIER en el monitor serial indicando que la llamada no pudo conectarse.

Esto se mostrara en el monitor serial como una llamada recibida por el módulo SIM800L GSM.

Cómo Controlar dispositivos electrónicos remotamente vía SMS con Arduino y SIM800L

Última actualización el 2020-04-17 / Enlaces de afiliados / Imágenes de la API para Afiliados

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?