Blog

SIM800L GSM/GPRS Module – Complete Guide

GSM/GPRS Module

SIM800L GSM/GPRS Module

Cellular Calls, SMS & Data via AT Commands

The SIM800L is a complete cellular modem on a small breakout board - it takes a standard SIM card (usually via a micro/nano adapter) and gives your microcontroller access to the cellular network for voice calls, SMS text messages, and GPRS data, all controlled through a plain UART serial connection using AT commands, the same standardized command language modems have used since the dial-up era. That means adding cellular connectivity to a project doesn't require implementing any of the actual radio or cellular protocol stack yourself - the SIM800L chip handles registering onto the network, authentication, and the low-level radio work internally, and your code just sends text commands like ”send this SMS to this number” and waits for a response. The single biggest practical challenge with this module isn't the AT commands themselves but power: during a 2G transmission burst the module can briefly pull current spikes up to around 2A, far beyond what most microcontroller 5V regulators or USB ports can supply cleanly - which is the source of the vast majority of ”it just resets” or ”won't register on the network” problems people run into.

2G GSM/GPRS
Network
AT Commands
Control
~2A peak
Current Spike

Key features

Voice, SMS & GPRS Data

Full cellular connectivity, not just text messaging.

AT Command Control

A standard, well-documented command set over UART.

Quad-Band GSM

Works across the common global 850/900/1800/1900MHz bands.

Compact Form Factor

Small enough to embed directly into portable and wearable projects.

SIM Card Slot Onboard

A standard SIM card holder is built directly into the module.

Network Status LED

Blink pattern indicates searching versus registered-on-network state.

Technical specifications

Supply Voltage 3.4V – 4.4V (NOT 5V - needs a dedicated regulated supply)
Peak Current Draw Up to ~2A during transmission bursts
Network Quad-band GSM/GPRS (850/900/1800/1900 MHz)
Interface UART (default 9600–115200 baud, AT commands)
SIM Type Standard SIM (via onboard slot; adapter for micro/nano SIM)
Logic Level 3.3V (TX/RX not directly 5V tolerant)
Functions Voice calls, SMS, GPRS data
Antenna External antenna via IPEX/uFL connector (required)
Package Breakout module with SIM800L chip and SIM holder

Pinout

PinFunction
VCC 3.4V – 4.4V power supply, must handle high current spikes
GND Ground
TXD Serial data out - connect to microcontroller RX
RXD Serial data in - connect to microcontroller TX
RST Module reset input

Applications

Remote SMS-based alert systems GPS/GSM vehicle trackers Remote sensor data upload without WiFi SMS-controlled relay and switch projects IoT devices in areas with no WiFi coverage Emergency/panic-button notifiers

What's in the box

1x SIM800L module with antenna

Downloads

Datasheet (PDF) AT Command Set Reference
🔌
Pin Connections
1 Table
Pin Connections Table 1
BoardSensor PinConnection
SIM800L V2VCC/GND/TX/RX5V / GND / board RX pin / board TX pin
📟
SIM800L V2.0 5V Wireless GSM GPRS MODULE
7 Examples • C/C++ | Boards: Arduino Uno, Arduino Nano, Arduino Mega, ESP32, ESP8266, STM32, Raspberry Pi Pico
SIM800L V2.0 5V Wireless GSM GPRS MODULE - Arduino Uno
SIM800L V2.0 5V Wireless GSM GPRS MODULE - Arduino Nano
SIM800L V2.0 5V Wireless GSM GPRS MODULE - Arduino Mega
SIM800L V2.0 5V Wireless GSM GPRS MODULE - ESP32
SIM800L V2.0 5V Wireless GSM GPRS MODULE - ESP8266
SIM800L V2.0 5V Wireless GSM GPRS MODULE - STM32
SIM800L V2.0 5V Wireless GSM GPRS MODULE - Raspberry Pi Pico
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_arduino_uno.inoArduino Uno
686 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=2, TX=3 on Arduino Uno. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#include <SoftwareSerial.h>
7SoftwareSerial LINK_SERIAL(2, 3);
8
9void setup() {
10 Serial.begin(115200);
11 LINK_SERIAL.begin(9600);
12 delay(3000); // let the module finish booting
13 LINK_SERIAL.println("AT"); // basic "are you there" check
14 LINK_SERIAL.println("AT+CSQ"); // signal quality
15}
16
17void loop() {
18 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
19 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
20}
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_arduino_nano.inoArduino Nano
687 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=2, TX=3 on Arduino Nano. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#include <SoftwareSerial.h>
7SoftwareSerial LINK_SERIAL(2, 3);
8
9void setup() {
10 Serial.begin(115200);
11 LINK_SERIAL.begin(9600);
12 delay(3000); // let the module finish booting
13 LINK_SERIAL.println("AT"); // basic "are you there" check
14 LINK_SERIAL.println("AT+CSQ"); // signal quality
15}
16
17void loop() {
18 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
19 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
20}
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_arduino_mega.inoArduino Mega
655 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=19, TX=18 on Arduino Mega. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#define LINK_SERIAL Serial1
7
8void setup() {
9 Serial.begin(115200);
10 LINK_SERIAL.begin(9600);
11 delay(3000); // let the module finish booting
12 LINK_SERIAL.println("AT"); // basic "are you there" check
13 LINK_SERIAL.println("AT+CSQ"); // signal quality
14}
15
16void loop() {
17 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
18 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
19}
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_esp32.inoESP32
648 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=16, TX=17 on ESP32. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#define LINK_SERIAL Serial1
7
8void setup() {
9 Serial.begin(115200);
10 LINK_SERIAL.begin(9600);
11 delay(3000); // let the module finish booting
12 LINK_SERIAL.println("AT"); // basic "are you there" check
13 LINK_SERIAL.println("AT+CSQ"); // signal quality
14}
15
16void loop() {
17 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
18 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
19}
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_esp8266.inoESP8266
686 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=D7, TX=D8 on ESP8266. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#include <SoftwareSerial.h>
7SoftwareSerial LINK_SERIAL(D7, D8);
8
9void setup() {
10 Serial.begin(115200);
11 LINK_SERIAL.begin(9600);
12 delay(3000); // let the module finish booting
13 LINK_SERIAL.println("AT"); // basic "are you there" check
14 LINK_SERIAL.println("AT+CSQ"); // signal quality
15}
16
17void loop() {
18 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
19 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
20}
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_stm32.inoSTM32
651 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=PA10, TX=PA9 on STM32. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#define LINK_SERIAL Serial1
7
8void setup() {
9 Serial.begin(115200);
10 LINK_SERIAL.begin(9600);
11 delay(3000); // let the module finish booting
12 LINK_SERIAL.println("AT"); // basic "are you there" check
13 LINK_SERIAL.println("AT+CSQ"); // signal quality
14}
15
16void loop() {
17 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
18 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
19}
📄 File: sim800l_v2.0_5v_wireless_gsm_gprs_module_-_raspberry_pi_pico.inoRaspberry Pi Pico
658 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RX=1, TX=0 on Raspberry Pi Pico. Needs its own separate 4-4.2V supply capable of ~2A peaks - a board's 5V/3.3V pin can't power it.
6#define LINK_SERIAL Serial1
7
8void setup() {
9 Serial.begin(115200);
10 LINK_SERIAL.begin(9600);
11 delay(3000); // let the module finish booting
12 LINK_SERIAL.println("AT"); // basic "are you there" check
13 LINK_SERIAL.println("AT+CSQ"); // signal quality
14}
15
16void loop() {
17 if (LINK_SERIAL.available()) Serial.write(LINK_SERIAL.read());
18 if (Serial.available()) LINK_SERIAL.write(Serial.read()); // type AT commands directly in the Serial Monitor
19}
UART GSM/GPRS modem with an onboard regulator (accepts 5V directly).
This is the single most important tip for this module: power it from a dedicated supply capable of sourcing 2A+ transient current at the correct 3.4-4.4V - a large capacitor (1000µF or more) directly across its power pins helps enormously. Powering it directly from an Arduino's 5V/3.3V pin or a weak USB port is the number one cause of random resets, failure to register on the network, and ”it doesn't respond to AT commands” reports. Always attach the antenna before powering it on and transmitting, since operating without one can damage the RF output stage over time. And you will need a genuine SIM card, active on a real cellular plan with sufficient balance or data, since the module itself provides no connectivity of its own without one.