Examples > GSM library

GSM Xively Client String

This example shows you how to answer a HTTP request using a GSM shield attached to an Arduino. Specifically, it connects to xively.com, a free datalogging site and sends data as a string. The example requires that you set up a xively.com account, as well as a xively feed (for more information on setting up an input feed, please click here). Your GSM shield will then connect to that feed and upload sensor data.

To use a data connection with the GSM shield, you'll need your provider's Access Point Name (APN), login, and password. To obtain this information, contact the network provider for the most up to date information. This page has some information about various carrier settings, but it may not be current.

Hardware Required

  • Arduino board
  • Arduino + Telefonica GSM/GPRS Shield
  • SIM card with a data connection
  • Analog sensors attached to A0 and A1

Software Required


image of the Arduino GSM Shield on top of an Arduino Uno

First, import the GSM library

#include <GSM.h>

Declare the various settings for your xively account; your API key, feed ID, and project name (the user agent).

#define APIKEY         "YOUR API KEY GOES HERE"  
#define FEEDID         00000    
#define USERAGENT      "My Project"

SIM cards may have a PIN number that enables their functionality. Define the PIN for your SIM. If your SIM has no PIN, you can leave it blank :

#define PINNUMBER ""

Define a number of constants that contain information about the GPRS network you're going to connect to. You'll need the Access Point Name (APN), login, and password. To obtain this information, contact your network provider for the most up to date information. This page has some information about various carrier settings, but it may not be current.

#define GPRS_APN       "GPRS_APN"
#define GPRS_LOGIN     "login"
#define GPRS_PASSWORD  "password"

Initialize instances of the classes you're going to use. You're going to need the GSM, GPRS, GSMServer, and GSMClient classes.

GSMClient client;
GPRS gprs;
GSM gsmAccess;

Create some variables to store information you're going to need in the sketch; a char array to hold the URL, and some variables for setting timing intervals.

char server[] = "api.xively.com";

unsigned long lastConnectionTime = 0;
boolean lastConnected = false;
const unsigned long postingInterval = 10*1000;

In setup, open a serial connection to the computer.

void setup(){

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 :

boolean notConnected = true;

Connect to the network by calling gsmAccess.begin(). It takes the SIM card's PIN as an argument. You'll also connect to the GPRS network using gprs.attachGPRS(). This requires the APN, login, and password you declared earlier. By placing this inside a while() loop, you can continually check the status of the connection and wait for them to both become true before proceeding.

When the modem does connect and has attached itself to the GPRS network, gsmAccess() will return GSM_READY. Use this as a flag to set the notConnected variable to true or false. Once connected, sned a status message to the serial monitor and close setup.

      notConnected = false;
      Serial.println("Not connected");
  Serial.println("Connected to GPRS network");

You're going to use a custom function to make the HTTP connection to the server and send any data. Declare a function named sendData() that accepts a String as an argument.

void sendData(String thisData)

Check to see if there is a successful connection to the server

if (client.connect(server, 80))

When connected, send a HTTP PUT request with the information about your feed. length() will return the length of the data you're sending.

client.print("PUT /v2/feeds/");
    client.println(".csv HTTP/1.1");
    client.print("Host: api.xively.com\n");
    client.print("X-ApiKey: ");
    client.print("User-Agent: ");
    client.print("Content-Length: ");

Once the length has been sent, pass on the last pieces of the PUT request, and the data to the server.

    client.print("Content-Type: text/csv\n");
    client.println("Connection: close\n");


If the connection attempt was not successful, send a status message to the serial monitor, and disconnect from the server.

    Serial.println("connection failed");

Update the time that the last connection, or attempt, happened before closing the function.

lastConnectionTime = millis();

Inside loop, read the value from A0 and store it in a local variable

void loop(){
  int sensorReading = analogRead(A0);

Convert the data to a string and prefix it with "sensor1, "

String dataString = "sensor1,";
  dataString += sensorReading;

If your xively feed is set up to handle multiple values, you can append multiple readings to the the String. Read the value on A1 and add it to the String as "sensor2".

int otherSensorReading = analogRead(A1);
  dataString += "\nsensor2,";
  dataString += otherSensorReading;

If there are bytes available, read them and send them to the serial port.

if (client.available())
     char c = client.read();

Check for an active network connection. If there isn't one, but there was one last time through loop(), then stop the client:

if (!client.connected() && lastConnected)

If there is no connection, and ten seconds have passed since the last connection, or connection attempt, then connect again and send data

if(!client.connected() && ((millis() - lastConnectionTime) > postingInterval))

Store the state of the connection for next time through loop() and close it up.

lastConnected = client.connected();

Once your code is uploaded, open the serial monitor for debugging, and check your xively.com feed to see updates.

SORRY, There is an error at our code repository, please inform to web@arduino.cc

See Also: