Make Voice Call

This sketch connects a voice call from your GSM shield and Arduino or Genuino to a remote phone number entered through the serial monitor. You'll need to attach a speaker and microphone to hear the connected phone and transmit your voice.

In setup, open a serial connection to the computer. You'll use this to send a phone number to the Arduino. After opening the connection, send a message to the Serial Monitor indicating the sketch has started.

Connect to the network by calling gsmAccess.begin(). It takes the SIM card's PIN as an argument. By placing this inside a while() loop, you can continually check the status of the connection. When the modem does connect, gsmAccess() will return GSM_READY. Use this as a flag to set the notConnected variable to true or false. Once connected, the remainder of setup will run.

The number to call will be been stored in the String named remoteNumber. The voiceCall() function requires a char array. Copy the string to the array named charbuffer.

remoteNumber.toCharArray(charbuffer, 20);

To place the call, use vcs.voiceCall(), passing it the number you wish to reach. voiceCall() returns the status of the call; a 1 means it is connected. You can check the status of the connection with getvoiceCallStatus().

To disconnect your call, send a newline character to trigger hangCall().

Once your code is uploaded, open the serial monitor. Once you see the message "Enter phone number to call", type a phone number and press "return". Make sure the serial monitor is set to only send a newline character on return.

The complete sketch is below.

/*
Make Voice Call

This sketch, for the Arduino GSM shield, puts a voice call to
a remote phone number that you enter through the serial monitor.
To make it work, open the serial monitor, and when you see the
READY message, type a phone number. Make sure the serial monitor
is set to send a just newline when you press return.

// Start GSM shield// If your SIM has PIN, pass it as a parameter of begin() in quoteswhile(notConnected){if(gsmAccess.begin(PINNUMBER)== GSM_READY){
notConnected =false;}else{Serial.println("Not connected");delay(1000);}}

Serial.println("GSM initialized.");Serial.println("Enter phone number to call.");

}

voidloop(){

// add any incoming characters to the String:while(Serial.available()>0){char inChar =Serial.read();// if it's a newline, that means you should make the call:if(inChar =='\n'){// make sure the phone number is not too long:if(remoteNumber.length()<20){// let the user know you're calling:Serial.print("Calling to : ");Serial.println(remoteNumber);Serial.println();

// Call the remote number
remoteNumber.toCharArray(charbuffer,20);

// Check if the receiving end has picked up the callif(vcs.voiceCall(charbuffer)){Serial.println("Call Established. Enter line to end");// Wait for some input from the linewhile(Serial.read()!='\n'&&(vcs.getvoiceCallStatus()== TALKING));// And hang up
vcs.hangCall();}Serial.println("Call Finished");
remoteNumber ="";Serial.println("Enter phone number to call.");}else{Serial.println("That's too long for a phone number. I'm forgetting it");
remoteNumber ="";}}else{// add the latest character to the message to send:if(inChar !='\r'){
remoteNumber += inChar;}}}}