The SIM800L is one of the most versatile and affordable GSM/GPRS modules available, and pairing it with Arduino opens up a world of IoT possibilities — from SMS-based security alerts and remote sensor monitoring to automated calling systems and GPRS data uploads. However, the SIM800L has a notorious reputation for being difficult to get working, mainly due to power supply issues that trip up most beginners. This guide covers everything from correct wiring and power supply to AT command mastery, with tested code for sending SMS and making calls.
Table of Contents
- SIM800L Module Overview and Variants
- Power Supply: The #1 Reason SIM800L Fails
- Wiring SIM800L to Arduino
- AT Command Basics and Essential Commands
- Sending SMS with Arduino Code
- Making and Receiving Phone Calls
- GPRS Data: HTTP POST to a Server
- Frequently Asked Questions
SIM800L Module Overview and Variants
The SIM800L from SIMCom is a quad-band GSM/GPRS module operating on 850/900/1800/1900 MHz — covering all Indian cellular bands used by Jio, Airtel, BSNL, and Vi. It supports:
- Voice calls — make and receive GSM calls
- SMS — send and receive text messages (PDU and text mode)
- GPRS Class 10 — data upload/download at up to 85.6 kbps
- AT command interface — control over serial UART at 9600 bps default
You will typically encounter the SIM800L on a small breakout PCB with a micro-SIM slot. Some variants have a built-in charging circuit for a lithium battery backup. There are also the SIM800C (ceramic antenna), SIM800H (HVQFN package), and the larger SIM800 (full module with more I/O). For most Arduino projects, the common SIM800L breakout is perfect.
Indian SIM card note: Use an active 2G/GPRS SIM. Jio does not support 2G — use Airtel or Vi/BSNL for SIM800L. Airtel prepaid with a data pack works reliably for GPRS.
Power Supply: The #1 Reason SIM800L Fails
The SIM800L requires a supply voltage of 3.4V to 4.4V — NOT 5V and NOT 3.3V. Many beginners connect it to the Arduino’s 5V pin and wonder why it burns out, or to the 3.3V pin and wonder why it resets constantly. The 3.3V issue is the most common: the Arduino Uno’s on-board 3.3V regulator can only supply about 50 mA, while the SIM800L can draw up to 2A peak during GSM transmission bursts.
Correct Power Supply Options
Option 1: 18650 Li-Ion Cell (Best for prototyping)
A single 18650 lithium cell provides 3.7V nominal, 4.2V fully charged — perfectly within SIM800L’s range. This is the most reliable approach and eliminates supply noise issues. A TP4056 charging module lets you charge over USB.
Option 2: LM2596 Buck Converter from 9-12V Supply
Step down your wall adapter to 4.0V using an adjustable buck converter. Set the output to 4.0V with a multimeter before connecting the SIM800L. Add a 1000 µF capacitor across the SIM800L VCC–GND pins to handle current spikes.
Option 3: 4 x AA Alkaline Batteries
4 AA cells give 6V fresh — too high. Use 3 AA for 4.5V with a Schottky diode drop (0.3V) to get to ~4.2V. This is acceptable for testing but the voltage sags under load as batteries discharge.
Capacitor Recommendation
Always place a 1000 µF electrolytic capacitor (rated 10V+) across the SIM800L’s VCC and GND pins, as physically close to the module as possible. The GSM transmission burst draws 2A for ~1 ms — without local capacitance, this spike collapses the supply voltage and causes the module to reset.
Wiring SIM800L to Arduino
The SIM800L communicates via UART. Its TX/RX pins are 2.8V logic — connecting directly to the Arduino Uno’s 5V UART requires a voltage divider on the Arduino TX → SIM800L RX line (SIM800L TX → Arduino RX is safe since 2.8V is interpreted as HIGH by the 5V Arduino).
| SIM800L Pin | Arduino Connection | Notes |
|---|---|---|
| VCC | 4.0V (dedicated supply) | NOT Arduino 5V or 3.3V |
| GND | GND (common with Arduino) | Must share ground |
| TXD | Arduino D10 (RX software) | Direct connection is fine |
| RXD | Arduino D11 via divider | 1kΩ + 2kΩ voltage divider |
| RST | Arduino D9 (optional) | For programmatic reset |
Voltage divider for 5V → 2.8V: use 1kΩ from Arduino TX to SIM800L RX, and 2kΩ from SIM800L RX to GND. This gives (2/3) × 5V ≈ 3.3V — slightly above SIM800L’s 2.8V max but within the 0.3V tolerance of most modules.
Antenna: The SIM800L has a U.FL/IPEX antenna connector. Always connect an antenna before powering — operating without an antenna damages the RF frontend. Most modules come with a small spring antenna; for better reception in weak-signal areas, use a proper GSM stub antenna.
AT Command Basics and Essential Commands
All SIM800L functions are controlled through Hayes AT commands — a text-based protocol where every command starts with “AT” and ends with a carriage return (rn). The module responds with OK, ERROR, or data.
Essential AT Commands
| Command | Response | Purpose |
|---|---|---|
AT |
OK | Test connection |
ATI |
SIM800 R14.18 | Module firmware version |
AT+CPIN? |
+CPIN: READY | SIM card status |
AT+CSQ |
+CSQ: 18,0 | Signal quality (0-31, higher=better) |
AT+CREG? |
+CREG: 0,1 | Network registration (1=registered) |
AT+COPS? |
+COPS: 0,0,”Airtel” | Current network operator |
AT+CMGF=1 |
OK | Set SMS text mode |
Always verify the sequence: AT → OK, then AT+CPIN? → READY, then AT+CREG? → 1 (registered), before attempting SMS or calls. If any step fails, the later ones will also fail.
Sending SMS with Arduino Code
Use SoftwareSerial to communicate with SIM800L on pins 10/11, keeping the hardware Serial (pins 0/1) free for debugging:
#include <SoftwareSerial.h>
// SIM800L on pins 10 (RX from SIM) and 11 (TX to SIM via voltage divider)
SoftwareSerial sim800(10, 11);
void setup() {
Serial.begin(9600); // Debug monitor
sim800.begin(9600); // SIM800L default baud
delay(3000); // Wait for SIM800L to boot and register
Serial.println("Initializing SIM800L...");
sim800.println("AT"); // Test
delay(500); printResponse();
sim800.println("AT+CPIN?"); // Check SIM
delay(500); printResponse();
sim800.println("AT+CREG?"); // Check registration
delay(1000); printResponse();
sim800.println("AT+CSQ"); // Signal quality
delay(500); printResponse();
}
void sendSMS(String number, String message) {
Serial.print("Sending SMS to ");
Serial.println(number);
sim800.println("AT+CMGF=1"); // Text mode
delay(500);
sim800.print("AT+CMGS="");
sim800.print(number); // e.g. "+919876543210"
sim800.println(""");
delay(500);
sim800.print(message); // SMS body
delay(200);
sim800.write(26); // Ctrl+Z = send SMS
delay(5000); // Wait up to 5s for network
printResponse();
}
void loop() {
// Send a test SMS every 30 seconds
sendSMS("+919876543210", "Hello from Arduino SIM800L!");
delay(30000);
}
void printResponse() {
while (sim800.available()) {
Serial.write(sim800.read());
}
Serial.println();
}
Phone number format: Always use international format with + prefix — +919876543210 for an Indian number (91 is India’s country code).
Making and Receiving Phone Calls
Making a voice call is simpler than SMS — just one AT command:
void makeCall(String number) {
Serial.println("Calling...");
sim800.print("ATD");
sim800.print(number); // e.g. "+919876543210"
sim800.println(";"); // Semicolon = voice call (not data)
delay(20000); // Let it ring for 20 seconds
sim800.println("ATH"); // Hang up
delay(1000);
}
void hangUp() {
sim800.println("ATH");
delay(500);
}
// To detect incoming calls, monitor for RING in the serial buffer:
void checkIncoming() {
if (sim800.available()) {
String response = sim800.readString();
if (response.indexOf("RING") != -1) {
Serial.println("Incoming call!");
sim800.println("ATA"); // Answer
// Or sim800.println("ATH"); to reject
}
}
}
Note that SIM800L has a built-in audio codec and SPKP/SPKN (speaker) and MICP/MICN (microphone) pins for actual audio, but most breakout modules do not expose these conveniently. For voice projects, look for modules with audio connectors or use the SIM800L EVB (evaluation board).
GPRS Data: HTTP POST to a Server
GPRS data is the SIM800L’s most powerful feature for IoT — sending sensor data to a cloud server without WiFi infrastructure. Here is the essential AT command sequence for an HTTP POST:
void sendHTTPPost(float temperature, float humidity) {
// 1. Set bearer profile (GPRS)
sim800.println("AT+SAPBR=3,1,"CONTYPE","GPRS"");
delay(500);
sim800.println("AT+SAPBR=3,1,"APN","airtelgprs.com""); // Airtel APN
delay(500);
sim800.println("AT+SAPBR=1,1"); // Open bearer
delay(3000);
// 2. Initialize HTTP service
sim800.println("AT+HTTPINIT");
delay(500);
sim800.println("AT+HTTPPARA="CID",1");
delay(500);
sim800.println("AT+HTTPPARA="URL","http://yourserver.com/api/data"");
delay(500);
sim800.println("AT+HTTPPARA="CONTENT","application/json"");
delay(500);
// 3. POST data
String json = "{"temp":" + String(temperature) + ","hum":" + String(humidity) + "}";
sim800.println("AT+HTTPDATA=" + String(json.length()) + ",10000");
delay(2000);
sim800.print(json);
delay(2000);
sim800.println("AT+HTTPACTION=1"); // POST
delay(5000);
// 4. Cleanup
sim800.println("AT+HTTPTERM");
delay(500);
sim800.println("AT+SAPBR=0,1"); // Close bearer
delay(500);
}
Indian APN settings: Airtel: airtelgprs.com, Vodafone/Vi: www, BSNL: bsnlnet. No username/password required for most prepaid plans.
Frequently Asked Questions
My SIM800L keeps restarting — LED blinks rapidly. What is wrong?
This is almost always a power supply issue. The module is not getting enough current during GSM transmission bursts. Add a 1000 µF capacitor directly across VCC and GND on the module. Ensure your supply can deliver at least 2A peak — most phone chargers and Arduino USB connections cannot. Use a dedicated 4V supply (Li-Ion cell or buck converter from 12V adapter).
I get OK for AT but ERROR for AT+CMGS — why?
Several possible causes: (1) The SIM card is not registered — check AT+CREG? for status 1 or 5; (2) Signal is too weak — AT+CSQ should return at least 10 for reliable SMS; (3) You forgot AT+CMGF=1 to set text mode before AT+CMGS; (4) The SIM has insufficient balance for SMS — top up and try again.
Does SIM800L work with Jio SIM?
No. Jio is a VoLTE-only network operating exclusively on 4G. The SIM800L supports only 2G GSM/GPRS. Jio has completely shut down 2G in India. Use Airtel or Vi (Vodafone Idea) prepaid SIMs which still maintain 2G/GPRS infrastructure nationwide.
Can I use SIM800L with a 3.3V Arduino (like Nano 33)?
Yes — in fact it is simpler because 3.3V Arduino TX → SIM800L RX is a direct connection (no voltage divider needed). The power supply requirement (4.0V) is separate from the logic voltage — use a dedicated supply for SIM800L VCC regardless of which Arduino you use, sharing only the ground.
How do I read incoming SMS messages?
Send AT+CMGF=1 (text mode), then AT+CNMI=1,2,0,0,0 to enable automatic notification — new SMS will appear on the serial port automatically as +CMT: "+91xxxx","","date" followed by the message text. Alternatively, AT+CMGL="ALL" lists all stored messages.
Build your next IoT project with the right components — explore Arduino boards and modules at Zbotic.in, shipped fast across India including Mumbai, Pune, Hyderabad, Chennai, and all major cities.
Add comment