En construcción…
Este artículo es una guía completa para controlar el módulo SIM900 con arduino. Aprenderemos cómo enviar y recibir SMS, realizar y recibir llamadas telefónicas, encender led.
Te presento el escudo SIM900 con arduino uno
Aplicaciones:
El escudo SIM900 permite:
- Conéctese a Internet a través de la red GPRS
- Enviar y recibir SMS
- Realizar y recibir llamadas telefónicas
Sus capacidades lo hacen ideal para proyectos con Arduino como:
- Control remoto de dispositivos electrónicos: enviar un SMS para activar algo (motores, luces, etc).
- Recibir notificaciones: envíe un SMS a su teléfono celular (por ejemplo sensor de gas).
- Reciba datos de un sensor: envía SMS periódicamente a su teléfono con datos de la temperatura de un snesor.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagrama
Caracteristicas
Estas son algunas de las características más importantes del escudo:
- Compatible con Arduino y clones
- Basado en el módulo SIM900 de SIMCOM
- Le permite enviar SMS, MMS, GPRS y audio a través de UART usando comandos AT.
- Tiene 12 GPIO, 2 PWM y ADC incorporado en el módulo SIM900
- Es cuatribanda: 850; 900; 1800 y 1900 MHZ, por lo que debería funcionar en todos los países con redes GSM (2G)
- Control y configuración a través de comandos AT
- Admite RTC (reloj de tiempo real) – tiene un soporte para una batería CR1220 de 3V en la parte inferior
¿ Que significa GSM ?
Es el Sistema Global para Comunicaciones Móviles y es el estándar a nivel mundial para comunicaciones móviles.
¿ Que significa GPRS ?
Significa General Packet Radio Service. GPRS es un servicio de datos móviles en las comunicaciones celulares 2G.
Antes de empezar
Antes de comenzar con su módulo SIM900, ¿Fuente de alimentación elegir?
Recomiendo una fuente de 12 voltios 2 amperes. Como se puede observar en la siguiente foto.
Si lo vamos a conectar la fuente al arduino, debemos colocar el interrruptor en la posición que se muestra en la foto, que es la opción que recomiendo, ya que no tuve inconvenientes.
Ahora si la conexión de alimentación la hicimos al módulo SIM900, el interruptor se debe colocar en esta posición, pero tiene que tener en cuanta que el arduino no es alimentado por el SIM900, tocará alimentarlo por usb o por otro método. Ver foto
Cobertura GSM
Hay que asegurarse que en tu pais hay covertura de red GSM 850 MHz, GSM 900 MHz, DCS 1800 MHz o PCS 1900 MHz es decir 2G (redes de segunda generación).
¿Que tarjeta SIM usar?
Te recomiendo usar una tarjeta SIM prepaga o con SMS/llamada ilimitadas, tener esta precausión por si algo sale mal con el programa que estamos haciendo y este comienza a enviar o llamar en forma repetida, es posible que tengamos que pagar una suma muy grande en nuestra factura telefónica si no tomamos precauciones.
Selección del puerto serial
Hay que asegurarse que los jumper, estén en la posición que se muestra en la foto, para poder utilizar los pines 7 y 8 por software.
Conexión con puerto usb serial
Para las primeras pruebas con comandos AT, recomiendo usar un puerto usb serial
El módulo SIM900 trae unos pines para conexión de un puerto serial, pero no tiene unos pines soldados, tocará hacerlo para poder utilizar este modo.
La conexión con el SIM900 y el adaptador usb serial, se debe hacer la de la siguiente manera TXD–>RXD y RXD–>TXD y por supuesto GNG para unificar las tierras con ambos dispositivos.
¿Y si no tenemos el adaptador usb serial?
Si no tenemos el módulo serial, podemos usar nuestro arduino, para ello debemos cargar un sketch, este programa genera una comunicación gracias a la librería softwareserial.h, genera una comunicación entre arduino y nuestro módulo SIM900 por los pines 7 y 8.
Código fuente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <SoftwareSerial.h> SoftwareSerial SSoft(7, 8); char caracter; void setup() { Serial.begin(19200); SSoft.begin(19200); } void loop() { if (SSoft.available())//si hay caracteres disponibles en el puerto serial por software { caracter = SSoft.read();//leer carecteres en puerto serial por software Serial.print(caracter);//Mostras los caracteres obtenidos } if (Serial.available())//Si hay caracteres en puerto serial por hardware { caracter = Serial.read();//leer carecteres en puerto serial por hardware SSoft.print(caracter);//Mostras los caracteres obtenidos } } |
A partir de ahora podemos enviar comandos AT para depuración testero de distintos comandos, estudiando las respuestas y acciones que genera nuestro módulo SIM900. Podemos usar el mismo terminal serial de arduino para algunos comandos como el de llamada (ATD).
Encendido por sofware
Para el encendido por software antes debemos soldar dos puntos con estaño
Una vez terminado el trabajo debería quedar algo parecido a esto
Ahora en cada programa que queramos que nuestro arduino encienda el SIM900 debemos cargar las siguientes lineas.
1 2 3 4 5 6 |
void setup() { digitalWrite(9, HIGH); delay(1000); digitalWrite(9, LOW); delay65000); } |
Envió de SMS y encendido de led
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <SoftwareSerial.h> SoftwareSerial SIM900(7, 8); //Configarión de los pines serial por software void setup() { SIM900.begin(19200);//Arduino se comunica con el SIM900 a una velocidad de 19200bps delay(20000);//Tiempo prudencial para el escudo inicie sesión de red con tu operador envioMensaje();// llama a la función envioMensaje } void loop() { } void envioMensaje() { SIM900.print("AT+CMGF=1\r"); // comando AT para configurar el SIM900 en modo texto delay(200); SIM900.println("AT + CMGS = \"xxxxxxxx\"");//reemplzar por el número a enviar el mensaje delay(200); SIM900.println("visita www.rogerbit.com");// Reemplzar por el texto a enviar delay(200); //Finalizamos este comando con el caracter de sustitución (→) código Ascii 26 para el envio del SMS SIM900.println((char)26); delay(200); SIM900.println(); } |
Reenvío de SMS con acuse de recibo con encendido de led
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <SoftwareSerial.h> SoftwareSerial SIM900(7, 8);//Configarión de los pines serial por software char caracter=0;// Variable para guardar los caracteres mensajes entrantes int led=12; String estado=""; void setup() { SIM900.begin(19200);//Arduino se comunica con el SIM900 a una velocidad de 19200bps Serial.begin(19200);//Velocidad del puerto serial de arduino delay(20000);//Tiempo prudencial para el escudo inicie sesión de red con tu operador pinMode(led, OUTPUT); SIM900.print("AT+CMGF=1\r");// comando AT para configurar el SIM900 en modo texto delay(200); SIM900.print("AT+CNMI=2,2,0,0,0\r");//Configuramos el módulo para que muestre los SMS por el puerto serie. delay(200); } void loop() { if(SIM900.available() >0) {//Verificamos si hay datos disponibles desde el SIM900 caracter=SIM900.read(); // Leemos los datos y los almcanamos en la variable mensaje Serial.print(caracter); //Imprime los datos entrantes uno a uno en el terminal serial if(caracter=='H'){ Serial.println("-->enviando mensaje"); digitalWrite(led, HIGH); estado="led encendido"; envioMensaje(estado); } if(caracter=='L'){ Serial.println("-->enviando mensaje"); digitalWrite(led, LOW); estado="led apagado"; envioMensaje(estado); } } } void envioMensaje(String estado) { SIM900.println("AT + CMGS = \"xxxxxxxxxxx\"");//reemplzar por el número a enviar el mensaje delay(200); SIM900.println("Estado:" + estado);// Reemplzar por el texto a enviar delay(200); //Finalizamos este comando con el caracter de sustitución (→) código Ascii 26 para el envio del SMS SIM900.println((char)26); delay(200); SIM900.println(); |
Ejemplo básico de llamado telefónico
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <SoftwareSerial.h> SoftwareSerial SIM900(7, 8); //Configarión de los pines serial por software void setup() { SIM900.begin(19200);//Arduino se comunica con el SIM900 a una velocidad de 19200bps Serial.begin(19200);//Velocidad del puerto serial de arduino delay(20000);//Tiempo prudencial para el escudo inicie sesión de red con tu operador hacerLlamada();//Llama a la función hacerLlamada } void loop() { } void hacerLlamada() { SIM900.print("ATD");//Comando AT para iniciar una llamada SIM900.print("xxxxxx");//Número de telefono al cual queremos llamar SIM900.println(";");//El ";" indica llamada de voz y no llamada de datos ej:(FAX) Serial.println("Llamando...");//Leyenda que indica que se inicio el llamado delay(25000);//Duración del llamado antes de cortar SIM900.println("ATH"); // comando AT cortar llamada Serial.println("Llamada finalizada");//Leyenda que indica que finalizó el llamado } |
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagrama
SUSCRIBETE A NUESTROS BOLETINES, RECIBE EN TU CORREO LAS NOTICIAS MÁS DESTACADAS, SÓLO INGRESANDO TU CORREO ELECTRÓNICO
[wysija_form id=”1″]
VIDEO RECOMENDADO
AYUDA POR FAVOR!!
ME SALE DATOS BASURA CUANDO INTENTO OPERAR CON LOS COMANDOS AT. He estuve cambiando los baudios en el scketch y en el ide, pero sigue sin mandarme datos. Solo me manda ???xxx cosas sin sentido
Super bien lo felicito
hola , modifique tu ejemplo y le agregue 8 luces , lo puedes chequear? , el tema es que lo unico que hace es entrar en loop y empieza enviar mensajes y prende luces al azar.
que podria hacer para quede en espera a el ingreso del letra , gracias
#include
SoftwareSerial SIM900(7, 8);//Configarión de los pines serial por software
char caracter=0;// Variable para guardar los caracteres mensajes entrantes
int led2=2;
int led3=3;
int led4=4;
int led5=5;
int led6=6;
int led7=9;
int led8=10;
int led9=11;
String estado=””;
void setup() {
SIM900.begin(19200);//Arduino se comunica con el SIM900 a una velocidad de 19200bps
Serial.begin(19200);//Velocidad del puerto serial de arduino
delay(20000);//Tiempo prudencial para el escudo inicie sesión de red con tu operador
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
SIM900.print(“AT+CMGF=1\r”);// comando AT para configurar el SIM900 en modo texto
delay(200);
SIM900.print(“AT+CNMI=2,2,0,0,0\r”);//Configuramos el módulo para que muestre los SMS por el puerto serie.
delay(200);
}
void loop() {
if(SIM900.available() >0) {//Verificamos si hay datos disponibles desde el SIM900
caracter=SIM900.read(); // Leemos los datos y los almcanamos en la variable mensaje
Serial.print(caracter); //Imprime los datos entrantes uno a uno en el terminal serial
if(caracter==’A’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led2, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’B’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led2, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’C’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led3, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’D’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led3, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’E’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led4, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’F’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led4, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’G’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led5, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’H’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led5, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’I’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led6, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’J’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led6, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’K’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led7, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’L’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led7, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’M’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led8, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’N’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led8, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
if(caracter==’O’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led9, HIGH);
estado=”led encendido”;
envioMensaje(estado);
}
if(caracter==’P’){
Serial.println(“–>enviando mensaje”);
digitalWrite(led9, LOW);
estado=”led apagado”;
envioMensaje(estado);
}
}
}
void envioMensaje(String estado) {
SIM900.println(“AT + CMGS = \”+56996491012\””);//reemplzar por el número a enviar el mensaje
delay(1000);
SIM900.println(“Estado:” + estado);// Reemplzar por el texto a enviar
delay(1000);
//Finalizamos este comando con el caracter de sustitución (→) código Ascii 26 para el envio del SMS
// SIM900.println((char)26);
delay(1000);
SIM900.println();
}
AYUDA POR FAVOR!!
SOLO ME SALE ???????????? CUANDO INTENTO OPERAR CON LOS COMANDOS AT.