--> EN CONSTRUCCIÓN <--
Envía y recibe SMS-s mediante un modem GSM
Para la realización de éste ejemplo he utilizado un modem GSM Siemens MC35 Terminal que dispone de un interfaz serie. La conexión a establecer para comunicarse con Arduino, según la data sheet, debe ser una conexión serie a 9600 bps (8 data bits, no parity,
1 stop bit, non-inverted).
Este ejemplo es válido para cualquier modem GSM que cumpla la especificación ETSI 07.05 del estándar GSM, es decir, casi todos. Se puede reutilizar el código con cualquier otro modem , bien como éste ... un terminal completo ... o solamente el módulo.
Figura 1. Modem GSM Siemens MC35 Terminal
Figura 2. Esquema de conexionado a una una placa Arduino serie.
Figura 3. Foto del montaje
Código fuente (PROVISIONAL)
/*
Envío/recepción de SMS mediante un modem GSM conectado a Arduino por el puerto serie.
Es válido para cualquier modem GSM que cumpla en estándar GSM 07.05 de la ETSI
(European Telecommunications Standards Institute). Este estándar lo implementan
casi todos los modems GSM.
http://www.3gpp.org/ftp/Specs/html-info/0705.htm
http://pda.etsi.org/pda/home.asp?wkr=RTS/SMG-040705Q7
En mi caso lo he probado con un modem SIEMENS MC35 Terminal que he conseguido.
Igor González Martín. 05-04-2007
igor.gonzalez.martin@gmail.com
*/
int ledPin = 13; // PIN de test
char respuesta[250]; // Donde almacenaremos las respuestas del modem
byte readByte=' '; // Variable donde leemos del puerto serie
int contador=0;
char mensaje[160];
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
configurarCMC("+34609090909"); // Definir CMC
messageFormat(true); // Modo TEXTO
vaciarBufferRespuesta();
vaciarMensaje();
digitalWrite(ledPin, LOW);
}
void parpadea(int num){
for (int i=0;i<num;i++){
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
}
}
void vaciarMensaje(){
for(int i=0;i<160;i++){
mensaje[i]='|';
}
}
void vaciarBufferRespuesta(){
for(int i=0;i<250;i++){
respuesta[i]='|';
}
}
void buscarTextoSMS(){
/*
Devuelve el texo del mensaje
*/
}
void configurarCMC(char* CMC){
/*
Configura el CMC a través del cual se van a remitir los SMS
MoviStar +34609090909
Orange +34?????????
Vodafone +34?????????
Ejemplo:
Comando: AT+CSCA=+34609090909
Respuesta: OK
*/
Serial.print("at+csca=");
Serial.println(CMC);
delay(1000);
}
void messageFormat(boolean formato){
/*
Elige el formato con el que vamos a trabajar
Ejemplo:
Comando: AT+CMFG=1
Respuesta: OK
*/
Serial.print("at+cmgf=");
if (formato) {
Serial.println("1"); // Modo texto
}else {
Serial.println("0"); // Modo PDU
}
delay(1000);
}
void sendSMS (char* destinatario,char textoMensaje[]){
/*
Envía un SMS al número indicado en "destinatario" con el texto
incluido en "mensaje".
Ejemplo:
Comando: AT+CMGS=609090909
Respuesta: >
Comando: "Texto a enviar"<Ctrl+Z>
Respuesta: OK
*/
Serial.print("at+cmgs=");
Serial.println(destinatario); // Destinatario
delay(100);
for (int i=0;i<160;i++){ // Texto del SMS
if (textoMensaje[i]!='|'){
Serial.print(textoMensaje[i]);
}
}
Serial.println(26,BYTE); // Escibe el Ctrl+Z
delay(1000);
}
void listSMS (int seleccion){
/*
Solicita el listado de los SMS que hay en la SIM.
Según "selección" se muestran:
0 Menssajes no leidos
1 Mensajes leidos
2 Mensajes almacenados sin enviar
3 Mensajes almacenados y enviados
4 Todos
Ejemplo 1: Hay SMS almacenados
Comando: AT+CMGL=ALL
Respuesta:
+CMGL: 1,"REC UNREAD","609090909",,"07/04/05,22:03:33+08"
Mensaje de prueba
+CMGL: 2,"REC UNREAD","609090909",,"07/04/05,22:03:35+08"
Mensaje de prueba
+CMGL: 3,"REC UNREAD","609090909",,"07/04/05,22:03:42+08"
Mensaje de prueba
OK
Ejemplo 2: No hay SMS almacenados
Comando: AT+CMGL=ALL
Respuesta: OK
*/
Serial.print("at+cmgl=");
switch (seleccion) {
case 0: Serial.println("REC UNREAD");
break;
case 1: Serial.println("REC READ");
break;
case 2: Serial.println("STO UNSENT");
break;
case 3: Serial.println("STO SENT");
break;
case 4: Serial.println("ALL");
break;
}
delay(1000);
}
void readSMS(int posicion){
/*
Solicita la lectura del mensaje en la posición indicada por "posicion"
Ejemplo 1: Hay SMS almacenados en esa posición
Comando: AT+CMGR=2
Respuesta:
+CMGR: "REC READ","609090909",,"07/04/05,22:03:35+08"
Mensaje de prueba
OK
Ejemplo 2: No hay SMS almacenados en esa posición
Comando: AT+CMGR=4
Respuesta:
+CMGR: 0,,0
OK
*/
Serial.print("at+cmgr=");
Serial.println(posicion);
delay(1000);
}
void deleteSMS(int posicion){
/*
Borra el mensaje en la posición indicada por "posicion"
Ejemplo 1: Hay SMS almacenados en esa posición
Comando: AT+CMGD=2
Respuesta:OK
Ejemplo 2: No hay SMS almacenados en esa posición
Comando: AT+CMGD=4
Respuesta: OK
*/
Serial.print("at+cmgd=");
Serial.println(posicion);
delay(1000);
}
void loop() {
/*
Es un programa muy tonto. Lee los mensajes que le llegan/tiene almacenados
la tarjeta SIM y los remite a otro número.
*/
}
Referencias
by Igor González Martín 08-04-2007