SIM800L

SIM800L With Arduino Tutorial

Introduction to SIM800L

There are so many GSM modules that came to market right now. And SIM800L almost the cheapest. It cost under 10$ and has the same feature as other. So, this module is a great one.

For SIM800L internet connection tutorial you can find it here. And for troubleshooting here.

This module works just like another module, it uses AT Command to communicate with arduino and has the same command. You can download the AT command list it uses here.

SIM800L
SIM800L

Just like another GSM module like SIM900A that we’ve wrote the tutorial here. This is of course use serial communication to communicate with arduino. So we need Tx and Rx here.

Arduino and SIM800L Wiring Diagram

arduino and SIM800L wiring diagram

arduino and SIM800L wiring diagramConnect your arduino and SIM800L like above. But this seems like to be wrong. Because in the datasheet it says that VCC must be at 4.4V maximum. But in last version of this module, it works given 5V for it’s VCC.

if it is doesn’t work for you can try to drop the VCC to not more than 4.4V. You can use buck converter, or the simplest way just use a diode. I will prefer use only a diode because it simplicity. So, wiring diagram become like below :

arduino and SIM800L wiring diagram
arduino and SIM800L wiring diagram

The Code

Sending a message:

In this example, we made two function that is SendMessage() and _readSerial(). SendMessage() to send message and _readSerial() to read the answer from SIM800L.

#include <SoftwareSerial.h>
SoftwareSerial sim(10, 11);
int _timeout;
String _buffer;
String number = "+6289668072234";

void setup() {
  delay(7000); //delay for 7 seconds to make sure the modules get the signal
  Serial.begin(9600);
  _buffer.reserve(50);
  Serial.println("Sistem Started...");
  sim.begin(9600);
  delay(1000);
}

void loop() {
  SendMessage();
  delay(10000);
}

void SendMessage()
{
  //Serial.println ("Sending Message");
  sim.println("AT+CMGF=1");    //Sets the GSM Module in Text Mode
  delay(1000);
  //Serial.println ("Set SMS Number");
  sim.println("AT+CMGS=\"" + number + "\"\r"); //Mobile phone number to send message
  delay(1000);
  String SMS = "Hello, how are you?";
  sim.println(SMS);
  delay(100);
  sim.println((char)26);// ASCII code of CTRL+Z
  delay(1000);
  _buffer = _readSerial();
}

String _readSerial() {
  _timeout = 0;
  while  (!sim.available() && _timeout < 12000  )
  {
    delay(13);
    _timeout++;
  }
  if (sim.available()) {
    return sim.readString();
  }
}

To make a call you can create another function and call that function from your loop. And this is the function :

void callNumber() {
  sim.print (F("ATD"));
  sim.print (number);
  sim.print (F(";\r\n"));
  _buffer = _readSerial();
  Serial.println(_buffer);
}

I mixed up the code to send and receive sms and make a call. Every task in a function. So it has three function, SendMessage(), ReceiveMessage() and Call(). In this code you just type in serial monitor “s” to send, “r” to receive SMS, and “c” to make a call.



#include <SoftwareSerial.h>
SoftwareSerial sim(10, 11);
int _timeout;
String _buffer;
String number = "+6282222222222"; //-> change with your number

void setup() {
  delay(7000); //delay for 7 seconds to make sure the modules get the signal
  Serial.begin(9600);
  _buffer.reserve(50);
  Serial.println("Sistem Started...");
  sim.begin(9600);
  delay(1000);
  Serial.println("Type s to send an SMS, r to receive an SMS, and c to make a call");
}

void loop() {
  if (Serial.available() > 0)
    switch (Serial.read())
    {
      case 's':
        SendMessage();
        break;
      case 'r':
        RecieveMessage();
        break;
      case 'c':
        callNumber();
        break;
    }
  if (sim.available() > 0)
    Serial.write(sim.read());
}

void SendMessage()
{
  //Serial.println ("Sending Message");
  sim.println("AT+CMGF=1");    //Sets the GSM Module in Text Mode
  delay(1000);
  //Serial.println ("Set SMS Number");
  sim.println("AT+CMGS=\"" + number + "\"\r"); //Mobile phone number to send message
  delay(1000);
  String SMS = "Hello, how are you?";
  sim.println(SMS);
  delay(100);
  sim.println((char)26);// ASCII code of CTRL+Z
  delay(1000);
  _buffer = _readSerial();
}

void RecieveMessage()
{
  Serial.println ("SIM800L Read an SMS");
  delay (1000);
  sim.println("AT+CNMI=2,2,0,0,0"); // AT Command to receive a live SMS
  delay(1000);
  Serial.write ("Unread Message done");
}

String _readSerial() {
  _timeout = 0;
  while  (!sim.available() && _timeout < 12000  )
  {
    delay(13);
    _timeout++;
  }
  if (sim.available()) {
    return sim.readString();
  }
}

void callNumber() {
  sim.print (F("ATD"));
  sim.print (number);
  sim.print (F(";\r\n"));
  _buffer = _readSerial();
  Serial.println(_buffer);
}

And that’s all the code. That is easty Isn’t it? And if you need a tutorial on how to send data over GPRS with this module, wait our next tutorial.

Watch also complete video tutorial below :

13 Replies to “SIM800L With Arduino Tutorial”

    1. are you sure that the connection is right? the TX and RX is not swapped? and the cable is good? If you are sure, then it should there is answer from the module. Because the module will respon the command.

  1. sim.println(“AT+CMGS=\”””+94718683893 “\”\r”); //Mobile phone number to send message
    While i’m compiling above cmd it gives below error

    exit status 1
    stray ‘\’ in program
    pls send how to use this command in propper way

  2. I think connecting the SIM800L to arduino 3.3v volts is not good idea, the sim800L current peaks up to 2A according to its specs.

  3. I want to check if a particular message is equal to a string like ‘hello’….. how can I do this?

  4. I m also using the same connections as yours but I have also added 1000 mfd 16 volt capacitor across VCC & ground pins of SIM800L Module , this give a trouble free startup & connectivity to the cellular network without any problem . I would like all the readers to implement the same for getting rid of connectivity problem. Hope it helps a lot.

  5. Hello, thank you for your videos, very useful. I ask you, you propose the 800L connected to the 5v of the arduino but my question is, when you send or receive an SMS or calls, the consumption of the 800l can be up to 2A I understand and this cannot damage the arduino or both boards? Also, what is the difference between the SIM800 L and the SIM900? Greetings

Leave a Reply

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