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, а в конце тебя ждёт таблица с решениями проблем регистрации в сети.

Что такое 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 ниже минимума модуля |



Что говорит светодиод? Коды мигания
| Поведение светодиода | Значение | Что делать |
|---|---|---|
| Не горит | Модуль не работает | Проверь питание и полярность 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.
| Пин SIM800L | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | Внешний источник 4,0 V (+) | Внешний источник 4,0 V (+) | Внешний источник 4,0 V (+) |
| GND | GND + минус источника (−) | GND + минус источника (−) | GND + минус источника (−) |
| TXD | D2 (SoftwareSerial RX) | GPIO 16 (RX2) | GP1 (UART0 RX) |
| RXD | D3, через делитель 10 kΩ + 15 kΩ | GPIO 17 (TX2), через делитель 1 kΩ + 5,6 kΩ | GP0 (UART0 TX), через делитель 1 kΩ + 5,6 kΩ |
| RST | Можно не подключать | Можно не подключать | Можно не подключать |
| NET | Антенна | Антенна | Антенна |
Первая проверка AT-командами
- Подключи модуль по таблице, установи антенну и вставь micro SIM с отключённым запросом PIN-кода.
- Подай питание и следи за светодиодом: несколько секунд он мигает раз в секунду, затем должен перейти на мигание раз в 3 секунды.
- Загрузи в Arduino скетч-мост ниже; SoftwareSerial входит в Arduino IDE, так что дополнительная библиотека не нужна.
- Открой монитор порта, выбери скорость 9600 бод и окончание строки Both NL & CR (NL и CR).
- Набери AT и нажми Enter. Модуль подстраивается под твою скорость благодаря автоопределению (autobauding); на первые попытки ответа может не быть, так что повторяй, пока не увидишь OK.
- Затем по очереди проверь SIM-карту, уровень сигнала и регистрацию в сети командами из таблицы ниже.
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}| Команда | Пример ответа | Значение |
|---|---|---|
| AT | OK | Модуль работает, скорость согласована |
| AT+CPIN? | +CPIN: READY | SIM-карта готова; если видишь SIM PIN, отключи PIN или отправь AT+CPIN="1234" |
| AT+CSQ | +CSQ: 18,0 | Уровень сигнала от 0 до 31 (99 = неизвестно); 10 и выше достаточно |
| AT+CREG? | +CREG: 0,1 | 1 = зарегистрирован, 5 = зарегистрирован (роуминг), 2 = поиск, 3 = отказ |
| AT+COPS? | +COPS: 0,0,"OPERATOR" | Название оператора связи |
| AT+CBC | +CBC: 0,82,4012 | Напряжение питания в милливольтах (здесь 4,012 V) |
| AT+GSN | 15-значное число | IMEI модуля |
| AT+CCID | Число из 19–20 цифр | Серийный номер SIM-карты (ICCID); показывает, что карта читается |
| AT+CMGF=1 | OK | Текстовый режим для SMS |
| AT+CMGS="+905551112233" | > | Ждёт текст сообщения; отправка по Ctrl+Z (26) |
| AT+CNMI=1,2,0,0,0 | OK | Выводит входящие SMS прямо в последовательный порт, не сохраняя их |
| ATD+905551112233; | OK | Начинает голосовой вызов (точка с запятой в конце обязательна) |
| ATA / ATH | OK | Отвечает на входящий вызов / кладёт трубку |
| AT+CLIP=1 | OK | При входящем вызове показывает номер звонящего в строке +CLIP |
| AT+IPR=9600 | OK | Фиксирует скорость 9600 бод вместо автоопределения; чтобы сохранить навсегда, затем отправь AT&W |
| AT+CMEE=2 | OK | Сообщает об ошибках понятным текстом вместо кодов |
Первое число в ответе 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:
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 и переключение звонком
Для чтения входящих сообщений используем 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 в том же формате.
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) |
Звонки с SIM800L: пусть он позвонит тебе при тревоге
Чтобы позвонить, после команды ATD пишут номер и точку с запятой: ATD+905551112233;. Точка с запятой в конце означает голосовой вызов; если её забыть, модуль начнёт вызов передачи данных (data call), и голосового соединения не будет. Если другая сторона отклонит вызов или разговор закончится, модуль напишет NO CARRIER или BUSY; если никто не ответит — NO ANSWER; а без сети — NO DIALTONE. ATH завершает вызов в любой момент. Когда речь идёт о тревоге, звонящий телефон привлекает гораздо больше внимания, чем SMS. Скетч ниже при срабатывании PIR-датчика движения на D4 отправляет SMS, затем звонит на твой телефон до 20 секунд и выдерживает 2 минуты между двумя тревогами:
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 как есть не работают.

| Определение T-Call | GPIO | Назначение |
|---|---|---|
| MODEM_PWRKEY | 4 | Включает модем импульсом LOW длиной 1 секунда |
| MODEM_RST | 5 | Сброс модема; держится в HIGH |
| MODEM_POWER_ON | 23 | При HIGH включает питание модема |
| MODEM_TX | 27 | От ESP32 ко входу RXD модема |
| MODEM_RX | 26 | От выхода TXD модема к ESP32 |
| I2C SDA / SCL | 21 / 22 | Микросхема питания IP5306 (адрес 0x75) |
| LED | 13 | Пользовательский светодиод на плате |
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.
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 не уходят: частые ошибки и решения
| Симптом | Возможная причина | Решение |
|---|---|---|
| Нет никакого ответа на AT | TXD и 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 перезагружается при отправке SMS | SIM800L и Arduino питаются от одного слабого источника | Раздели источники питания, объедини только GND |
| Входящие SMS не появляются в последовательном порту | AT+CNMI не задана или настройка сбросилась при перезапуске модуля | Отправляй AT+CMGF=1 и AT+CNMI=1,2,0,0,0 в setup |
При правильном питании и в зоне покрытия 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
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

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

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

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

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

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

Умная станция полива
Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

