Make Voice Call
Get your shield to make phone calls from the Serial Monitor.
This sketch connects a voice call from your GSM shield and Arduino 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.
Hardware Required
- Arduino Board 
- Microphone and speaker attached to the GSM shield 
- SIM card 
Circuit
 
  
    
    
Code
First, import the GSM library
#include <GSM.h>SIM cards may have a PIN number that unlocks their functionality. Define the PIN for your SIM. If your SIM has no PIN, you can leave it blank :
#define PINNUMBER ""Initialize instances of the classes you're going to use. You're going to need both the GSM and GSMVoiceCall class.
1GSM gsmAccess;2
3GSMVoiceCall vcs;Create some variables to store the phone number you want to call :
1String remoteNumber = "";2char charbuffer[20];In
setup1void setup(){2
3  Serial.begin(9600);4
5  Serial.println("Make Voice Call");Create a local variable to track the connection status. You'll use this to keep the sketch from starting until the SIM is connected to the network :
1boolean notConnected = true;Connect to the network by calling
gsmAccess.begin()while()gsmAccess()GSM_READYnotConnectedtruefalsesetup1while(notConnected)2
3  {4
5    if(gsmAccess.begin(PINNUMBER)==GSM_READY)6
7      notConnected = false;8
9    else10
11    {12
13      Serial.println("Not connected");14
15      delay(1000);16
17    }18
19  }Finish
setup1Serial.println("GSM initialized.");2
3  Serial.println("Enter phone number to call.");4}The
loopFirst, check the serial buffer to see if there is any information waiting to be read. If there is, store it in a local variable :
1void loop()2{3
4  while (Serial.available() > 0)5
6  {7
8    char inChar = Serial.read();If the buffer holds a newline character, check to see if the number entered is less than 20 digits long (theoretically, you'll never be able to dial a number with more digits than that).
1if (inChar == '\n')2
3    {4
5      if (remoteNumber.length() < 20)6
7      {Print out the number you're calling to the serial monitor.
1Serial.print("Calling to : ");2
3        Serial.println(remoteNumber);4
5        Serial.println();The number to call will be been stored in the String named
remoteNumbervoiceCall()charcharbufferremoteNumber.toCharArray(charbuffer, 20);To place the call, use
vcs.voiceCall()voiceCall()1getvoiceCallStatus()To disconnect your call, send a newline character to trigger
hangCall()1if(vcs.voiceCall(charbuffer))2
3        {4
5          Serial.println("Call Established. Enter line to end");6
7          while(Serial.read()!='\n' && (vcs.getvoiceCallStatus()==TALKING));8
9          vcs.hangCall();10
11        }Once the call has been completed, clear the variable that stored the phone number :
1Serial.println("Call Finished");2
3        remoteNumber="";4
5        Serial.println("Enter phone number to call.");6
7      }If the number you entered in the serial monitor is longer than 20 digits, clear the
remoteNumber1else2
3      {4
5        Serial.println("That's too long for a phone number. I'm forgetting it");6
7        remoteNumber = "";8
9      }10
11    }When reading information from the serial monitor, if the incoming character is not a newline or carriage return, add it to the
remoteNumberloop1else2
3    {4
5      // add the latest character to the message to send:6
7      if(inChar!='\r')8
9        remoteNumber += inChar;10
11    }12
13  }14}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.
Complete Sketch
The complete sketch is below.
1/*2
3 Make Voice Call4
5 This sketch, for the Arduino GSM shield, puts a voice call to6
7 a remote phone number that you enter through the serial monitor.8
9 To make it work, open the serial monitor, and when you see the10
11 READY message, type a phone number. Make sure the serial monitor12
13 is set to send a just newline when you press return.14
15 Circuit:16
17 * GSM shield18
19 * Voice circuit.20
21 With no voice circuit the call will send nor receive any sound22
23 created Mar 201224
25 by Javier Zorzano26
27 This example is in the public domain.28
29 */30
31// libraries32#include <GSM.h>33
34// PIN Number35#define PINNUMBER ""36
37// initialize the library instance38
39GSM gsmAccess; // include a 'true' parameter for debug enabled40
41GSMVoiceCall vcs;42
43String remoteNumber = "";  // the number you will call44char charbuffer[20];45
46void setup() {47
48  // initialize serial communications and wait for port to open:49
50  Serial.begin(9600);51
52  while (!Serial) {53
54    ; // wait for serial port to connect. Needed for native USB port only55
56  }57
58  Serial.println("Make Voice Call");59
60  // connection state61
62  bool notConnected = true;63
64  // Start GSM shield65
66  // If your SIM has PIN, pass it as a parameter of begin() in quotes67
68  while (notConnected) {69
70    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {71
72      notConnected = false;73
74    } else {75
76      Serial.println("Not connected");77
78      delay(1000);79
80    }81
82  }83
84  Serial.println("GSM initialized.");85
86  Serial.println("Enter phone number to call.");87
88}89
90void loop() {91
92  // add any incoming characters to the String:93
94  while (Serial.available() > 0) {95
96    char inChar = Serial.read();97
98    // if it's a newline, that means you should make the call:99
100    if (inChar == '\n') {101
102      // make sure the phone number is not too long:103
104      if (remoteNumber.length() < 20) {105
106        // let the user know you're calling:107
108        Serial.print("Calling to : ");109
110        Serial.println(remoteNumber);111
112        Serial.println();113
114        // Call the remote number115
116        remoteNumber.toCharArray(charbuffer, 20);117
118        // Check if the receiving end has picked up the call119
120        if (vcs.voiceCall(charbuffer)) {121
122          Serial.println("Call Established. Enter line to end");123
124          // Wait for some input from the line125
126          while (Serial.read() != '\n' && (vcs.getvoiceCallStatus() == TALKING));127
128          // And hang up129
130          vcs.hangCall();131
132        }133
134        Serial.println("Call Finished");135
136        remoteNumber = "";137
138        Serial.println("Enter phone number to call.");139
140      } else {141
142        Serial.println("That's too long for a phone number. I'm forgetting it");143
144        remoteNumber = "";145
146      }147
148    } else {149
150      // add the latest character to the message to send:151
152      if (inChar != '\r') {153
154        remoteNumber += inChar;155
156      }157
158    }159
160  }161}Last revision 2018/08/23 by SM
Suggest changes
The content on docs.arduino.cc is facilitated through a public GitHub repository. If you see anything wrong, you can edit this page here.
License
The Arduino documentation is licensed under the Creative Commons Attribution-Share Alike 4.0 license.