Enviar mensaje a números registrados en la Sim Card
Materiales Utilizados:
- Modulo sim800l
- Tarjeta Arduino Uno o Mega 2560
- Módulo tp4056
- Sim card de Claro "para Colombia". Si esta en un país distinto, puedes probar con distintas sim card y ver con cual funciona bien.
- Batería de lipo o litio de 3.7 V.
- Resistencia de 220 ohmio y 1k ohmio.
- Led del color de su preferencia
Circuito
Para garantizar la alimentación del modulo sim800l, se utiliza la tarjeta tp4056 con dos baterías de tipo lipo recargables o puede ser de tipo litio de 3.7 V.
Circuito con el Arduino Uno:
Circuito con el Arduino Mega 2560:
Descripción del código
Cuando se esta desarrollado un aplicativo o proyecto electrónico donde se suele utilizar números móviles al cual se debe enviar notificaciones de alerta ó lectura de sensores a cierto tiempo vía mensaje de texto, es importante saber como se va manejar el almacenamiento de dichos números móviles en caso de ser demasiados, esto puede ser a través de un array de String o cadena, que es un poco funcional por lo que los datos de tipo String suele consumir mucho recurso de memoria, que se puede utilizar para optimizar nuestro código, otra forma de almacenar los números es a través de la sim card del operador que se esta utilizando, este elemento permite almacenar alrededor de 100 a 250 números móviles en su memoria, dependiendo de su capacidad de almacenamiento.
En esta práctica se muestra como enviar mensajes de texto, a los números registrados en la sim card que se está utilizando, los números quedan registrados desde una posición 0 hasta una posición final, por ejemplo 250, y se realiza de manera automática una vez se registre el primer número móvil en la sim card, el proceso se lleva a cabo mediante un celular móvil cualquiera, donde se introduce la sim card y se registra el numero móvil que se desee, agregando su respectivo nombre y especificando que el registro del número o contacto es en la sim card.
Para la lectura de los números móvil o contactos registrado en la sim card, se utiliza el siguiente comando AT:
AT+CPBR=X donde X es la posición donde esta almacenado el número móvil en la sim card.
Por ejemplo:
Si se envía al módulo sim800l el comando AT+CPBR=1, la respuesta que se obtiene es la siguiente:
+CPBR: 1,"3205000000",129,"NumPrueba1"
Donde:
1: posición donde esta almacenado el número móvil en la sim card.
3205000000: el número móvil en la posición 1 dentro de la sim card.
NumPrueba1: nombre con el que esta guardado en número móvil.
Para enviar el comando AT+CPBR=1, se utiliza la siguiente función readNumberSimCard que recibe por parámetro un dato de tipo String "comandoAT". Dicha función recibe el comando AT y lo envía al módulo sim800l, dentro de la función se tiene otra función: readDataSIM800L(), que se encarga de leer la respuesta del módulo sim800l y devolver un datos de tipo String.
String readNumberSimCard(String comandoAT){
while(Serial.available())
Serial.read(); // Limpie el buffer de entrada
if (comandoAT.length()>0) {
Serial.println(comandoAT); // Enviar comando AT
//Serial.println(comandoAT); // Mostrar comando por serial
}
return readDataSIM800L();
}
String readDataSIM800L(){
String texto;
while(!Serial.available()){}
texto = Serial.readString();
Serial.println(texto);
return texto;
}
Luego para decodificar el mensaje recibido, se utiliza la librería Separador, que recibe el mensaje por parámetro y nos permite obtener el dato que nos interesa, teniendo en cuenta su respectiva ubicación, carácter que lo separa, por ejemplo: dos puntos ":", comillas ' " ', coma ",", etc. Para este proceso se tiene la siguiente función:
Previamente se declara el objeto s y variables utilizadas.
Separador s;
String co0, co2, posStr;
String numMovil;
String nameNumber;
void separateMsm(String bodyMsm){
co0 = s.separa(bodyMsm, '"', 0);
numMovil = s.separa(bodyMsm, '"', 1);
co2 = s.separa(bodyMsm, '"', 2);
nameNumber = s.separa(bodyMsm, '"', 3);
Serial.println();
Serial.print("Posicion:");
Serial.println(posStr);
Serial.print("Numero:");
Serial.println(numMovil);
Serial.print("Nombre:");
Serial.println(nameNumber);
delay(1000);
}
De es manera se puede obtener, la posición, número y nombre del móvil o contacto guardado en la sim card.
Finalmente para el envió de mensaje se utiliza la siguiente función, con los datos decodificados del mensaje recibido: numMovil, nameNumber.
void sendMsnNumbers(){
Serial.println("Enviando mensaje...");
delay(1000);
Serial.println("AT+CMGS=\""+countryCode+numMovil+"\""); // Numero para enviar mensaje
delay(500);
Serial.println("Mensaje enviado por: "+nameNumber);
delay(1000);
Serial.write(0x1A); //ctrl+z
delay(3000);
Serial.println("Mensaje enviado.");
}
Donde:
countryCode: código del país, variable de tipo String.
Conceptos:
Serial.readString(): Función propia de Arduino, que permite leer todo lo ingresado por el puerto serial o buffer y, convertirlo a dato de tipo String o una cadena, es decir nos devuelve un dato de tipo String.
Serial.read(): Igual que la función anterior, pero el dato que nos devuelve esta función es de tipo int.
Tips para realizar las pruebas
- Si no posee el modulo tp4056, puede realizar las pruebas solo con batería, utilice una, no es necesario tener las dos, tener en cuenta que debe estar cargada más del 50%.
- Se recomienda utilizar cables de conexión para la alimentacion del sim800l, con calibre más gruesos que los dupont, para garantizar la circulación de corriente de manera fluida.
- No se recomienda hacer las conexiones sobre protoboard, porque se crean falsos contactos que impide la circulación fluida de la corriente, en lo posible realice las conexiones con cables de un calibre grueso, especialmente los de la alimentación (Vcc y GND), si es posible, soldar los cables.
- Si el sim800l no logra conectarse a la red con determinada sim card del operador móvil que esta utilizando, quítela y realice la prueba con la de otro operador disponible en su país o ciudad.
- Fijar la frecuencia del módulo en 115200 bps "Serial.begin(115200)" y "Serial1.begin(115200)", por lo que la mayoría de los módulos vienen configurado con esa frecuencia, si no le funciona con dicha frecuencia, ir modificando hasta encontrar la correcta.
- En el circuito, no olvidar la conexión en común de las tierras "GND" del Arduino Mega 2560, el modulo tp4056 y el modulo sim800l.
- Cuando se disponga a subir el código a la tarjeta de Arduino Mega, tener presente que la conexión con los pines de trasmisión TX1 y RX1, deben estar desconectado para que no se tenga error por conexión, luego conectar nuevamente para las pruebas.
Códigos Fuentes Utilizados
En el siguiente enlace, puedes encontrar el repositorio con los códigos fuentes que se utilizaron en las pruebas.
0 Comentarios