Receive an SMS with MKR GSM 1400
Learn how to setup your board to print incoming text messages in the Serial Monitor.
Introduction
This tutorial is a continuation of the Send an SMS with MKR GSM 1400 tutorial, where you can read more about how the Global System for Mobile Communication (GSM) works. In the previous tutorial we set up the MKR GSM 1400 to send a text message to a phone, and in this tutorial, we will also see how we can receive text messages!
Goals
The goals of this project are:
- Receive an SMS using the GSM network.
- Print the message and sender in the Serial Monitor.
Hardware & Software Needed
- Arduino IDE (online or offline).
- MKRGSM library installed.
- Arduino MKR GSM 1400.
- Antenna.
- SIM card from an operator in your country.
Useful Scenarios for Receiving SMS
The use of GSM technology is gaining more and more popularity, as it is gaining more coverage around the world. Practically speaking, wherever your phone has coverage, the MKR GSM 1400 has coverage too. This of course varies depending on what type of antenna you use. But often enough, even in a remote countryside, mountain and generally desolate places, we have coverage. We might not be able to stream movies or download large files, but we are able to send and receive messages, either over Internet or through calls or text messages.
If we manage to get access to one radio tower, it means we can call or text anyone in the country we live in, and, of course, the rest of world (this may be quite expensive however). This opens up many possibilities for projects in both rural and urban areas, when we either need to be updated, or to update something but we can't physically access it.
Now, in this tutorial, we will simply see how we can use a smartphone (or regular phone) to send a text message to our MKR GSM 1400 board, and print the message in the Serial Monitor.
Circuit
Programming the Board
We will now get to the programming part of this tutorial.
1. First, let's make sure we have the drivers installed. If we are using the Web Editor, we do not need to install anything. If we are using an offline editor, we need to install it manually. This can be done by navigating to Tools > Board > Board Manager.... Here we need to look for the Arduino SAMD boards (32-bits Arm® Cortex®-M0+) and install it.
2. Now, we need to install the libraries needed. If we are using the Web Editor, there is no need to install anything. If we are using an offline editor, simply go to Tools > Manage libraries.., and search for MKRGSM and install it.
3. We can now go to File > Examples > MKRGSM > ReceiveSMS in the editor. This will open a new window, which has a sketch tab, but also a header file, called
arduino_secrets.h
. Inside this file, we need to enter our pin number between the " ". 1#define SECRET_PINNUMBER "" //enter pin code between ""
The pin number is often 1234 or 0000, but for more information, check the SIM plan that you bought.
4. Let's take a look at some of the core functions of this sketch:
- base class for all GSM functions.GSM gsmAccess
- base class for all GSM functions for SMS.GSM_SMS sms
- connects to the GSM network with the pin number as a parameter, e.g. 0123.gsmAccess.begin(pin)
- checks to see if there is a SMS messages on the SIM card to be read.sms.available()
- retrieves a sender's number.sms.remoteNumber(number, 20)
- creates an SMS for a specific number.sms.beginSMS(number);
- sends the SMS.sms.endSMS()
- deletes the message from the modem memory.sms.flush()
The sketch can also be found in the snippet below. Select the right board and port, and upload the sketch to the board.
1// include the GSM library2#include <MKRGSM.h>3
4#include "arduino_secrets.h" 5// Please enter your sensitive data in the Secret tab or arduino_secrets.h6// PIN Number7const char PINNUMBER[] = SECRET_PINNUMBER;8
9// initialize the library instances10GSM gsmAccess;11GSM_SMS sms;12
13// Array to hold the number a SMS is retrieved from14char senderNumber[20];15
16void setup() {17 // initialize serial communications and wait for port to open:18 Serial.begin(9600);19 while (!Serial) {20 ; // wait for serial port to connect. Needed for native USB port only21 }22
23 Serial.println("SMS Messages Receiver");24
25 // connection state26 bool connected = false;27
28 // Start GSM connection29 while (!connected) {30 if (gsmAccess.begin(PINNUMBER) == GSM_READY) {31 connected = true;32 } else {33 Serial.println("Not connected");34 delay(1000);35 }36 }37
38 Serial.println("GSM initialized");39 Serial.println("Waiting for messages");40}41
42void loop() {43 int c;44
45 // If there are any SMS available()46 if (sms.available()) {47 Serial.println("Message received from:");48
49 // Get remote number50 sms.remoteNumber(senderNumber, 20);51 Serial.println(senderNumber);52
53 // An example of message disposal54 // Any messages starting with # should be discarded55 if (sms.peek() == '#') {56 Serial.println("Discarded SMS");57 sms.flush();58 }59
60 // Read message bytes and print them61 while ((c = sms.read()) != -1) {62 Serial.print((char)c);63 }64
65 Serial.println("\nEND OF MESSAGE");66
67 // Delete message from modem memory68 sms.flush();69 Serial.println("MESSAGE DELETED");70 }71
72 delay(1000);73
74}
Testing It Out
After the code has successfully uploaded, we need to open the Serial Monitor to initialize the rest of the program. For these type of projects, we use the
while(!Serial)
command, so we can read any available information only after we open the Serial Monitor.After we open the Serial Monitor, the board will attempt to connect to the GSM network, and if it is successful, the following message can be seen in the Serial Monitor:
This means that we are ready to receive text messages. Now, we can open our phone, and send a text message to the number attached to your SIM card.
We can send something simple, such as:
1Hi there GSM 1400, can you read?
After we have sent the message, it should appear in the Serial Monitor after a few seconds. If it successful, we will see the following message printed:
Troubleshoot
If the code is not working, there are some common issues we can troubleshoot:
- Wrong pin number.
- SIM card lacking a data plan.
- Out of GSM network range (very unlikely in urban areas).
- Antenna not attached properly.
- We have sent the message to the wrong number.
Conclusion
In this tutorial, we have used the
ReceiveSMS
example, which allows us to receive SMS from an external device, and print it in the Serial Monitor.Feel free to explore the MKRGSM library further, and try out some of the many cool functions in this library.
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.