Recibir una llamada de voz

Este programa recibe una llamada de voz a una placa Arduino o Genuino equipada con un escudo GSM. Una vez que se recibe y se conecta la llamada, se muestra el número que está llamando, y cuelga. Tendrá que conectar un altavoz y un micrófono para escuchar la llamada conectada y transmitir su voz.

Hardware necesitado

Placa Arduino o Genuino
Micrófono y altavoz conectados al escudo GSM
Tarjeta SIM

Circuito


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;

GSMVoiceCall vcs;

Crear una matriz de caracteres para almacenar el número entrante:

char numtel[20];

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

void setup(){
   Serial.begin(9600);
   Serial.println("Recibiendo llamada de voz");


Crear una variable local para realizar un seguimiento del estado de la conexión. Vamos a usar esto para mantener el programa duncionando hasta que la tarjeta SIM este 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 se 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("No conectado");
       delay(1000);
     }
   }
  

Para asegurarse de que el módem está listo para aceptar llamadas entrantes, utilicela función hangCall():

vcs.hangCall();
  

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

Serial.println("GSM inicializado.");
   Serial.println("En espera de llamada.");
 }


En loop, utilice una instrucción switch para controlar el flujo del programa. getvoiceCallStatus () devolverá su estado cuando se le llama.
  

void loop()
 {
   switch (vcs.getvoiceCallStatus())
   {


Si getvoiceCallStatus () devuelve IDLE_CALL, no está sucediendo nada.

case IDLE_CALL:

       break;


Si getvoiceCallStatus () devuelve RECEIVINGCALL, alguien le está llamando. Utilice retrieveCallingNumber () para almacenar el número de entrada a la matriz numtel que ha creado, e imprímala en el monitor serie.


Utilice answerCall () para iniciar la conexión de voz con la persona que llama.

case RECEIVINGCALL:

       Serial.println("RECEIVING CALL");

       vcs.retrieveCallingNumber(numtel, 20);

       Serial.print("Number:");
       Serial.println(numtel);

       vcs.answerCall();        
       break;


Una vez que haya respondido a la llamada, getvoiceCallStatus () devolverá TALKING. El programa esperará un carácter de nueva línea para desencadenar hangCall () y terminar la conexión.


Cierre la sentencia switch.

case TALKING:

       Serial.println("TALKING. Enter line to interrupt.");
       while(Serial.read()!='\n')
         delay(100);
       vcs.hangCall();
       Serial.println("HANG. Waiting Call.");     
       break;
   }


Añadir un pequeño retraso antes de continuar con el bucle:

delay(1000);
 }


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.


El ptograma completo se encuentra por debajo.


// Recibir llamada de voz

 // Este programa, para el escudo Arduino GSM, recibe llamadas de voz, muestra el
 // número que llama, espera unos segundos y luego cuelga.

 // Circuito:
 // * Escudo GSM
 // * Circuito de voz. Se refiere a la guía de introducción del escudo GSM  en http://www.arduino.cc/en/Guide/ArduinoGSMShield#toc11
 // * Tarjeta SIM que puede aceptar llamadas de voz

 // Sin circuito de voz de la llamada se conectará, pero no va a enviar o
 // recibir sonido

 // creado Marzo de 2012 por Javier Zorzano

 // Este ejemplo es de dominio público.

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

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

 // Numeo de PIN
 #define PINNUMBER ""

 // initializala instancia biblioteca
 GSM gsmAccess;
 GSMVoiceCall vcs;

 // Matriz para almacenar el número de la llamada entrante
 char numtel[20];

 void setup() {
   // initializa la comunicacion serie y espera a que el puerto se abra:
   Serial.begin(9600);
   while (!Serial) {
     ; // espera a que elpuerto se conecta. Solo necsario pata el puerto USB nativo
   }

   Serial.println("Recibe llamada de voz");

   // estado de la conexion
   boolean notConnected = true;

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

   // Esto hace que el módem informe correctamente de los eventos entrantes
   vcs.hangCall();

   Serial.println("Espèrando una llamada");
 }

 void loop() {
   // Comprueba el estado de la llamada de xoz
   switch (vcs.getvoiceCallStatus()) {
     case IDLE_CALL: // Nada sucede

       break;

     case RECEIVINGCALL: // ¡Sí! Alguien nos está llamando

       Serial.println("RECIBIENDO LLAMADA");

       // Recupera el numero que llama
       vcs.retrieveCallingNumber(numtel, 20);

       // Imprime el numero que llama
       Serial.print("Number:");
       Serial.println(numtel);

       // Responder a la llamada, establecer la llamada
       vcs.answerCall();
       break;

     case TALKING:  // En este caso se establecerá la llamada

       Serial.println("HABLANDO. Pulsar enter para colgar.");
       while (Serial.read() != '\n') {
         delay(100);
       }
       vcs.hangCall();
       Serial.println("Colgar y esperar a la siguiente llamada.");
       break;
   }
   delay(1000);
 }
  

2 comentarios:

  1. Como puedo hacer para que al momento que el sim900 tome la llamada, me envíe un sonido o audio,(operadora).

    ResponderEliminar