Preview build — page text is a draft awaiting human review. Code badges come from real compiles. The flasher is real but not yet hardware-tested; the Playground is still a preview.

SIM800L GSM with Arduino Uno — power it right, then check the network

Wire a SIM800L to an Arduino Uno R3 with an 18650 cell for its 2 A peaks, a divider on RXD and SoftwareSerial, then check SIM, network and signal with TinyGSM.

Arduino C++Verified — core avr 1.8.8, TinyGSM 0.12.0, 3 Nov 2026Compile-only

Community draft — report a mistake

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 R3Only the pins used are shown · 5 V logic18650 Li-ion cell (3.7–4.2 V)SIM800L GSM/GPRS module (2G)10k│20k+-GNDD7D8NET → GSM antenna (spring or u.FL)VCCRST (not connected)RXDTXDGND
Also needed: 18650 Li-ion cell and holder (or a buck converter set to 4.0 V, 2 A), 1000 µF / 10 V capacitor, 10 kΩ and 20 kΩ resistors, 2G-capable SIM card (Airtel, Vi or BSNL — not Jio).
Every connection
Arduino Uno R3SIM800L GSM/GPRS module (2G)WireNotes
—NET—To GSM antenna (spring or u.FL) (not drawn)
18650 Li-ion cell (3.7–4.2 V) · +VCCredShort, thick wires. Add a 1000 µF capacitor across VCC and GND at the module.
18650 Li-ion cell (3.7–4.2 V) · -GNDblack
GNDGNDblackCommon ground between the cell, the module and the Uno.
D7TXDyellowSIM800L TXD → Uno SoftwareSerial RX.
D8RXDgreenVia 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-uno.inoArduino C++Open in PlaygroundOpen in PlaygroundFlash
// 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

Serial Monitor · 9600Output
Starting 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.

↑↓ to move · Enter to open