Enviar un SMS

Este programa envia un mensaje SMS desde una placa Arduino o Genuino equipada con un escudo GSM. Utilizando el monitor  serie del software de Arduino (IDE), se le introduce el número a conectar, y el mensaje de texto para enviar.

Hardware necesitado

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

    #include <GSM.h>

    Las tarjetas SIM pueden tener un número PIN que desbloquea su funcionalidad. Definir el PIN de su tarjeta SIM. Si su tarjeta SIM no tiene PIN, puede dejarlo en blanco:

    #define PINNUMBER ""

     Inicializar instancias de las clases que va a utilizar. Va a necesitar las  clases GSM y GSMVoiceCall.

    GSM gsmAccess;
    GSM_SM sms;

    En setup, abra una conexión serie al ordenador. Vamos a usar esto para enviar un número de teléfono para el Arduino. Después de abrir la conexión, enviar un mensaje al monitor serie que indica que el programa ha comenzado .: 

    void setup(){
       Serial.begin(9600);
       Serial.println("Mensaje SMS remitente");

    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 a 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 se conecte, gsmAccess () devolverá GSM_READY. Use esto como una bandera para establecer la variable notConnected a true 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("No conectado");
           delay(1000);
         }
       }

    Finalizar la configuración con un poco de información por el monitor serie.

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

Crear una función llamada readSerial de tipo int. Vamos a usar esto para recorrer la entrada del monitor serie, almacenando el número al que desea enviar un SMS, y el mensaje que va a enviar. Debe aceptar una matriz de caracteres como argumento.

int readSerial(char result[])
 {
  
Crear una variable para contar elementos del buffer serie, y comenzar un bucle while que se ejecutará de forma continua.

int i = 0;
   while(1)
   {
  
Mientras exista información disponible en el monitor serie, leer los datos en una variable llamada inChar.

while (Serial.available() > 0)
     {
       char inChar = Serial.read();
  
Si el carácter que se está leyendo es una nueva línea, terminar la matriz, borrar el búfer serie y salir de la función.

if (inChar == '\n')
       {
         result[i] = '\0';
         Serial.flush();
         return 0;
       }

Si el carácter de entrada es un carácter ASCII que no sea un retorno de carro o salto de línea, añadirlo a la matriz e incrementar del índice. Cierre el bucle while y la función.

if(inChar!='\r')
       {
         result[i] = inChar;
         i++;
       }
     }
   }
 }

En loop, crear una matriz de caracteres llamada remoteNumber para mantener el número al que desea enviar un SMS. Invocar la función readSerial que acaba de crear, y pasar remoteNumber como argumento. Cuando se ejecuta readSerial, rellenará remoteNumber con el número al que desea enviar el mensaje.

Serial.print("Introduzca un numero de movil: ");
   char remoteNumber[20];
   readSerial(remoteNumber);
   Serial.println(remoteNumber);

Crear una nueva matriz de caracteres llamada txtMsg. Esto mantendrá el contenido de su SMS. Pase txtMsg, a readSerial para rellenar la matriz.

Serial.print("Ahora, escriba el contenido del SMS: ");
   char txtMsg[200];
   readSerial(txtMsg);

Llame a sms.beginSMS () y pasarlo a remoteNumber para iniciar el envío del mensaje, sms.print () para enviar el mensaje, y sms.endSMS () para completar el proceso. Imprimir algo de información de diagnóstico y cerrar el bucle. Su mensaje está en camino!

Serial.println("ENVIANDO");
   Serial.println();
   Serial.println("Mensaje:");
   Serial.println(txtMsg);

   sms.beginSMS(remoteNumber);
   sms.print(txtMsg);
   sms.endSMS();
   Serial.println("\nCOMPLETADO!\n");
 }


Una vez que se carga el código, abrir el monitor serie. Asegúrese de que el monitor serie está configurado para enviar solamente un carácter de nueva línea de retorno. Cuando se le pida que introduzca el número al que desea llamar, introducir los dígitos y pulse return. A continuación, se le pedirá que introduzca su mensaje. Una vez que haya escrito este, pulse return de nuevo para enviarlo.

El programa completo se encuentra por debajo.


// Remitente de SMS

 // Este programa, para el escudo Arduino GSM, envía un mensaje SMS que se introduce
 // en el monitor serie. Conecte su Arduino con el escudo GSM y la tarjeta SIM, abra
 // el monitor serie, y espere que el mensaje "READY" aparezca en el monitor.
 // A continuación, escriba un mensaje a enviar y pulse  "return". Asegúrese de que
 // el monitor serie está configurado para enviar una nueva línea cuando se pulsa return.

 // Circuito:
 // * Escudo GSM
 // * Tarjeta SIM que se pueden enviar SMS

 // creado el 25 de Febrero de 2012 por Tom Igoe

 // Este ejemplo es de dominio público.

 http://www.arduino.cc/en/Tutorial/GSMExamplesSendSMS * /

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

 #define PINNUMBER ""

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

 void setup() {
   // initializa la comunicacion serie y espera que se abra el puerto:
   Serial.begin(9600);
   while (!Serial) {
     ; // espera a que el puerto este abierto. Solo necesario para el USB nativo
   }

   Serial.println("Remitente de mensaje SMS");

   // estado de la conexion
   boolean notConnected = true;

   // Inicia el escudo GSM
   // Si su tarjeta SIM tiene PIN, pasar este como parametro de begin() este comillas
   while (notConnected) {
     if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
       notConnected = false;
     } else {
       Serial.println("No conectado");
       delay(1000);
     }
   }

   Serial.println("GSM inicializado");
 }

 void loop() {

   Serial.print("Introduzca un numero de movil: ");
   char remoteNum[20];  // numero de telefono al que se envia el SMS
   readSerial(remoteNum);
   Serial.println(remoteNum);

   // sms text
   Serial.print("Ahora, escriba el contenido del SMS: ");
   char txtMsg[200];
   readSerial(txtMsg);
   Serial.println("ENVIANDO");
   Serial.println();
   Serial.println("Mensaje:");
   Serial.println(txtMsg);

   // enviar el mensaje
   sms.beginSMS(remoteNum);
   sms.print(txtMsg);
   sms.endSMS();
   Serial.println("\nCOMPLETADO!\n");
 }

 // Leer la entrada serie
 int readSerial(char result[]) {
   int i = 0;
   while (1) {
     while (Serial.available() > 0) {
       char inChar = Serial.read();
       if (inChar == '\n') {
         result[i] = '\0';
         Serial.flush();
         return 0;
       }
       if (inChar != '\r') {
         result[i] = inChar;
         i++;
       }
     }
   }
 }
  

















1 comentario: