Recibir un SMS

Este programa espera un mensaje SMS y lo imprime en el monitor serie. Utiliza la biblioteca GSM  del escudo GSMArduino y una tarjeta SIM activa. Para hacerlo funcionar, la tarjeta SIM no necesita un plan de datos.

Hardware necesitado


  • Código
  •  
  • En primer lugar, importar la biblioteca de GSM

    #include <GSM.h>

Crear una matriz de caracteres para contener el número que está enviando el mensaje:

char remoteNumber[20];

En setup, abra una conexión serie al ordenador. Después de abrir la conexión, envíe un mensaje que indique que el programa se ha iniciado.

void setup(){
   Serial.begin(9600);
   Serial.println("Receptor de mensajes SMS");

Crear una variable local para realizar un seguimiento del estado de la conexión. Vamos a usar esto para mantener el programa funcionando hasta que la tarjeta SIM está conectada a la red:

boolean notConnected = true;

Conectarse a la red llamando gsmAccess.begin (). Se necesita el PIN de la tarjeta SIM como argumento. Al colocar esto dentro de un bucle while (), se puede comprobar continuamente el estado de la conexión. Cuando el módem conecte, gsmAccess () devolverá GSM_READY. Use esto como una bandera para establecer la variable notConnected a true o false. Una vez conectado, se ejecutará el resto de la configuración.

while(notConnected)
   {
     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
       notConnected = false;
     else
     {
       Serial.println("Not connected");
       delay(1000);
     }
   }
  
Finalizar la configuración con un poco de información al monitor serie.

Serial.println("GSM initialized.");
   Serial.println("Waiting for messages");
 }

Los mensajes SMS son recibidos por el módem. Las tarjetas SIM tienen un cierto espacio de memoria para almacenar los SMS entrantes. El número de SMS que la tarjeta puede almacenar puede ser de tan sólo 10, o tantos como 200, dependiendo de la tarjeta SIM. Usted debe consultar con su proveedor para determinar el número de mensajes que la tarjeta SIM puede guardar en la memoria.

En loop (), cree una variable de tipo char para retener temporalmente los caracteres de cualquier SMS recibido. Utilice sms.available () para comprobar la presencia de algún otro mensaje en la tarjeta SIM:

void loop()
 {
   char c;
   if (sms.available())
   {

Si un SMS está disponible, recuperar el número del remitente a distancia llamando a sms.remoteNumber (remoteNumber, 20). El argumento remoteNumber es la matriz de caracteres que declaró en el principio del programa, no puede ser más de 20 caracteres. 

Enviar este número con el monitor serie.

Serial.println("Message received from:");
     sms.remoteNumber(remoteNumber, 20);
     Serial.println(remoteNumber);
  
Es posible borrar los mensajes SMS llamando a sms.flush (). Usando sms.peek () es posible identificar el número de índice de los mensajes, lo que podría ser útil para la eliminación.

El código de abajo no eliminará nada de la SIM, pero se puede iterar a través de un bucle, o identificar un número de índice específico para eliminar, en lugar del modelo utilizado debajo de #

if(sms.peek()=='#')
     {
       Serial.println("Discarded SMS");
       sms.flush();
     }

Para leer un mensaje, utilice sms.read (). Aquí, podrá almacenar cada carácter del mensaje en la variable c e imprimirlo, ya que se puede leer.

while(c=sms.read())
       Serial.print(c);

Indicar que el mensaje está completo y retirarlo de la memoria con sms.flush ().

Serial.println("\nFIN DEL MENSAJE");  
     sms.flush();
     Serial.println("MENSAJE BORRADO");
   }

Añadir una breve demora y cerrar el bucle.

delay(1000);
 }
  
Una vez que se carga el código, abrir el monitor serie. Con un teléfono u otro servicio habilitado para SMS, enviar un SMS al número de su tarjeta SIM. Debería ver el mensaje impreso en la pantalla cuando se recibe.

El esquema completo se encuentra a continuación.


// Receptor de SMS 

// Este programa, para el escudo Arduino GSM, espera un mensaje SMS y lo muestra 
// a través del puerto serie. 

// Circuito:
// * Escudo GSM conectado  y Arduino 
// * Tarjeta SIM que pueda recibir mensajes SMS 

//creado el 25 de Febrero de 2012 por Javier Zorzano / TD 

// Este ejemplo es de dominio público. 

// http://www.arduino.cc/en/Tutorial/GSMExamplesReceiveSMS

// Incluye la biblioteca GSM
#include <GSM.h>

// Numero de PIN para la SIM
#define PINNUMBER ""

// initializa la instancia biblioteca
GSM gsmAccess;
GSM_SMS sms;

// Matriz para que contenga el número de SMS recuperado
char senderNumber[20];

void setup() {
  // inicializar las comunicaciones serie y esperar a que se abra el puerto:
  Serial.begin(9600);
  while (!Serial) {
    ; // esperar a que el puerto serie se conecte. Necesario para el puerto USB nativo solamente
  }

  Serial.println("Receptor de mensajes SMS");

  // estado de la conexion
  boolean notConnected = true;

  // Inicia la conexion GSM 
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("No conectado");
      delay(1000);
    }
  }

  Serial.println("GSM inicializado");
  Serial.println("Esperando mensajes");
}

void loop() {
  char c;

  // Si hay cualquier SMS disponible()
  if (sms.available()) {
    Serial.println("Mensaje recibido de:");

    // Obtener el numero romoto
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);

    // Un ejemplo de mensajes disponibles
    // Todos los mensajes empezando por # deben desecharse
    if (sms.peek() == '#') {
      Serial.println("SMS descartados");
      sms.flush();
    }

    // Leer los bytes del mensaje e imprimirlos
    while (c = sms.read()) {
      Serial.print(c);
    }

    Serial.println("\nFIN DEL MENSAJE");

    // Borra mensajes de la memoria del modem
    sms.flush();
    Serial.println("MENSAJE BORRADO");
  }

  delay(1000);

}




No hay comentarios:

Publicar un comentario