I think Sim800l is one of most valuable modules in IOT because in conditions that you don't have internet or WIFI, you can use it only with a sim card. Also its so cheap and it is so easy to run and use. In my experiments i found it so easy to start working and it only needs a good power source. based on data sheet it needs between 3.4 to 4.2 volt, but i found around 4.1 volt is good and it will has a stable connection without any problems. When you power up Sim800l, if you see led on module blinks every 1 seconds it mean connection has problem and i found in most of cases its because of power supply. when it blinks every 3 seconds, its ok and connected. I use a 18650 battery which has around 4.2 volt when it is fully charged. You can also use Li-Po batteries.
One of other benefits of Sim800l is its power usage which is very low and make it a good choice for portable devices. In sleep mode it only use 1 mAh and when it is under load for receiving SMS, it uses around 50 mAh. I calculated for a normal usage with a 5000 mAh battery, it last around 2 weeks.
In this blog at first we just power up Sim800l and show received SMS in terminal, next we add a feature to send back a confirmation SMS as a SMS arrived and in last step we control a simple led with a command that we will send it through our SMS. This project is a starting point for using Sim800l and in future i am going to make other projects with it and replace this simple led with other things like GPS module to make a Tracker Device.
Project Overview
This repository contains a step-by-step implementation of SMS-based control using the SIM800L GSM module. The project is divided into three main parts:
- Basic SMS Reception - Setting up the SIM800L to receive and display SMS messages in the serial monitor
- LED Control via SMS - Extending the basic setup to control an LED by sending "ON" or "OFF" text messages
- SMS Reception and Confirmation - Like first part but it will sends back a confirmation SMS that your SMS delivered.
Perfect for IoT enthusiasts looking to add remote control capabilities to their projects without relying on WiFi or Bluetooth.
Hardware Requirements
- Arduino UNO or compatible board
- SIM800L GSM/GPRS module
- SIM card with SMS capability (and some credit)
- LED
- 220Ω resistor
- Breadboard and jumper wires
- Power supply (The SIM800L typically needs 3.7-4.2V)
SIM800l Pinout
Wiring Connections
SIM800L Pin | Arduino Pin |
---|---|
RX | D2 |
TX | D3 |
VCC | 3.7-4.2V external supply |
GND | GND |
For the LED control project:
- Connect LED anode (longer leg) to Arduino pin D8
- Connect LED cathode (shorter leg) to a 220Ω resistor
- Connect the other end of the resistor to GND
Wiring Connections Diagram Without LED
Wiring Connections Diagram With LED
My Wiring Connection (Sorry if it's not so nice)
Software Setup
- Install the Arduino IDE if you haven't already
- No additional libraries are required for this project
- Upload the appropriate sketch to your Arduino:
-
withoutLED.ino
for basic SMS reception -
WithLED.ino
for LED control via SMS -
WithoutLED&SendBackConfirm.ino
for SMS reception and confirmation.
-
Project Progression
Part 1: Basic SMS Reception
The first sketch demonstrates how to:
- Initialize the SIM800L module
- Configure it to receive SMS messages
- Display incoming messages in the serial monitor
This provides a foundation for understanding how to communicate with the SIM800L module.
Sketch:
#include <SoftwareSerial.h>
#define SIM800_RX_PIN 2
#define SIM800_TX_PIN 3
#define SIM800_RST_PIN 4 // Optional, can be used to reset the module
SoftwareSerial sim800(SIM800_TX_PIN, SIM800_RX_PIN); // RX, TX for Arduino
void setup() {
Serial.begin(9600);
sim800.begin(9600);
delay(1000);
Serial.println("Initializing SIM800L...");
sim800.println("AT");
delay(1000);
sim800.println("AT+CMGF=1"); // Set SMS text mode
delay(1000);
sim800.println("AT+CNMI=1,2,0,0,0"); // Auto show SMS
delay(1000);
}
void loop() {
if (sim800.available()) {
Serial.write(sim800.read());
}
if (Serial.available()) {
sim800.write(Serial.read());
}
}
Part 2: Adding SMS Confirmation
Building on the first part, this sketch adds:
- Module sends back a confirmation that our SMS has been successfully received. Sketch:
#include <SoftwareSerial.h>
#define SIM800_RX_PIN 2
#define SIM800_TX_PIN 3
#define SIM800_RST_PIN 4 // Optional, can be used to reset the module
SoftwareSerial sim800(SIM800_TX_PIN, SIM800_RX_PIN); // RX, TX for Arduino
String incomingData = "";
bool messageReceived = false;
String senderNumber = "";
void setup() {
Serial.begin(9600);
sim800.begin(9600);
delay(1000);
Serial.println("Initializing SIM800L...");
// Reset module if needed
// pinMode(SIM800_RST_PIN, OUTPUT);
// digitalWrite(SIM800_RST_PIN, LOW);
// delay(1000);
// digitalWrite(SIM800_RST_PIN, HIGH);
// delay(3000);
// Initialize module
sendATCommand("AT", 1000);
sendATCommand("AT+CMGF=1", 1000); // Set SMS text mode
sendATCommand("AT+CNMI=1,2,0,0,0", 1000); // Configure SMS notification
Serial.println("SIM800L Ready");
}
void loop() {
// Check for incoming data from SIM800L
while (sim800.available()) {
char c = sim800.read();
incomingData += c;
Serial.write(c); // Echo to serial monitor
delay(10);
}
// Process complete messages
if (incomingData.length() > 0) {
// Check if it's an SMS message notification
if (incomingData.indexOf("+CMT:") != -1) {
// Extract sender phone number
int phoneStartIndex = incomingData.indexOf("+CMT: \"") + 7;
int phoneEndIndex = incomingData.indexOf("\"", phoneStartIndex);
if (phoneStartIndex > 7 && phoneEndIndex != -1) {
senderNumber = incomingData.substring(phoneStartIndex, phoneEndIndex);
Serial.print("Sender number: ");
Serial.println(senderNumber);
// Send reply SMS
sendSMS(senderNumber, "Your SMS has been received. Thank you!");
}
}
// Clear the buffer after processing
incomingData = "";
}
// Handle commands from Serial monitor
if (Serial.available()) {
sim800.write(Serial.read());
}
}
// Function to send AT commands
void sendATCommand(String command, int timeout) {
sim800.println(command);
delay(timeout);
while (sim800.available()) {
Serial.write(sim800.read());
}
}
// Function to send SMS
void sendSMS(String number, String message) {
Serial.println("Sending SMS reply...");
sim800.println("AT+CMGF=1"); // Set SMS text mode
delay(500);
sim800.print("AT+CMGS=\"");
sim800.print(number);
sim800.println("\"");
delay(500);
sim800.print(message);
delay(500);
sim800.write(26); // ASCII code for CTRL+Z to send message
delay(3000); // Wait for message to be sent
Serial.println("SMS sent!");
}
Part 3: LED Control via SMS
Building on the first part, this sketch adds:
- LED control functionality
- SMS command parsing
- Feedback through the serial monitor
Send "ON" or "OFF" in an SMS to the SIM card number to control the LED remotely.
Sketch:
#include <SoftwareSerial.h>
#define SIM800_RX_PIN 2
#define SIM800_TX_PIN 3
#define SIM800_RST_PIN 4 // Optional, not used here
#define LED_PIN 8 // Connect an LED to this pin
SoftwareSerial sim800(SIM800_TX_PIN, SIM800_RX_PIN); // RX, TX for Arduino
String incomingData = ""; // To hold incoming data from SIM800
void setup() {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // Turn off LED initially
Serial.begin(9600);
sim800.begin(9600);
delay(1000);
Serial.println("Initializing SIM800L...");
sim800.println("AT");
delay(1000);
sim800.println("AT+CMGF=1"); // Set SMS text mode
delay(1000);
sim800.println("AT+CNMI=1,2,0,0,0"); // Show SMS directly
delay(1000);
}
void loop() {
while (sim800.available()) {
char c = sim800.read();
Serial.write(c);
incomingData += c;
// Check for end of SMS
if (c == '\n') {
incomingData.trim(); // Remove extra spaces/newlines
if (incomingData.indexOf("ON") != -1) {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED turned ON");
}
else if (incomingData.indexOf("OFF") != -1) {
digitalWrite(LED_PIN, LOW);
Serial.println("LED turned OFF");
}
incomingData = ""; // Clear buffer for next message
}
}
// Optional: forward Serial input to SIM800 for debugging
while (Serial.available()) {
sim800.write(Serial.read());
}
}
Troubleshooting Tips
- Power Issues: The SIM800L is sensitive to power fluctuations. Use a dedicated power supply capable of handling current spikes.
- Network Registration: Make sure the SIM card is activated and has good signal strength.
- AT Commands: If you're having trouble, try sending basic AT commands through the serial monitor to test communication.
- Baud Rate: Ensure both the Arduino and SIM800L are communicating at the same baud rate (9600 in this project).
👉 You can find the full source code here:
GitHub Repo: payamhsn/Iot-Sim800l-Starter
At the end, i think this module is so valuable, because with this module and a relay which is a low cost setup, you can connect to any device with any voltage, from a Lamp to an Air condition systems and control them from anywhere that you are.
Thanks a lot for reading my blog. I wrote everything by myself and a little help of AI in making tables and some content. Love & Respect
Top comments (0)