--> 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