The SIM800L lets an Uno send SMS alerts, make missed calls and get a little data over the mobile network, with no Wi-Fi needed. That makes it popular for farm-pump controllers and security alarms in Indian villages. It is also the module with the most “it doesn’t work” posts, and almost all of them are about power.
On the Uno, the module’s VCC must not come from the board at all. It needs 3.4–4.4 V with 2 A bursts. A single 18650 Li-ion cell gives that, with its negative joined to the Uno’s GND. The serial link uses SoftwareSerial on D7/D8, and a 10 kΩ / 20 kΩ divider protects the module’s 2.8 V-logic RXD from the Uno’s 5 V.
Before you write SMS code, this sketch checks every layer in turn — modem, SIM, network registration and signal quality — and tells you in plain words which one is failing.
Wiring
| Arduino Uno R3 | SIM800L GSM/GPRS module (2G) | Wire | Notes |
|---|---|---|---|
| — | NET | — | To GSM antenna (spring or u.FL) (not drawn) |
| 18650 Li-ion cell (3.7–4.2 V) · + | VCC | red | Short, thick wires. Add a 1000 µF capacitor across VCC and GND at the module. |
| 18650 Li-ion cell (3.7–4.2 V) · - | GND | black | |
| GND | GND | black | Common ground between the cell, the module and the Uno. |
| D7 | TXD | yellow | SIM800L TXD → Uno SoftwareSerial RX. |
| D8 | RXD | green | Via 10 kΩ / 20 kΩ divider — The SIM800L’s serial input is about 2.8 V logic; the divider brings the Uno’s 5 V down to about 3.3 V. |
3.4–4.4 V, peaks up to 2 A part, 5 V board. The SIM800L’s serial pins work at about 2.8 V. Its TXD is read fine by 3.3 V and 5 V boards; its RXD must be protected from a 5 V Arduino TX with a divider (10 kΩ / 20 kΩ). ESP32 and Pico can connect directly.
Board quirks
- Power is 90 % of SIM800L problems. It needs 3.4–4.4 V with 2 A bursts while registering. The Uno’s 5V pin is too high and its 3.3V pin far too weak. A single 18650 cell is the simplest supply that works.
- Its TXD idles at about 2.8 V, just below the 3 V the ATmega328P datasheet guarantees as HIGH at 5 V. In practice the Uno reads it reliably at 9600 baud, but keep the wire short.
- The network LED tells you the state: blinking every 1 s = searching, every 3 s = registered, fast = data connection.
- SIM800L is 2G-only. Jio is 4G-only, and operators are switching 2G off region by region, so check coverage in your area before you build.
- TinyGSM over SoftwareSerial fits on the Uno but uses about a third of the flash. Keep SMS text short — the Uno has only 2 KB of RAM for the message and everything else.
Code
// SIM800L GSM module on an Arduino Uno R3 - network and signal check with TinyGSM.
// VCC/GND from an 18650 Li-ion cell (3.7–4.2 V, 2 A peaks), cell − also to the Uno GND.
// SIM800L TXD → D7 (Uno RX). Uno D8 (TX) → 10 kΩ / 20 kΩ divider → SIM800L RXD.
// Needs a 2G-capable SIM (not Jio) and the antenna fitted.
#define TINY_GSM_MODEM_SIM800
#include <SoftwareSerial.h>
#include <TinyGsmClient.h>
SoftwareSerial gsmSerial(7, 8); // RX, TX
TinyGsm modem(gsmSerial);
void setup() {
Serial.begin(9600);
gsmSerial.begin(9600);
Serial.println(F("Starting SIM800L..."));
if (!modem.init()) {
Serial.println(F("No reply to AT - check the cell supply, TXD -> D7 and the divider on RXD"));
for (;;) {}
}
Serial.print(F("Modem: "));
Serial.println(modem.getModemInfo());
if (modem.getSimStatus() != 1) { // 1 = SIM ready
Serial.println(F("SIM not ready - check it is inserted (chip down) and has no PIN lock"));
for (;;) {}
}
Serial.println(F("Waiting for the network (up to 60 s)..."));
if (!modem.waitForNetwork(60000L)) {
Serial.println(F("No network - check 2G coverage, the antenna and the supply"));
return;
}
Serial.print(F("Registered on "));
Serial.println(modem.getOperator());
}
void loop() {
int csq = modem.getSignalQuality(); // 0..31, 99 = unknown
Serial.print(F("Signal CSQ "));
Serial.print(csq);
if (csq == 99 || csq < 5) Serial.println(F(" (too weak)"));
else if (csq < 10) Serial.println(F(" (marginal)"));
else Serial.println(F(" (OK)"));
Serial.println(modem.isNetworkConnected() ? F("Network: connected") : F("Network: lost"));
delay(10000);
}// SIM800L GSM module on an Arduino Uno R3 - network and signal check with TinyGSM.
// VCC/GND from an 18650 Li-ion cell (3.7–4.2 V, 2 A peaks), cell − also to the Uno GND.
// SIM800L TXD → D7 (Uno RX). Uno D8 (TX) → 10 kΩ / 20 kΩ divider → SIM800L RXD.
// Needs a 2G-capable SIM (not Jio) and the antenna fitted.
#define TINY_GSM_MODEM_SIM800
#include <SoftwareSerial.h>
#include <TinyGsmClient.h>
SoftwareSerial gsmSerial(7, 8); // RX, TX
TinyGsm modem(gsmSerial);
void setup() {
Serial.begin(9600);
gsmSerial.begin(9600);
Serial.println(F("Starting SIM800L..."));
if (!modem.init()) {
Serial.println(F("No reply to AT - check the cell supply, TXD -> D7 and the divider on RXD"));
for (;;) {}
}
Serial.print(F("Modem: "));
Serial.println(modem.getModemInfo());
if (modem.getSimStatus() != 1) { // 1 = SIM ready
Serial.println(F("SIM not ready - check it is inserted (chip down) and has no PIN lock"));
for (;;) {}
}
Serial.println(F("Waiting for the network (up to 60 s)..."));
if (!modem.waitForNetwork(60000L)) {
Serial.println(F("No network - check 2G coverage, the antenna and the supply"));
return;
}
Serial.print(F("Registered on "));
Serial.println(modem.getOperator());
}
void loop() {
int csq = modem.getSignalQuality(); // 0..31, 99 = unknown
Serial.print(F("Signal CSQ "));
Serial.print(csq);
if (csq == 99 || csq < 5) Serial.println(F(" (too weak)"));
else if (csq < 10) Serial.println(F(" (marginal)"));
else Serial.println(F(" (OK)"));
Serial.println(modem.isNetworkConnected() ? F("Network: connected") : F("Network: lost"));
delay(10000);
}Library: TinyGSM (Volodymyr Shymanskyy) — compiled with TinyGSM 0.12.0.
Expected serial output
Starting SIM800L...
Modem: SIM800 R14.18
Waiting for the network (up to 60 s)...
Registered on airtel
Signal CSQ 17 (OK)
Network: connectedStarting SIM800L... Modem: SIM800 R14.18 Waiting for the network (up to 60 s)... Registered on airtel Signal CSQ 17 (OK) Network: connected
Common errors
The module keeps restarting (LED blinks, then goes dark)
Supply sags during transmit bursts. Use the 18650 cell or a 2 A buck converter and the 1000 µF capacitor. See SIM800L keeps restarting.
“No reply to AT”
TXD/RXD swapped, the divider wired backwards (the 20 kΩ goes to GND), or no common ground.
SIM ready but no network
No 2G in your area, a Jio SIM, or no antenna. The LED keeps blinking every second while it searches.