Компоненты · 15 мин чтения

SIM800L и Arduino: отправка SMS, управление реле и звонки

Как подключить GSM-модуль SIM800L к Arduino: питание 4 V / 2 A, коды мигания светодиода, AT-команды, отправка SMS, реле по SMS, звонки, код для ESP32 и Pico.

GSM-модуль SIM800L — крошечный и очень дешёвый 2G-модем размером примерно с почтовую марку, который даёт твоему проекту на Arduino собственную телефонную линию. С micro SIM-картой внутри можно отправлять и принимать SMS, звонить и передавать небольшие объёмы данных в интернет по GPRS. Там, куда не достают Wi-Fi и Bluetooth, — на даче, в теплице, на складе или в машине — связка SIM800L и Arduino становится самым простым способом управлять устройством удалённо из любой точки, где ловит мобильная сеть. Модуль общается с Arduino по двухпроводному последовательному соединению (UART) и управляется короткими текстовыми командами, которые называются AT-командами.

При этом SIM800L — один из модулей, которые доставляют новичкам больше всего хлопот, и почти все проблемы сводятся к двум вещам: неподходящему питанию и покрытию 2G. В этом руководстве ты узнаешь, как правильно питать модуль с его диапазоном 3,4–4,4 V и пиковым током 2 A, что означает частота мигания светодиода на плате, как пошагово проверить модуль AT-командами, как отправить SMS с Arduino Uno, включать и выключать реле по SMS и собрать схему, которая звонит тебе при срабатывании сигнализации. Затем то же самое повторим на ESP32, готовой плате TTGO T-Call и Raspberry Pi Pico, а в конце тебя ждёт таблица с решениями проблем регистрации в сети.

GSM/GPRS-модуль SIM800L со спиральной антенной
Плата SIM800L: сверху спиральная пружинная антенна, рядом конденсатор питания и два ряда штыревых контактов; слот для micro SIM находится на обратной стороне платы (внизу).

Что такое SIM800L и как он работает?

SIM800L — GSM/GPRS-модуль компании SIMCom размером всего 17,8 × 15,8 мм. Красная плата, которую ты покупаешь, — это небольшая плата-переходник (breakout), на которой вокруг модуля добавлены слот для SIM-карты, разъём антенны, светодиод состояния и штыревые контакты. Модуль автоматически сканирует все четыре диапазона GSM (850, 900, 1800 и 1900 MHz), регистрируется в сети, как обычный мобильный телефон, а затем выполняет команды, приходящие по последовательному порту: «отправь это сообщение на этот номер», «позвони на этот номер», «передавай мне входящие сообщения» и так далее. Представь его телефоном без экрана и клавиатуры: работу и того и другого делает Arduino. Если подключить микрофон и динамик к пинам MIC и SPK, можно даже вести настоящий голосовой разговор.

ХарактеристикаЗначение
МодульSIMCom SIM800L, 2G GSM/GPRS
Частотные диапазоныЧетыре диапазона: GSM 850, EGSM 900, DCS 1800, PCS 1900 MHz
Напряжение питания3,4–4,4 V (рекомендуется 4,0 V)
Пиковый токДо 2 A (короткие импульсы во время передачи)
Средний токВыключен ~0,1 mA, сон ~1–2 mA, ожидание ~15 mA, голосовой вызов 130–220 mA, GPRS 150–450 mA (зависит от диапазона и редакции даташита)
Мощность передатчика2 W (850/900 MHz), 1 W (1800/1900 MHz)
ИнтерфейсUART и AT-команды; автоопределение скорости 1200–115200
Логический уровеньВыход 2,8 V; вход RXD не более 3,1 V
SIM-картаMicro SIM (карты на 1,8 V и 3 V)
Скорость GPRSДо 85,6 кбит/с
Рабочая температураОт −40 до +85 °C

Распиновка SIM800L

ПинНазначениеПримечание
NETПодключение антенныСюда припаивается пружинная антенна; если есть разъём u.FL (IPEX), подключи внешнюю антенну
VCCПитание (+)3,4–4,4 V; никогда не подключай к пину 5V или 3.3V на Arduino
RSTАппаратный сбросЕсли подтянуть к LOW хотя бы на 105 мс, модуль перезапустится; можно не подключать
RXDПоследовательный вход модуляИдёт к пину TX платы; не более 3,1 V
TXDПоследовательный выход модуляИдёт к пину RX платы; уровень 2,8 V
GNDЗемляИ к источнику питания, и к Arduino (общая земля)
RINGИндикатор вызова / SMSПереходит в LOW при входящем вызове и выдаёт импульс LOW длиной 120 мс при получении SMS
DTRУправление сномПосле AT+CSCLK=1 модуль спит, пока на DTR HIGH, и просыпается, когда пин подтягивают к LOW
MIC+ / MIC−Вход микрофонаДля электретного микрофона
SPK+ / SPK−Выход на динамикМожно подключить небольшой динамик на 8 Ω

Спиральная пружинная антенна из комплекта припаивается к отверстию NET в углу платы; на некоторых платах есть ещё и маленький разъём u.FL (IPEX) для внешней антенны. Без антенны модуль не находит сеть, а уровень сигнала близок к нулю; если в помещении приём слабый, клеящаяся GSM-антенна на кабеле заметно выигрывает у пружинки. Карта micro SIM вставляется в слот на обратной стороне так, чтобы срезанный угол совпал с рисунком на держателе. Перед установкой карты отключи запрос PIN-кода в телефоне и убедись, что с этой линии можно отправлять SMS и звонить, а на счёте достаточно денег.

Питание: 3,4–4,4 V и пиковый ток 2 A

Питание — самая критичная часть SIM800L и то, в чём ошибаются чаще всего. GSM работает с разделением по времени: в каждом кадре длиной 4,615 мс модуль передаёт только в течение своего временного слота длиной 577 µs. В эти короткие моменты он потребляет до 2 A, а сразу после этого ток снова падает до нескольких десятков миллиампер. Если источник не может отдать такой резкий ток, напряжение проседает. Согласно даташиту SIMCom, когда напряжение падает до 3,5 V, модуль пишет в последовательный порт UNDER-VOLTAGE WARNNING, а ниже 3,4 V — UNDER-VOLTAGE POWER DOWN и выключается сам (опечатка в WARNNING — из прошивки производителя). На верхней границе при 4,3 V появляется OVER-VOLTAGE WARNNING, а выше 4,4 V модуль снова отключается. В некоторых версиях прошивки это автоматическое отключение по умолчанию выключено и включается командой AT+CBATCHK=1; но даже так за этими пределами модуль работает нестабильно и постоянно перезагружается. Поэтому пин 5V на Arduino для SIM800L слишком высок. Пин 3.3V ниже минимума и официально рассчитан всего на 50 mA; к тому же USB-порт компьютера даёт не больше 500 mA.

Вариант питанияПодходит?Подробности
Одна ячейка LiPo 3,7 V или Li-ion аккумулятор 18650Да, самый простой вариантЗаряженная ячейка даёт 4,2 V; модуль спокойно работает, пока напряжение не опустится до 3,6–3,7 V, ниже он может отключаться во время импульсов передачи. Выбирай аккумулятор не меньше 1000 mAh, способный отдать 2 A, и заряжай его через TP4056
Понижающий модуль LM2596 (step-down, buck)Да, для проектов с питанием от адаптераВыстави 4,0–4,1 V от адаптера на 7–12 V; отдаёт до 3 A
Платы SIM800L со входом 5 V (например, «SIM800L V2»)Да, по инструкции к платеСхема на плате понижает напряжение; всё равно нужен источник 5 V, способный отдать 2 A
Пин 5V на ArduinoНетПревышает предел 4,4 V, модуль отключается или повреждается; USB не может дать 2 A
Пин 3.3V на ArduinoНетНиже 3,4 V и слишком маленький ток; модуль не запускается или постоянно перезагружается
Стабилизаторы на 3,3 V вроде AMS1117НетВыход 3,3 V ниже минимума модуля
Понижающий модуль LM2596
Понижающий модуль LM2596
Аккумулятор 18650 Li-Ion
Аккумулятор 18650 Li-Ion
Модуль зарядки TP4056
Модуль зарядки TP4056
Если используешь LM2596, выставь его выход на 4,0–4,1 V подстроечным резистором, измеряя мультиметром, ещё до подключения SIM800L. Неизвестно, как модуль настроен на заводе: выход, близкий к входным 12 V, сожжёт SIM800L в первую же секунду. Если питаешь от аккумулятора, заряжай ячейку модулем зарядки TP4056 и следи, чтобы не перепутать полярность: на плате SIM800L нет защиты от переполюсовки.
Поставь между VCC и GND как можно ближе к пинам модуля электролитический конденсатор 470–1000 µF с низким ESR и керамический конденсатор 100 nF; собственная референсная схема SIMCom рекомендует не меньше 100 µF с низким ESR. Конденсатор отдаёт импульсы по 2 A вместо источника питания и не даёт напряжению просесть; как это работает, мы объясняем в статье Что такое конденсатор?. Делай провода питания короткими и толстыми, не пропускай 2 A через пружинные контакты макетной платы и обязательно соедини GND модуля с GND Arduino.

Что говорит светодиод? Коды мигания

Поведение светодиодаЗначениеЧто делать
Не горитМодуль не работаетПроверь питание и полярность VCC–GND, измерь напряжение
Примерно раз в секунду (64 мс горит, 800 мс не горит)Работает, но не зарегистрирован в сетиНормально первые 10–60 секунд; если дольше, проверь SIM, PIN, антенну и покрытие 2G
Примерно раз в 3 секунды (64 мс горит, 3000 мс не горит)Зарегистрирован в сетиГотов к SMS и звонкам
Очень часто, примерно 3 раза в секунду (64 мс горит, 300 мс не горит)Активно GPRS-соединениеСоединение с интернетом установлено
Мигает несколько раз, гаснет, потом всё начинается сноваНапряжение проседает, и модуль отключаетсяИспользуй более мощный источник, большой конденсатор и короткие толстые провода

Возьми за привычку использовать светодиод как инструмент диагностики: если ещё до написания кода видно, что модуль перешёл на мигание раз в 3 секунды, половина возможных проблем сразу отпадает. Если модуль минутами мигает раз в секунду, нет смысла возиться с программой: сначала загляни в раздел о регистрации в сети ниже. Самые большие импульсы тока приходятся на момент регистрации, когда модуль впервые связывается с базовой станцией; если питание слабое, модуль выключается именно в этот момент, и цикл начинается заново.

Подключение SIM800L к Arduino и логические уровни

SIM800L общается с Arduino по UART, и линии данных перекрещиваются: пин TXD модуля идёт к пину RX платы, а пин RXD модуля — к пину TX платы. Единственный аппаратный последовательный порт Arduino Uno (D0 и D1) занят загрузкой кода по USB и монитором порта, поэтому модуль подключаем к D2 и D3 через SoftwareSerial, который надёжно работает на скорости 9600 бод. На ESP32 и Pico программный последовательный порт не нужен: там используются аппаратные UART. Основы последовательной связи ты найдёшь в нашем руководстве Последовательная связь UART.

Пин SIM800LArduino UnoESP32Raspberry Pi Pico
VCCВнешний источник 4,0 V (+)Внешний источник 4,0 V (+)Внешний источник 4,0 V (+)
GNDGND + минус источника (−)GND + минус источника (−)GND + минус источника (−)
TXDD2 (SoftwareSerial RX)GPIO 16 (RX2)GP1 (UART0 RX)
RXDD3, через делитель 10 kΩ + 15 kΩGPIO 17 (TX2), через делитель 1 kΩ + 5,6 kΩGP0 (UART0 TX), через делитель 1 kΩ + 5,6 kΩ
RSTМожно не подключатьМожно не подключатьМожно не подключать
NETАнтеннаАнтеннаАнтенна
Согласно даташиту, вход RXD у SIM800L принимает не более 3,1 V. Пин D3 у Uno выдаёт 5 V, поэтому поставь между ними делитель напряжения: D3 → 10 kΩ → RXD и RXD → 15 kΩ → GND дают около 3,0 V. Делитель 10 kΩ + 20 kΩ, который часто встречается в интернете, даёт 3,3 V; обычно он работает, но немного превышает предел производителя. Для выхода 3,3 V у ESP32 и Pico рекомендованные SIMCom резисторы 1 kΩ последовательно + 5,6 kΩ на GND дают около 2,8 V. В обратную сторону Uno обычно правильно читает сигнал TXD модуля с уровнем 2,8 V, но даташит Uno при питании 5 V требует 3,0 V для HIGH; в постоянной конструкции самое аккуратное решение — двунаправленный преобразователь логических уровней.

Первая проверка AT-командами

  1. Подключи модуль по таблице, установи антенну и вставь micro SIM с отключённым запросом PIN-кода.
  2. Подай питание и следи за светодиодом: несколько секунд он мигает раз в секунду, затем должен перейти на мигание раз в 3 секунды.
  3. Загрузи в Arduino скетч-мост ниже; SoftwareSerial входит в Arduino IDE, так что дополнительная библиотека не нужна.
  4. Открой монитор порта, выбери скорость 9600 бод и окончание строки Both NL & CR (NL и CR).
  5. Набери AT и нажми Enter. Модуль подстраивается под твою скорость благодаря автоопределению (autobauding); на первые попытки ответа может не быть, так что повторяй, пока не увидишь OK.
  6. Затем по очереди проверь SIM-карту, уровень сигнала и регистрацию в сети командами из таблицы ниже.
C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3);        // RX = D2 (SIM800L TXD), TX = D3 (SIM800L RXD, bölücüyle / via divider)
4
5void setup() {
6  Serial.begin(9600);               // Seri Monitör hızı / Serial Monitor speed
7  sim800.begin(9600);               // SIM800L bu hıza kendini ayarlar / SIM800L autobauds to this rate
8  Serial.println(F("AT yaz ve Enter'a bas / Type AT and press Enter"));
9}
10
11void loop() {
12  if (Serial.available()) sim800.write(Serial.read());   // bilgisayar → modül / PC → module
13  if (sim800.available()) Serial.write(sim800.read());   // modül → bilgisayar / module → PC
14}
КомандаПример ответаЗначение
ATOKМодуль работает, скорость согласована
AT+CPIN?+CPIN: READYSIM-карта готова; если видишь SIM PIN, отключи PIN или отправь AT+CPIN="1234"
AT+CSQ+CSQ: 18,0Уровень сигнала от 0 до 31 (99 = неизвестно); 10 и выше достаточно
AT+CREG?+CREG: 0,11 = зарегистрирован, 5 = зарегистрирован (роуминг), 2 = поиск, 3 = отказ
AT+COPS?+COPS: 0,0,"OPERATOR"Название оператора связи
AT+CBC+CBC: 0,82,4012Напряжение питания в милливольтах (здесь 4,012 V)
AT+GSN15-значное числоIMEI модуля
AT+CCIDЧисло из 19–20 цифрСерийный номер SIM-карты (ICCID); показывает, что карта читается
AT+CMGF=1OKТекстовый режим для SMS
AT+CMGS="+905551112233">Ждёт текст сообщения; отправка по Ctrl+Z (26)
AT+CNMI=1,2,0,0,0OKВыводит входящие SMS прямо в последовательный порт, не сохраняя их
ATD+905551112233;OKНачинает голосовой вызов (точка с запятой в конце обязательна)
ATA / ATHOKОтвечает на входящий вызов / кладёт трубку
AT+CLIP=1OKПри входящем вызове показывает номер звонящего в строке +CLIP
AT+IPR=9600OKФиксирует скорость 9600 бод вместо автоопределения; чтобы сохранить навсегда, затем отправь AT&W
AT+CMEE=2OKСообщает об ошибках понятным текстом вместо кодов

Первое число в ответе AT+CSQ можно перевести в dBm: dBm ≈ −113 + 2 × значение. Например, 18 — это около −77 dBm, вполне хороший сигнал; ниже 10 — слабый, а ниже 5 — такой, при котором даже SMS проходит с трудом. Ответ 99 означает, что модуль ещё не успел измерить сигнал. Команда AT+CBC идеально подходит для поиска проблем с питанием: если в простое видно около 4,0 V, а при отправке SMS или звонке модуль отключается, проблема точно в допустимом токе источника. В режиме автоопределения скорости, который стоит по умолчанию, модуль при запуске ничего не пишет; если зафиксировать скорость командой AT+IPR=9600 и сохранить её командой AT&W, настройка запишется в энергонезависимую память, и при каждом включении модуль будет сообщать о готовности строками RDY, +CFUN: 1 и +CPIN: READY.

Не регистрируется в сети? Покрытие 2G, SIM-карта и IMEI

SIM800L работает только в сети 2G (GSM/GPRS); 3G, 4G и 5G он не знает. Во многих странах 2G исчезает: в США последняя 2G-сеть отключилась в августе 2026 года, Австралия и Швейцария выключили 2G ещё несколько лет назад, французские операторы сворачивают его до конца 2026 года, в Германии Telekom ориентируется на 2028 год, а в Японии и Южной Корее GSM вообще никогда не использовался. В Великобритании операторы заявили, что 2G проработает дольше, а окончательное отключение произойдёт не позднее 2033 года; в Турции отключение запланировано на 2029 год. Там, где нет 2G, SIM800L не зарегистрируется, как бы хорошо он ни был запитан; в таких местах нужен 4G LTE-модуль вроде SIM7600 или A7670 либо модуль LTE-M/NB-IoT вроде SIM7080G. При поиске проблем с регистрацией иди в таком порядке:

  • Есть ли у тебя 2G? В настройках мобильной сети телефона выбери предпочтительный тип сети «только 2G» и попробуй позвонить с той же SIM-картой. Если телефон не находит сеть в режиме 2G, SIM800L её тоже не найдёт.
  • Читается ли SIM-карта? AT+CCID должна вернуть число, а на AT+CPIN? должен прийти ответ +CPIN: READY. При ошибке переставь карту правильной стороной; если nano SIM вставлена через адаптер, убедись, что адаптер не давит на контакты неравномерно.
  • Достаточно ли сильный сигнал? AT+CSQ должна показывать не меньше 10. Припаяй антенну или поставь внешнюю и перенеси модуль ближе к окну.
  • Регистрация отклоняется? Если AT+CREG? отвечает 0,3, сеть отказывает модулю: линия может быть неактивна или IMEI устройства заблокирован.
  • Регистрация IMEI: некоторые страны блокируют устройства с незарегистрированным IMEI; например, в Турции ввезённые из-за границы устройства без регистрации отключаются после льготного периода. Узнай IMEI модуля командой AT+GSN и, если живёшь в такой стране, покупай у местного продавца, который предлагает модули с зарегистрированным IMEI.
  • Хватает ли питания? Если модуль перезагружается в момент регистрации, проблема не в сети, а в питании; вернись к разделу о питании выше.

Отправка SMS с Arduino

Чтобы отправить SMS, сначала переключаются в текстовый режим командой AT+CMGF=1. Затем отправляют AT+CMGS="+905551112233"; надёжнее всего писать номер с кодом страны (+90 в примере — код Турции; для России и Казахстана это +7, для Великобритании +44, для США +1 и так далее). Модуль отвечает приглашением >, показывая, что ждёт текст сообщения. После текста вместо Enter отправляется символ Ctrl+Z (ASCII 26, 0x1A); когда сеть примет сообщение, модуль вернёт номер-ссылку вроде +CMGS: 12 и следом OK. Это подтверждение может занять несколько секунд, а при слабом сигнале — до 60 секунд. Скетч ниже синхронизируется с модулем, ждёт регистрации в сети и отправляет одно SMS; впиши свой номер в строку PHONE:

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3);                // RX = D2 ← SIM TXD, TX = D3 → SIM RXD
4const char PHONE[] = "+905551112233";      // kendi numaran, uluslararası biçimde / your number, international format
5
6// ok gelirse 1, ERROR gelirse -1, süre dolarsa 0 / 1 on ok, -1 on ERROR, 0 on timeout
7int waitReply(const char *ok, unsigned long timeoutMs) {
8  const char *err = "ERROR";
9  byte m1 = 0, m2 = 0;
10  unsigned long start = millis();
11  while (millis() - start < timeoutMs) {
12    if (!sim800.available()) continue;
13    char c = sim800.read();
14    Serial.write(c);                        // modülün cevabını göster / show the module's reply
15    m1 = (c == ok[m1]) ? m1 + 1 : (c == ok[0] ? 1 : 0);
16    if (ok[m1] == '\0') return 1;
17    m2 = (c == err[m2]) ? m2 + 1 : (c == err[0] ? 1 : 0);
18    if (err[m2] == '\0') return -1;
19  }
20  return 0;
21}
22
23// Şebeke kaydını bekle: +CREG: 0,1 (ev ağı) ya da 0,5 (dolaşım) / wait for registration: home or roaming
24bool waitForNetwork(unsigned long timeoutMs) {
25  unsigned long start = millis();
26  while (millis() - start < timeoutMs) {
27    sim800.println("AT+CREG?");
28    String reply = "";
29    unsigned long t = millis();
30    while (millis() - t < 1000) {
31      while (sim800.available()) reply += (char)sim800.read();
32    }
33    Serial.print(reply);
34    if (reply.indexOf("+CREG: 0,1") >= 0 || reply.indexOf("+CREG: 0,5") >= 0) return true;
35    delay(2000);
36  }
37  return false;
38}
39
40bool sendSms(const char *number, const char *text) {
41  sim800.print("AT+CMGS=\"");
42  sim800.print(number);
43  sim800.print("\"\r");
44  if (waitReply(">", 5000) != 1) return false;   // metin istemi gelmedi / no text prompt
45  sim800.print(text);
46  sim800.write(26);                               // Ctrl+Z (0x1A): mesajı gönder / send the message
47  return waitReply("+CMGS:", 60000) == 1;         // ağ onayı 60 sn sürebilir / network ack may take 60 s
48}
49
50void setup() {
51  Serial.begin(9600);
52  sim800.begin(9600);
53  delay(3000);                                    // modül açılsın / let the module boot
54
55  bool alive = false;
56  for (byte i = 0; i < 10 && !alive; i++) {       // otomatik baud için birkaç kez AT / several ATs for autobaud
57    sim800.println("AT");
58    alive = (waitReply("OK", 1000) == 1);
59  }
60  if (!alive) {
61    Serial.println(F("\nModul cevap vermiyor / Module not responding"));
62    return;
63  }
64
65  sim800.println("AT+CMGF=1");                    // SMS metin modu / SMS text mode
66  waitReply("OK", 1000);
67
68  Serial.println(F("\nSebeke bekleniyor / Waiting for network"));
69  if (!waitForNetwork(60000)) {
70    Serial.println(F("Sebekeye kayit olunamadi / Not registered"));
71    return;
72  }
73
74  if (sendSms(PHONE, "BlueGrays: SIM800L calisiyor!")) Serial.println(F("\nSMS gonderildi / SMS sent"));
75  else Serial.println(F("\nSMS gonderilemedi / SMS failed"));
76}
77
78void loop() {
79  if (sim800.available()) Serial.write(sim800.read());   // sonraki mesajları göster / show later messages
80}

В скетче функция waitReply() выводит каждый символ от модуля в монитор порта и при этом ищет ожидаемый ответ (OK, > или +CMGS:) и слово ERROR, так что результат каждой команды виден. waitForNetwork() ждёт, пока в ответе +CREG не появится 0,1 (домашняя сеть) или 0,5 (роуминг), потому что SMS, отправленное до регистрации, не уходит. В текстовом режиме длина SMS не больше 160 символов. Символы, набранные в Arduino IDE, кодируются в UTF-8, поэтому буквы с диакритикой и нелатинские буквы, включая кириллицу, приходят искажёнными; пиши простым текстом ASCII, как в примере в коде.

Каждое SMS стоит денег. Никогда не помещай код отправки SMS в loop() без условия: сбой, который срабатывает раз в секунду, — это сотни сообщений и большой счёт за считаные минуты. Для повторяющихся событий вроде тревоги добавь паузу между двумя сообщениями с помощью millis(); как это сделать, рассказано в нашем руководстве millis() и delay().

Управление реле по SMS и переключение звонком

Для чтения входящих сообщений используем AT+CNMI=1,2,0,0,0: с этой настройкой модуль не сохраняет новые SMS на SIM-карте, а выводит их прямо в последовательный порт двумя строками. Первая строка, например +CMT: "+905551112233","","26/10/30,14:05:12+12", содержит номер отправителя и время (+12 в конце — часовой пояс в четвертях часа, то есть UTC+3), а вторая — само сообщение. Скетч ниже управляет модулем реле на D7 сообщениями «ROLE AC» (включить реле), «ROLE KAPA» (выключить реле) и «DURUM» (состояние), после каждой команды отправляет SMS с ответом и принимает сообщения только с твоего номера; команды, конечно, можно переименовать в коде, например в ON, OFF и STATUS. Кроме того, благодаря AT+CLIP=1 при звонке на модуль с твоего номера вызов сбрасывается без ответа, а реле переключается; так как за неотвеченный вызов деньги не списываются, это самый дешёвый удалённый выключатель. Некоторые сети передают номер отправителя не в международном, а в национальном формате (начиная с 0 или 8); если команды игнорируются, посмотри на строку +CMT в мониторе порта и запиши OWNER в том же формате.

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3);                 // RX = D2 ← SIM TXD, TX = D3 → SIM RXD
4const byte RELAY_PIN = 7;                    // röle modülü IN / relay module IN
5const bool RELAY_ON = HIGH;                  // düşük seviyeli modülde LOW yap / set LOW for active-low modules
6const char OWNER[] = "+905551112233";        // komut kabul edilen tek numara / the only accepted number
7
8char line[100];                              // gelen satır tamponu / incoming line buffer
9byte lineLen = 0;
10bool bodyNext = false;                       // sonraki satır SMS metni mi? / is the next line the SMS text?
11bool fromOwner = false;
12bool relayState = false;
13
14int waitReply(const char *ok, unsigned long timeoutMs) {
15  const char *err = "ERROR";
16  byte m1 = 0, m2 = 0;
17  unsigned long start = millis();
18  while (millis() - start < timeoutMs) {
19    if (!sim800.available()) continue;
20    char c = sim800.read();
21    Serial.write(c);
22    m1 = (c == ok[m1]) ? m1 + 1 : (c == ok[0] ? 1 : 0);
23    if (ok[m1] == '\0') return 1;
24    m2 = (c == err[m2]) ? m2 + 1 : (c == err[0] ? 1 : 0);
25    if (err[m2] == '\0') return -1;
26  }
27  return 0;
28}
29
30bool sendSms(const char *number, const char *text) {
31  sim800.print("AT+CMGS=\"");
32  sim800.print(number);
33  sim800.print("\"\r");
34  if (waitReply(">", 5000) != 1) return false;
35  sim800.print(text);
36  sim800.write(26);                          // Ctrl+Z: gönder / send
37  return waitReply("+CMGS:", 60000) == 1;
38}
39
40void setRelay(bool on) {
41  relayState = on;
42  digitalWrite(RELAY_PIN, on ? RELAY_ON : !RELAY_ON);
43}
44
45void handleCommand(char *text) {
46  for (char *p = text; *p; p++) *p = toupper(*p);       // büyük harfe çevir / convert to upper case
47  if (strstr(text, "ROLE AC")) {
48    setRelay(true);
49    sendSms(OWNER, "Role ACILDI / Relay ON");
50  } else if (strstr(text, "ROLE KAPA")) {
51    setRelay(false);
52    sendSms(OWNER, "Role KAPANDI / Relay OFF");
53  } else if (strstr(text, "DURUM")) {
54    sendSms(OWNER, relayState ? "Role ACIK / Relay ON" : "Role KAPALI / Relay OFF");
55  }
56}
57
58void handleLine() {
59  Serial.println(line);
60  if (bodyNext) {                            // +CMT satırından sonraki satır SMS metnidir / the line after +CMT is the SMS text
61    bodyNext = false;
62    if (fromOwner) handleCommand(line);
63  } else if (strncmp(line, "+CMT:", 5) == 0) {
64    fromOwner = (strstr(line, OWNER) != NULL);           // gönderen kontrolü / sender check
65    bodyNext = true;
66  } else if (strncmp(line, "+CLIP:", 6) == 0 && strstr(line, OWNER) != NULL) {
67    sim800.println("ATH");                   // aramayı reddet, ücret yazılmaz / reject the call, nothing is charged
68    setRelay(!relayState);                   // her çağrıda aç-kapa / toggle on every call
69  }
70}
71
72void setup() {
73  pinMode(RELAY_PIN, OUTPUT);
74  setRelay(false);
75  Serial.begin(9600);
76  sim800.begin(9600);
77  delay(3000);
78  for (byte i = 0; i < 10; i++) {            // otomatik baud eşleşmesi / autobaud sync
79    sim800.println("AT");
80    if (waitReply("OK", 1000) == 1) break;
81  }
82  const char *initCmds[] = {"ATE0", "AT+CMGF=1", "AT+CNMI=1,2,0,0,0", "AT+CLIP=1"};
83  for (byte i = 0; i < 4; i++) {
84    sim800.println(initCmds[i]);             // yankı kapalı, metin modu, SMS'i ilet, arayanı göster / echo off, text mode, push SMS, caller ID
85    waitReply("OK", 1000);
86  }
87  Serial.println(F("\nHazir / Ready"));
88}
89
90void loop() {
91  while (sim800.available()) {
92    char c = sim800.read();
93    if (c == '\r') continue;
94    if (c == '\n') {                         // satır tamamlandı / line complete
95      line[lineLen] = '\0';
96      if (lineLen > 0) handleLine();
97      lineLen = 0;
98    } else if (lineLen < sizeof(line) - 1) {
99      line[lineLen++] = c;
100    }
101  }
102}
Элемент кодаЧто делает
ATE0Отключает эхо, и модуль больше не повторяет отправленные команды; входящие строки становятся чище
AT+CNMI=1,2,0,0,0Выводит новое SMS в последовательный порт строкой +CMT, сразу за которой идёт текст сообщения
AT+CLIP=1При входящем вызове сообщает номер звонящего в строке +CLIP после RING
strstr(line, OWNER)Проверяет, есть ли в строке разрешённый номер; команды с других номеров игнорируются
toupper()Переводит текст в верхний регистр, чтобы «role ac» и «ROLE AC» обрабатывались одинаково
ATHЗавершает входящий вызов, не отвечая на него
RELAY_ONПоставь LOW для модулей реле, которые срабатывают от низкого уровня (active-low)
Если реле коммутирует сетевое напряжение (220–230 V или 120 V), делай подключение при вынутой из розетки вилке прибора и никогда не касайся высоковольтной стороны; без опыта сначала попробуй со светодиодом или нагрузкой на 12 V. Учти также, что номер отправителя в SMS можно подделать. Если управляешь чем-то важным, например дверным замком или котлом, добавь к команде пароль, известный только тебе (например, «ROLE AC 4827»), и проверяй его в коде.

Звонки с SIM800L: пусть он позвонит тебе при тревоге

Чтобы позвонить, после команды ATD пишут номер и точку с запятой: ATD+905551112233;. Точка с запятой в конце означает голосовой вызов; если её забыть, модуль начнёт вызов передачи данных (data call), и голосового соединения не будет. Если другая сторона отклонит вызов или разговор закончится, модуль напишет NO CARRIER или BUSY; если никто не ответит — NO ANSWER; а без сети — NO DIALTONE. ATH завершает вызов в любой момент. Когда речь идёт о тревоге, звонящий телефон привлекает гораздо больше внимания, чем SMS. Скетч ниже при срабатывании PIR-датчика движения на D4 отправляет SMS, затем звонит на твой телефон до 20 секунд и выдерживает 2 минуты между двумя тревогами:

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3);                 // RX = D2 ← SIM TXD, TX = D3 → SIM RXD
4const byte SENSOR_PIN = 4;                   // PIR çıkışı / PIR output
5const char OWNER[] = "+905551112233";        // aranacak numara / number to call
6const unsigned long RING_MS = 20000;         // en fazla 20 sn çaldır / ring for at most 20 s
7const unsigned long COOLDOWN_MS = 120000;    // iki alarm arası 2 dk; açılışta da 2 dk bekler / 2 min between alarms, also after power-up
8unsigned long lastAlarm = 0;
9
10int waitReply(const char *ok, unsigned long timeoutMs) {
11  const char *err = "ERROR";
12  byte m1 = 0, m2 = 0;
13  unsigned long start = millis();
14  while (millis() - start < timeoutMs) {
15    if (!sim800.available()) continue;
16    char c = sim800.read();
17    Serial.write(c);
18    m1 = (c == ok[m1]) ? m1 + 1 : (c == ok[0] ? 1 : 0);
19    if (ok[m1] == '\0') return 1;
20    m2 = (c == err[m2]) ? m2 + 1 : (c == err[0] ? 1 : 0);
21    if (err[m2] == '\0') return -1;
22  }
23  return 0;
24}
25
26bool sendSms(const char *number, const char *text) {
27  sim800.print("AT+CMGS=\"");
28  sim800.print(number);
29  sim800.print("\"\r");
30  if (waitReply(">", 5000) != 1) return false;
31  sim800.print(text);
32  sim800.write(26);                          // Ctrl+Z: gönder / send
33  return waitReply("+CMGS:", 60000) == 1;
34}
35
36void callOwner() {
37  sim800.print("ATD");
38  sim800.print(OWNER);
39  sim800.println(";");                       // sondaki ; sesli arama demektir / the trailing ; means a voice call
40  waitReply("NO CARRIER", RING_MS);          // açıp kapatırsan erken biter / ends early if you answer and hang up
41  sim800.println("ATH");                     // aramayı sonlandır / hang up
42  waitReply("OK", 2000);
43}
44
45void setup() {
46  pinMode(SENSOR_PIN, INPUT);
47  Serial.begin(9600);
48  sim800.begin(9600);
49  delay(3000);
50  for (byte i = 0; i < 10; i++) {            // otomatik baud eşleşmesi / autobaud sync
51    sim800.println("AT");
52    if (waitReply("OK", 1000) == 1) break;
53  }
54  sim800.println("AT+CMGF=1");               // SMS metin modu / SMS text mode
55  waitReply("OK", 1000);
56}
57
58void loop() {
59  if (digitalRead(SENSOR_PIN) == HIGH && millis() - lastAlarm > COOLDOWN_MS) {
60    lastAlarm = millis();
61    Serial.println(F("Hareket! / Motion!"));
62    sendSms(OWNER, "ALARM: Hareket algilandi / Motion detected");
63    callOwner();
64  }
65  while (sim800.available()) Serial.write(sim800.read());
66}

Кроме того, первые 2 минуты после включения скетч молчит: за это время PIR-датчик успевает прогреться, а у тебя есть время выйти из дома. Если ответить на звонок, соединение установится; с электретным микрофоном и маленьким динамиком на 8 Ω на пинах MIC и SPK модуля SIM800L через устройство можно разговаривать. Чтобы входящие вызовы принимались автоматически, достаточно отправить ATA, когда появляется строка RING. Во время разговора модуль потребляет в среднем 130–220 mA, а пики всё так же доходят до 2 A; если питания хватает для SMS, но во время звонков модуль отключается, поставь конденсатор побольше или более мощный источник.

SIM800L с ESP32 и плата TTGO T-Call

На ESP32 SoftwareSerial не нужен: любой из трёх аппаратных UART можно назначить на любые удобные пины. Чтобы запустить скетчи для Uno из примеров выше на ESP32, удали строки SoftwareSerial, вместо них напиши HardwareSerial sim800(2); и в setup() используй sim800.begin(9600, SERIAL_8N1, 16, 17);; остальной код работает без изменений. Поскольку ESP32 работает от 3,3 V, достаточно делителя 1 kΩ + 5,6 kΩ на линии TX. Если питать SIM800L от того же слабого источника, что и ESP32, импульсы по 2 A просаживают напряжение и у ESP32, и плата перезагружается с ошибкой «Brownout detector was triggered» (сработал детектор просадки питания); питай две платы от отдельных источников и соединяй только их GND. Подробно эту ошибку мы разбираем в руководстве ESP32 brownout.

Если не хочется возиться с проводами, плата LilyGO TTGO T-Call объединяет ESP32 и модем SIM800 на одной плате. На ней есть модуль ESP32-WROVER-B, SIM800L (в некоторых партиях SIM800H из того же семейства), слот для SIM-карты, разъём для аккумулятора LiPo и микросхема управления питанием IP5306, которая заряжает аккумулятор и обеспечивает нужный модему ток. Модем включается и выключается не внешними пинами, а определёнными GPIO ESP32, поэтому обычные скетчи для SIM800L на T-Call как есть не работают.

Плата LilyGO TTGO T-Call ESP32 SIM800
TTGO T-Call: на лицевой стороне ESP32-WROVER-B и модем SIM800, на обратной — слот для SIM-карты и разъём аккумулятора LiPo.
Определение T-CallGPIOНазначение
MODEM_PWRKEY4Включает модем импульсом LOW длиной 1 секунда
MODEM_RST5Сброс модема; держится в HIGH
MODEM_POWER_ON23При HIGH включает питание модема
MODEM_TX27От ESP32 ко входу RXD модема
MODEM_RX26От выхода TXD модема к ESP32
I2C SDA / SCL21 / 22Микросхема питания IP5306 (адрес 0x75)
LED13Пользовательский светодиод на плате
C++ (Arduino IDE)
1#include <Wire.h>
2
3// LilyGO TTGO T-Call SIM800L (IP5306'lı sürüm) pinleri / pins of the IP5306 version
4#define MODEM_PWRKEY     4
5#define MODEM_RST        5
6#define MODEM_POWER_ON  23
7#define MODEM_TX        27      // ESP32 TX → modem RX
8#define MODEM_RX        26      // ESP32 RX ← modem TX
9#define I2C_SDA         21
10#define I2C_SCL         22
11#define IP5306_ADDR   0x75      // güç yönetim yongası / power management chip
12
13HardwareSerial &modem = Serial1;
14const char OWNER[] = "+905551112233";
15
16// Pille çalışırken IP5306 kendini kapatmasın / keep the IP5306 boost on when running from battery
17bool setPowerBoostKeepOn() {
18  Wire.beginTransmission(IP5306_ADDR);
19  Wire.write(0x00);             // SYS_CTL0 yazmacı / SYS_CTL0 register
20  Wire.write(0x37);             // boost keep-on biti açık / boost keep-on bit set
21  return Wire.endTransmission() == 0;
22}
23
24// token gelirse true; ERROR ya da süre dolarsa false / true on token, false on ERROR or timeout
25bool waitFor(const char *token, unsigned long timeoutMs) {
26  String reply = "";
27  unsigned long start = millis();
28  while (millis() - start < timeoutMs) {
29    while (modem.available()) reply += (char)modem.read();
30    if (reply.indexOf(token) >= 0) break;
31    if (reply.indexOf("ERROR") >= 0) break;
32  }
33  Serial.print(reply);
34  return reply.indexOf(token) >= 0;
35}
36
37bool at(const char *cmd) {
38  modem.println(cmd);
39  return waitFor("OK", 2000);
40}
41
42bool registered() {
43  modem.println("AT+CREG?");
44  return waitFor("+CREG: 0,1", 1000);       // ev şebekesine kayıtlı / registered on the home network
45}
46
47bool sendSms(const char *number, const char *text) {
48  modem.printf("AT+CMGS=\"%s\"\r", number);
49  if (!waitFor(">", 5000)) return false;
50  modem.print(text);
51  modem.write(26);                           // Ctrl+Z: gönder / send
52  return waitFor("+CMGS:", 60000);
53}
54
55void setup() {
56  Serial.begin(115200);
57  Wire.begin(I2C_SDA, I2C_SCL);
58  Serial.println(setPowerBoostKeepOn() ? "IP5306 OK" : "IP5306 yok / not found");
59
60  pinMode(MODEM_RST, OUTPUT);
61  pinMode(MODEM_PWRKEY, OUTPUT);
62  pinMode(MODEM_POWER_ON, OUTPUT);
63  digitalWrite(MODEM_RST, HIGH);             // reset bırakılmış / reset released
64  digitalWrite(MODEM_POWER_ON, HIGH);        // modemin beslemesini aç / switch on the modem supply
65  digitalWrite(MODEM_PWRKEY, HIGH);
66  delay(100);
67  digitalWrite(MODEM_PWRKEY, LOW);           // PWRKEY 1 sn düşük: modem açılır / PWRKEY low for 1 s: modem starts
68  delay(1000);
69  digitalWrite(MODEM_PWRKEY, HIGH);
70
71  modem.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
72  delay(3000);
73
74  for (int i = 0; i < 10 && !at("AT"); i++) delay(500);   // otomatik baud / autobaud
75  at("AT+CMGF=1");                           // SMS metin modu / SMS text mode
76  at("AT+CNMI=1,2,0,0,0");                   // gelen SMS'i seri porta ver / push incoming SMS to the UART
77
78  unsigned long start = millis();
79  while (!registered() && millis() - start < 60000) delay(2000);
80
81  if (sendSms(OWNER, "TTGO T-Call hazir / ready")) Serial.println("\nSMS gonderildi / sent");
82}
83
84void loop() {
85  while (modem.available()) Serial.write(modem.read());   // gelen SMS ve aramalar / incoming SMS and calls
86  while (Serial.available()) modem.write(Serial.read());  // Seri Monitör'den AT komutu / AT commands from the monitor
87}

Эти пины относятся к версиям T-Call SIM800L от LilyGO с IP5306. В версии с микросхемой питания AXP192 она настраивается другим кодом, а в версии с SIM800C пин питания модема — GPIO 25; сверься с датой версии, напечатанной на твоей плате, и с таблицей пинов производителя. Функция setPowerBoostKeepOn() записывает 0x37 в регистр 0x00 микросхемы IP5306, и та перестаёт сама отключаться при малой нагрузке, когда работает от аккумулятора. Если при питании платы только от USB компьютера модем отключается в момент регистрации, подключи ещё и аккумулятор LiPo: он покрывает импульсы по 2 A. На ESP32-WROVER пины GPIO 16 и 17 заняты встроенной PSRAM, поэтому модем подключён к 26 и 27. Для задач по GPRS, таких как HTTP-запросы или MQTT, библиотека TinyGSM поддерживает эту плату с определением TINY_GSM_MODEM_SIM800.

SIM800L с Raspberry Pi Pico и MicroPython

На Raspberry Pi Pico подключаем модуль к UART0: TXD модуля SIM800L идёт на GP1, его RXD — на GP0 через делитель 1 kΩ + 5,6 kΩ, а GND объединяются. Пины VBUS и 3V3 на Pico не могут питать SIM800L, поэтому и здесь питай модуль от внешнего источника 4 V. Код на MicroPython ниже делает то же, что и пример с реле для Arduino: включает и выключает реле на GP15 по SMS и отправляет ответ. Функция to_text() отбрасывает байты, испорченные помехами, и оставляет только символы ASCII, так что ошибка декодирования не остановит программу. Дополнительная библиотека не нужна; если пока непонятно, как запускать код в Thonny, сначала прочитай наше руководство Основы MicroPython.

MicroPython
1from machine import UART, Pin
2import time
3
4# GP0 (TX) → SIM RXD (1k + 5,6k bölücü / divider), GP1 (RX) ← SIM TXD
5sim = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1), timeout=100, timeout_char=50)
6relay = Pin(15, Pin.OUT, value=0)              # röle modülü IN / relay module IN
7OWNER = "+905551112233"                        # yetkili numara / authorised number
8
9def to_text(raw):
10    # yalnız ASCII karakterleri al / keep ASCII characters only
11    return "".join(chr(b) for b in raw if 9 < b < 128)
12
13def wait_for(token, timeout_ms):
14    # token ya da ERROR gelene kadar oku / read until token or ERROR
15    buf = ""
16    t0 = time.ticks_ms()
17    while time.ticks_diff(time.ticks_ms(), t0) < timeout_ms:
18        if sim.any():
19            buf += to_text(sim.read())
20            if token in buf:
21                return True
22            if "ERROR" in buf:
23                return False
24    return False
25
26def at(cmd, timeout_ms=2000):
27    sim.write(cmd + "\r\n")
28    return wait_for("OK", timeout_ms)
29
30def send_sms(number, msg):
31    sim.write('AT+CMGS="{}"\r'.format(number))
32    if not wait_for(">", 5000):
33        return False
34    sim.write(msg)
35    sim.write(b"\x1a")                         # Ctrl+Z: gönder / send
36    return wait_for("+CMGS:", 60000)
37
38for _ in range(10):                            # otomatik baud eşleşmesi / autobaud sync
39    if at("AT", 1000):
40        break
41at("ATE0")                                     # yankıyı kapat / echo off
42at("AT+CMGF=1")                                # SMS metin modu / SMS text mode
43at("AT+CNMI=1,2,0,0,0")                        # gelen SMS'i UART'a ver / push incoming SMS to the UART
44print("Hazir / Ready")
45
46body_next = False
47from_owner = False
48while True:
49    raw = sim.readline()
50    if not raw:
51        continue
52    line = to_text(raw).strip()
53    if not line:
54        continue
55    print(line)
56    if body_next:                              # +CMT'den sonraki satır SMS metni / line after +CMT is the text
57        body_next = False
58        cmd = line.upper()
59        if not from_owner:
60            continue
61        if "ROLE AC" in cmd:
62            relay.value(1)
63            send_sms(OWNER, "Role ACILDI / Relay ON")
64        elif "ROLE KAPA" in cmd:
65            relay.value(0)
66            send_sms(OWNER, "Role KAPANDI / Relay OFF")
67        elif "DURUM" in cmd:
68            send_sms(OWNER, "Role ACIK / ON" if relay.value() else "Role KAPALI / OFF")
69    elif line.startswith("+CMT:"):             # yeni SMS başlığı / new SMS header
70        from_owner = OWNER in line
71        body_next = True

Идеи проектов с SIM800L

  • Охранная сигнализация с SMS: система, которая отправляет SMS, а затем звонит тебе, когда PIR-датчик или датчик двери замечает движение; подробности — в нашем руководстве Домашняя сигнализация на Arduino.
  • Оповещение об утечке газа: SMS на телефон, когда датчик газа MQ-2 превышает порог, даже если дома никого нет.
  • GPS-трекер, отвечающий по SMS: с GPS-модулем NEO-6M — трекер для машины или велосипеда, который на сообщение «LOCATION» отвечает ссылкой на Google Карты.
  • Удалённый полив: система для сада или огорода, которая сообщает по SMS показания датчика влажности почвы и включает насос по сообщению «WATER».
  • Температурный сторож: схема на DS18B20, которая присылает предупреждение, когда температура в теплице, курятнике или морозильном ларе выходит за пределы.
  • Гаражные ворота, открываемые звонком: бесплатный пульт, который на одну секунду включает реле только при звонке с зарегистрированного номера.
  • Датчик отключения электричества: небольшая схема, которая при пропадании сети продолжает работать от аккумулятора и отправляет SMS «Power cut» (свет отключили).

Не подключается к сети, SMS не уходят: частые ошибки и решения

СимптомВозможная причинаРешение
Нет никакого ответа на ATTXD и RXD перепутаны, нет общей GND, неверное окончание строки или автоопределение скорости не синхронизировалосьПодключи TXD к D2, объедини GND, выбери Both NL & CR и отправь AT несколько раз
Приходят случайные символыНе совпадает скорость или логический уровень на граниВыставь 9600 и в мониторе порта, и в скетче, используй преобразователь уровней
Светодиод мигает несколько раз и гаснет, модуль перезагружаетсяВо время регистрации напряжение падает ниже 3,4 VИсточник, способный отдать 2 A, конденсатор 1000 µF, короткие толстые провода
В последовательном порту появляется UNDER-VOLTAGE POWER DOWNПитание упало ниже 3,4 VЗаряди аккумулятор или выставь на выходе понижающего модуля 4,0–4,1 V
OVER-VOLTAGE WARNNING или OVER-VOLTAGE POWER DOWNНапряжение выше 4,3–4,4 VСнизь выход до 4,0 V; никогда не подключай модуль к 5 V
Светодиод всё время мигает раз в секундуНет антенны, SIM-карта не читается, включён PIN или в районе нет 2GУстанови антенну, проверь командами AT+CPIN? и AT+CSQ, проверь покрытие 2G телефоном
Ответ +CREG: 0,3Сеть отказала в регистрацииПроверь, что линия активна и IMEI не заблокирован
SMS не уходит, приходит +CMS ERRORНет денег на счёте, неверный формат номера или не задан номер SMS-центраПроверь баланс, пиши номер с кодом страны, посмотри SMS-центр командой AT+CSCA?
Arduino перезагружается при отправке SMSSIM800L и Arduino питаются от одного слабого источникаРаздели источники питания, объедини только GND
Входящие SMS не появляются в последовательном портуAT+CNMI не задана или настройка сбросилась при перезапуске модуляОтправляй AT+CMGF=1 и AT+CNMI=1,2,0,0,0 в setup
Быстрее всего понять, где проблема — в коде или в железе, можно, подключив модуль прямо к компьютеру через USB-TTL-преобразователь на 3,3 V и набирая AT-команды вручную. Во время поиска неисправности отправь AT+CMEE=2: тогда модуль показывает понятные сообщения об ошибках, например «+CME ERROR: SIM not inserted» (SIM-карта не вставлена) вместо «+CME ERROR: 10».

При правильном питании и в зоне покрытия 2G модуль SIM800L — самый дешёвый способ дотянуться до проектов на Arduino за много километров: нужны лишь надёжный источник 4 V, большой конденсатор и несколько AT-команд. Если хочется сравнить другие беспроводные варианты, загляни в наше руководство Модули беспроводной связи. В приложении BlueGrays есть проекты, которые легко дополнить модулем SIM800L: сигнализация с датчиком движения, сигнализация газа и пламени, управление сетевой лампой, умный полив и сигнализация на ESP32 с уведомлениями в Telegram — всё со схемами подключения и пошаговым кодом.

Частые вопросы

Какое напряжение нужно SIM800L и можно ли подключить его к 5V?

SIM800L работает от 3,4–4,4 V, рекомендуется 4,0 V. Если подключить его к пину 5V на Arduino, модуль отключится из-за перенапряжения или повредится. Используй одну ячейку LiPo или аккумулятор 18650 либо LM2596, выставленный на 4,0 V; источник также должен выдерживать короткие импульсы по 2 A.

Работает ли SIM800L в 2026 году?

Только там, где ещё работает сеть 2G. В США, Австралии и Швейцарии 2G уже отключён, Франция сворачивает его до конца 2026 года, а в Германии, Великобритании и Турции 2G пока есть. Прежде чем строить долгосрочный проект, уточни планы своего оператора по 2G; иначе выбирай 4G LTE-модуль.

Почему мой SIM800L не подключается к сети?

Самые частые причины — неподходящее питание, отсутствие антенны, SIM-карта с включённым PIN-кодом и отсутствие 2G в районе. Проверь сигнал командой AT+CSQ, SIM-карту — AT+CPIN?, а статус регистрации — AT+CREG?. Если модуль перезагружается во время регистрации, проблема точно в питании.

Что означает мигание светодиода на SIM800L?

Мигание раз в секунду означает, что модуль работает, но не зарегистрирован в сети, а мигание раз в 3 секунды — что он зарегистрирован и готов к SMS и звонкам. Очень частое мигание означает активное GPRS-соединение. Если светодиод мигает несколько раз и гаснет, модуль перезагружается из-за просадки напряжения.

Может ли SIM800L подключаться к интернету?

Да, по GPRS он может отправлять и принимать данные на скорости до 85,6 кбит/с, этого хватает, чтобы отправлять данные датчиков на сервер, делать HTTP-запросы или использовать MQTT. Нужно ввести настройки APN твоего оператора, а библиотека TinyGSM упрощает задачу. Для картинок или больших файлов он, впрочем, слишком медленный.

Чем заменить SIM800L?

В странах, где 2G уже отключили или отключают, используй 4G LTE-модуль вроде SIM7600 или A7670 либо модуль LTE-M/NB-IoT вроде SIM7080G. Большинство AT-команд похожи, поэтому код для SMS и звонков переносится с небольшими изменениями. SIM800C и более старый SIM900 из того же семейства используют похожие команды, но тоже работают только в 2G.

Все проекты
Температура и влажность с DHT11
#55Средний

Температура и влажность с DHT11

Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

4.7(47)
73
Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
#145Продвинутый
Premium

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)

Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

0.0(0)
9
Детектор движения на датчике движения
#24Новичок
Premium

Детектор движения на датчике движения

Простой охранник, который сообщает, что кто-то вошёл в комнату. Датчик движения улавливает тепло человеческого тела, а Arduino держит светодиод включённым, пока есть движение, и гасит его, когда движе

4.6(47)
67
Сигнализация пламени и газа
#52Продвинутый
Premium

Сигнализация пламени и газа

Маленький страж, который сразу предупреждает, когда где-то утекает газ или появляется пламя. Датчик газа следит за газом в воздухе, а датчик пламени — за светом огня; пока всё в порядке, горит зелёный

4.8(52)
67
Включение лампы 220V кнопкой (удержание)
#19Продвинутый
Premium

Включение лампы 220V кнопкой (удержание)

Пока ты держишь кнопку, горит настоящая лампа на 220 вольт, а как только отпустишь — гаснет. Слабый сигнал Arduino не может зажечь лампу напрямую, поэтому между ними стоит реле — выключатель с электри

4.4(30)
38
Включение лампы 220V пультом
#21Продвинутый
Premium

Включение лампы 220V пультом

Включай и выключай настоящую лампу у себя дома пультом от телевизора, не вставая с дивана. Arduino читает невидимый световой сигнал пульта; кнопка питания щёлкает реле и включает лампу, а кнопка отклю

4.4(22)
30
Умная станция полива
#83Продвинутый
Premium

Умная станция полива

Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

5.0(42)
57