Home / Tutorials / Arduino Tutorial / Using the SIM900A GSM Module with the Arduino

Using the SIM900A GSM Module with the Arduino

The SIM900A is another module from SIMCOM popularly used as a GSM shield for sending and receiving SMS. I’ve already covered the SIM800L, now let’s look at the SIM900A breakout board.

The SIM900A Breakout Board

Similar to the SIM800L module, the SIM900A breakout board has eight pinouts. They don’t have labels so allow me to provide them for you:

SIM900A Breakout Board with Annotations
The primary difference between the SIM900A and the SIM800L is that this board doesn’t have Bluetooth and FM support. But the AT command set for both are identical which means we can use the same library!

The SIM900A breakout board has a 5V and a 4.2V version. Mine is the 5V version with the “V5.1” print near the VCC pin. This version can be powered by a 4.5 V to 5.5 V source. There’s no information on what the 4.2V version looks like. I will update this post once the information is found.

Arduino Connection

The module has 3.3V TTL levels which means connecting its Rx pin directly to an Arduino’s Tx pin is a no-no. Here’s a diagram you can use to connect the breakout board to an Arduino UNO:

SIM900A to Arduino wiring diagram
We can then use the same sketches we used in the SIM800L tutorial.

Sending SMS

For the sketch explanation, refer to the SIM800L article.

#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"

#define FONA_RX 2
#define FONA_TX 3
#define FONA_RST 4

char replybuffer[255];

SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);

void setup() {
    while (!Serial);
    Serial.begin(115200);
    Serial.println(F("FONA basic test"));
    Serial.println(F("Initializing....(May take 3 seconds)"));
    fonaSS.begin(4800); 
    if (! fona.begin(fonaSS)) { 
        Serial.println(F("Couldn't find FONA"));
    while (1);
    }
    Serial.println(F("FONA is OK"));

    char sendto[21], message[141];
    flushSerial();
    Serial.print(F("Send to #"));
    readline(sendto, 20);
    Serial.println(sendto);
    Serial.print(F("Type out one-line message (140 char): "));
    readline(message, 140);
    Serial.println(message);
    if (!fona.sendSMS(sendto, message)) {
    Serial.println(F("Failed"));
    } else {
        Serial.println(F("Sent!"));
    }
}

void loop() {}

void flushSerial() {
    while (Serial.available()) 
    Serial.read();
}

uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
    uint16_t buffidx = 0;
    boolean timeoutvalid = true;
    if (timeout == 0) timeoutvalid = false;

    while (true) {
        if (buffidx > maxbuff) {
        break;
    }

    while(Serial.available()) {
        char c = Serial.read();

        if (c == '\r') continue;
        if (c == 0xA) {
            if (buffidx == 0) // the first 0x0A is ignored
            continue;

            timeout = 0; // the second 0x0A is the end of the line
            timeoutvalid = true;
            break;
        }
        buff[buffidx] = c;
        buffidx++;
        }

    if (timeoutvalid && timeout == 0) {
        break;
    }
    delay(1);
  }
  buff[buffidx] = 0; // null term
  return buffidx;
}
[the_ad id=”3059″]

Reading SMS

#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"

#define FONA_RX 2
#define FONA_TX 3
#define FONA_RST 4

char replybuffer[255];

SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);

void setup() {
    while (!Serial);
    Serial.begin(115200);
    Serial.println(F("FONA basic test"));
    Serial.println(F("Initializing....(May take 3 seconds)"));
    fonaSS.begin(4800); 
    if (! fona.begin(fonaSS)) { 
        Serial.println(F("Couldn't find FONA"));
        while (1);
    }
    Serial.println(F("FONA is OK"));

    char sendto[21], message[141];
    flushSerial();
    Serial.print(F("Read #"));
    uint8_t smsn = readnumber();
    Serial.print(F("\n\rReading SMS #")); Serial.println(smsn);

    // Retrieve SMS sender address/phone number.
    if (! fona.getSMSSender(smsn, replybuffer, 250)) {
        Serial.println("Failed!");
        break;
    }
    Serial.print(F("FROM: ")); Serial.println(replybuffer);

    // Retrieve SMS value.
    uint16_t smslen;
    if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
        Serial.println("Failed!");
        break;
    }
    Serial.print(F("***** SMS #")); Serial.print(smsn); 
    Serial.print(" ("); Serial.print(smslen); Serial.println(F(") bytes *****"));
    Serial.println(replybuffer);
    Serial.println(F("*****"));
}

void loop() {}

void flushSerial() {
    while (Serial.available()) 
    Serial.read();
}

uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
    uint16_t buffidx = 0;
    boolean timeoutvalid = true;
    if (timeout == 0) timeoutvalid = false;

    while (true) {
        if (buffidx > maxbuff) {
        break;
    }

    while(Serial.available()) {
        char c = Serial.read();

        if (c == '\r') continue;
        if (c == 0xA) {
        if (buffidx == 0) // the first 0x0A is ignored
        continue;

        timeout = 0; // the second 0x0A is the end of the line
        timeoutvalid = true;
        break;
    }
    buff[buffidx] = c;
    buffidx++;
  }
  if (timeoutvalid && timeout == 0) {
     break;
  }
  delay(1);
  }
 buff[buffidx] = 0; // null term
 return buffidx;
}

char readBlocking() {
    while (!Serial.available());
    return Serial.read();
}

uint16_t readnumber() {
    uint16_t x = 0;
    char c;
    while (! isdigit(c = readBlocking())) {;} 

    Serial.print(c); 
    x = c - '0';
    while (isdigit(c = readBlocking())) {
        Serial.print(c);
        x *= 10;
        x += c - '0';
    }
return x;
}

For making and receiving a call, attach the positive terminal of a speaker on the SPEAKER pin and the negative terminal to the GND pin. You can then use the same sketch used with the SIM800L.

About Roland Pelayo

Roland Pelayo started TMM in 2015. He is a firmware engineer who has over ten years of experience in developing electronic and microcontroller-based systems. Roland's designs include medical devices, security and automation, robots, emergency alert systems, and educational training modules.   Have something that you like Roland to write about here? or do you need consultation for microcontroller firmware projects? just contact him via the contact page.

Check Also

arduino NPK sensor wiring diagram

Using an NPK Sensor with Arduino

We’ve featured in a previous project how we can make a “plant” send messages when …

3 comments

  1. How come no external power source is required? What’s the current draw of the SIM900A module?

  2. mehboob ur rehman

    what will be the value of resistors?

Leave a Reply

Your email address will not be published. Required fields are marked *