Хотите получать мгновенные SMS-уведомления с вашего ESP32 без использования громоздкого GSM-модуля? Будь то обнаружение движения, внезапное повышение температуры или несанкционированное открытие дверцы шкафчика, ваш ESP32 теперь может отправлять SMS-уведомления в режиме реального времени прямо на ваш телефон, используя только Wi-Fi и бесплатный API от Circuit Digest Cloud.

В большинстве проектов IoT требуется постоянно проверять приложение или веб-панель, чтобы оставаться в курсе событий. Но с этой интеллектуальной системой оповещений на основе SMS ваш ESP32 превращается в проактивного наблюдателя, отправляя важные обновления прямо в почтовый ящик вашего смартфона, даже когда вы не подключены к приложениям или панелям управления. И самое лучшее? Никаких ежемесячных платежей, никаких SIM-карт, только код и Wi-Fi.
В этой статье мы покажем вам, как считывать данные о температуре с датчика DHT11 и отправлять эти значения на смартфон в виде SMS-сообщений, используя плату ESP32. Итак, начнём.
Также на нашем сайте рассматривались и другие проекты по отправке SMS с помощью различных микроконтроллеров:
- передача и прием SMS с помощью STM32F103C8 и GSM модуля SIM800C;
- передача SMS с помощью модуля ESP8266.
Как отправлять SMS без использования GSM?
Вместо того чтобы заставлять ESP32 напрямую зависеть от сотовых сетей, в этом проекте мы подключаем ESP32 к сети Wi-Fi и используем API Circuit Digest для отправки текстовых сообщений. Эти SMS API выступают в качестве посредника между ESP32 и сотовыми сетями. Вот как это работает:

ESP32 подключается к активной сети Wi-Fi — ESP32 подключается к точке доступа Wi-Fi для доступа в интернет, что позволяет ему взаимодействовать с API SMS.
ESP32 отправляет HTTP-запрос к API — всякий раз, когда ESP32 получает сигнал от датчиков, он отправляет HTTP-запрос к SMS API, содержащий номер телефона получателя, сообщение и действительный ключ API.
SMS API отправляет сообщение — SMS API проверяет, действителен ли ключ API. Если он действителен, то отправляет сообщение на номер телефона получателя через мобильную сеть, как обычное текстовое сообщение.
Таким образом, мы можем отправлять SMS с помощью ESP32 без необходимости использования GSM-модулей. Если вам интересно, как отправлять SMS с помощью GSM, ознакомьтесь с этим руководством по отправке SMS с ESP32 с использованием GSM.
Итак, на этом всё о работе устройства. Перейдём к компонентам, необходимым для отправки SMS-уведомлений с ESP32 через Интернет.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- Адаптер питания 5 В с кабелем для программирования.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Внешний вид компонентов для нашего проекта представлен на следующем рисунке.

В качестве примера для демонстрации отправки SMS я использую датчик DHT11 для измерения температуры и заставляю ESP32 отправлять SMS-уведомления при возникновении определенного условия.
В зависимости от ваших задач, вы можете использовать любой датчик вместо датчика DHT11. Например, если вы хотите получать SMS-уведомления при обнаружении движения, вы можете выбрать PIR-датчик, используя в качестве примера это руководство по подключению PIR-датчика к ESP32.
Схема проекта
Настройка оборудования для отправки SMS с помощью ESP32 очень проста. Поскольку мы используем онлайн-API для отправки SMS, нам не нужно беспокоиться о сложных схемах подключения GSM. Вот принципиальная схема нашего SMS-отправителя на ESP32.
Внешний вид аппаратной части схемы отправки SMS на ESP32 представлен на рисунке ниже. Выглядит просто, правда? Да, потому что ей не требуется никакого дополнительного оборудования, например, GSM-модуля. Для отправки SMS достаточно лишь подключения к интернету.

Для питания всей схемы через USB-порт ESP32 можно использовать источник питания 5 В. Далее мы рассмотрим, как сгенерировать ключ API для отправки SMS-сообщений.
Генерация ключа API
Прежде чем перейти к программированию, нам сначала нужно сгенерировать действительный SMS API от поставщика услуг облачных SMS-сообщений Circuit Digest, чтобы мы могли использовать возможности интернета для отправки SMS с нашего ESP32.
ШАГ 1: Перейдите на сайт Circuit Digest Cloud по адресу « https://www.circuitdigest.cloud/ ». Затем нажмите кнопку login («Войти»). Вы будете перенаправлены на страницу входа, где вам нужно будет ввести свои учетные данные. Если у вас нет учетной записи, создайте новую, используя страницу регистрации.

ШАГ 2: После входа в систему вы найдете кнопку “My Account” («Мой аккаунт») в правом верхнем углу. Нажмите на нее, и вы будете перенаправлены на страницу генерации ключа API.

ШАГ 3: На странице генерации ключа API вам будет предложено ввести капчу. После проверки капчи будет сгенерирован новый ключ API с лимитом в 100 SMS в месяц. Даже после истечения срока действия вы можете бесплатно его продлить.

ШАГ 4: После этого просто прокрутите страницу вниз. Там вам будет предложено привязать номер мобильного телефона получателя для отправки SMS-уведомлений, а затем пройти проверку капчи и OTP-кода. Здесь вы можете привязать несколько номеров мобильных телефонов получателей для получения SMS-уведомлений.

ШАГ 5: После привязки всех мобильных номеров получателей вы сможете проверить список привязанных телефонных номеров, как показано на изображении ниже.

Встроенный шаблон SMS от Circuit Digest Cloud
Ранее мы рассмотрели как сгенерировать ключ API для отправки SMS из Circuit Digest Cloud для ESP32. Теперь мы узнаем о предопределенных шаблонах SMS и о том, как выбрать тот, который подходит для нашего конкретного приложения.
| Идентификатор шаблона | Тип шаблона | Сообщение |
| 101 | Device Status Alert
Оповещение о состоянии устройства |
Ваш {#var#} в данный момент находится по адресу {#var#}. |
| 102 | Temperature Alert
Предупреждение о перепаде температуры |
Температура в {#var#} достигла {#var#}°C. Пожалуйста, примите необходимые меры. |
| 103 | Motion Detected
Обнаружено движение |
Обнаружено движение в {#var#}. Немедленно проведите расследование. |
| 104 | Battery Low Alert Предупреждение о низком заряде батареи |
Уровень заряда батареи {#var#} критически низкий — {#var#}%. Немедленно зарядите. |
| 105 | Periodic Reminder
Периодическое напоминание |
Ваш {#var#} в данный момент находится по адресу {#var#}. |
| 106 | Service Reminder
Напоминание об обслуживании |
Пришло время провести техническое обслуживание вашего {#var#}. Последнее обслуживание проводилось на {#var#}. |
| 107 | Error Notification
Уведомление об ошибке |
В {#var#} обнаружена ошибка {#var#}. Пожалуйста, немедленно устраните неполадку. |
| 108 | Door/Window Status
Состояние двери/окна |
В данный момент переменная {#var#} заменена на {#var#}. Пожалуйста, обеспечьте безопасность. |
| 109 | System Reboot
Перезагрузка системы |
Система {#var#} была перезагружена в {#var#}. Проверьте работоспособность. |
| 110 | Location Tracking
Отслеживание местоположения |
Устройство {#var#} в настоящее время находится по адресу {#var#}. |
| 111 | Task Completion
Завершение задачи |
Задача {#var#} успешно выполнена в {#var#}. |
| 112 | Connection Lost Alert
Предупреждение о потере соединения |
Соединение с {#var#} было потеряно в {#var#}. Пожалуйста, проверьте сеть или устройство. |
| 113 | Maintenance Needed
Требуется техническое обслуживание |
Переменная {#var#} требует технического обслуживания. Обнаружена проблема: {#var#}. |
| 114 | Overload Alert
Предупреждение о перегрузке |
Перегрузка сети {#var#}. Текущая нагрузка: {#var#}. Пожалуйста, сократите использование. |
| 115 | Unauthorized Access
Несанкционированный доступ |
Обнаружен несанкционированный доступ в {#var#} по адресу {#var#}. Немедленно проверьте. |
Здесь вы найдете список шаблонов SMS-сообщений, каждый из которых предназначен для конкретного сценария оповещения. Поскольку я использую датчик DHT11 для запуска SMS-оповещения на основе порогового значения температуры, я выберу «Шаблон оповещения о температуре с ID 102».
| 102 | Предупреждение о перепаде температуры | Температура в {#var#} достигла {#var#}°C. Пожалуйста, примите необходимые меры. |
Итак, давайте обратим внимание на шаблон с ID 102, который понадобится в предстоящей части программирования ESP32. В приведенном выше шаблоне температуры вы можете заметить два параметра «#var#», которые пользователь может настроить.
Например, если я инициализирую глобальные переменные var1 и var2, присутствующие в предстоящем коде для ESP32, значениями «WAREHOUSE» и «30» соответственно, то SMS-уведомление при получении должно выглядеть примерно так.

Обзор кода Arduino
Прежде чем углубляться в подробное объяснение кода, давайте разберемся в основной логике этого кода на C++. Этот код заставляет ESP32 искать авторизованную точку доступа Wi-Fi и устанавливать соединение, используя учетные данные. Затем он инициализирует датчик температуры DHT11 для непрерывного получения данных о температуре.
Если температура достигает 30 градусов Цельсия или выше, ESP32 отправляет SMS-уведомление, используя SMS API. Хорошо, надеюсь, теперь вам всё понятно. Перейдём к программированию.
Заголовочные файлы:
|
1 2 3 |
#include <WiFi.h> #include <DHT.h> #include <DHT_U.h> |
Здесь,
-
WiFi.h — это специальная библиотека WiFi для платы ESP32, используемая для обработки задач, специфичных для WiFi, таких как подключение к авторизованной сети и отправка HTTP-запросов клиенту через WiFi.
-
DHT.h и DHT_U.h — это файлы, упрощающие процесс связи ESP32 с датчиком DHT11 по фирменному протоколу One-Wire.
Обратите внимание, что нам не нужно устанавливать файл «WiFi.h» отдельно, как мы это делаем для «DHT.h», поскольку он уже входит в состав платы ESP32, устанавливаемой через менеджер библиотек Arduino IDE.
Библиотеку «DHT11 Sensor» можно легко получить, щелкнув по имени ее заголовочного файла, как я упоминал выше. После загрузки ZIP-файла из репозитория GitHub вы можете установить ее либо через Arduino IDE, перейдя в Sketch -> Include Library -> Add ZIP Library и выбрав загруженный ZIP- файл, либо просто распаковав ZIP-файл в папку библиотек Arduino.
Макрос для определения контакта:
|
1 |
#define Temp_SensorPin 23 |
Здесь я использую макрос для определения того, к какому контакту датчика DHT11 будет подключен вывод данных ESP32. Мы также можем использовать переменную для хранения этих данных, но предпочтительнее использовать макросы вместо переменных, чтобы сэкономить место в памяти, особенно во встраиваемых системах.
Создание экземпляра класса DHT_Unified:
|
1 |
DHT_Unified dht(Temp_SensorPin, DHT11); |
Это создает объект с именем «dht» для класса «DHT_Unified», который инициализирует датчик DHT11 для получения температуры, передавая в качестве параметра значение макроса «Temp_SensorPin», чтобы ESP32 мог получать данные с этого конкретного контакта.
Объявление глобальных переменных для хранения ценных данных
|
1 2 3 |
// WiFi credentials const char *ssid = "Semicon Media"; // Your network SSID (from arduino_secrets.h) const char *password = "xxxxxxxxxx"; // Your network password (from arduino_secrets.h) |
Эти переменные «ssid» и «password» используются для хранения учетных данных точки доступа Wi-Fi, к которой будет подключаться ESP32.
// Учетные данные API и информация для SMS
const char* apiKey = "xxxxxxxxxxxxxxx"; // Замените на ваш ключ API
const char* templateID = "102"; // Замените на ваш ID шаблона
const char* mobileNumber = "91xxxxxxxxxx"; // Замените на номер мобильного телефона получателя с кодом страны (например: 91XXXXXXXXXX)
const char* var1 = "WAREHOUSE"; // Замените на вашу пользовательскую переменную
const char* var2 = "30"; // Замените на вашу пользовательскую переменную
Указанные выше переменные используются для хранения учетных данных SMS API, номера мобильного телефона получателя, а также идентификатора шаблона SMS и настраиваемых переменных. Убедитесь, что вы заменили «apikey» на сгенерированный вами новый ключ.
Здесь я также инициализирую значения «var1» и «var2» как «WAREHOUSE» и «30» , что отразится на итоговом SMS-сообщении, как я уже упоминал ранее.
|
1 |
float temperature = 0.0; |
Эта переменная используется для хранения данных о температуре, поступающих от датчика DHT11. В данном случае я изначально установил её значение равным нулю, чтобы избежать хранения некорректных данных.
Функция read_temperature() для получения данных о температуре:
|
1 2 3 4 5 6 7 8 |
//Functiom to read the temperature data from the DHT11 sensor void read_temperature(){ sensors_event_t event; dht.temperature().getEvent(&event); temperature = event.temperature; Serial.println(temperature); delay(200); } |
Эта функция используется для считывания текущих данных о температуре с датчика DHT11 с помощью его предопределенных функций и сохраняет это значение в переменной «temperature». Затем она также выводит его на последовательный монитор для целей отладки.
Функция sensSMS() для запуска SMS-уведомлений через SMS API:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
void sendSMS() { if (WiFi.status() == WL_CONNECTED) { WiFiClient client; // Initialize WiFi client String apiUrl = "/send_sms?ID=" + String(templateID); Serial.print("Connecting to server..."); if (client.connect("www.circuitdigest.cloud", 80)) { // Connect to the server Serial.println("connected!"); // Create the HTTP POST request String payload = "{\"mobiles\":\"" + String(mobileNumber) + "\",\"var1\":\"" + String(var1) + "\",\"var2\":\"" + String(var2) + "\"}"; // Send HTTP request headers client.println("POST " + apiUrl + " HTTP/1.1"); client.println("Host: www.circuitdigest.cloud"); client.println("Authorization: " + String(apiKey)); client.println("Content-Type: application/json"); client.println("Content-Length: " + String(payload.length())); client.println(); // End of headers client.println(payload); // Send the JSON payload // Wait for the response int responseCode = -1; // Variable to store HTTP response code while (client.connected() || client.available()) { if (client.available()) { String line = client.readStringUntil('\n'); // Read a line from the response Serial.println(line); // Print the response line (for debugging) // Check for the HTTP response code if (line.startsWith("HTTP/")) { responseCode = line.substring(9, 12).toInt(); // Extract response code (e.g., 200, 404) Serial.print("HTTP Response Code: "); Serial.println(responseCode); } // Stop reading headers once we reach an empty line if (line == "\r") { break; } } } // Check response if (responseCode == 200) { Serial.println("SMS sent successfully!"); } else { Serial.print("Failed to send SMS. Error code: "); Serial.println(responseCode); } client.stop(); // Disconnect from the server } else { Serial.println("Connection to server failed!"); } } else { Serial.println("WiFi not connected!"); } } |
Эта функция SMS специально разработана для отправки SMS-уведомлений при вызове другими функциями. Сначала она проверяет, подключена ли сеть Wi-Fi, а затем создает Wi-Fi-клиент для установления соединения с сервером.
Затем программа формирует HTTP POST-запрос с необходимыми заголовками и JSON-данными, содержащими информацию об SMS-сообщении. После отправки запроса она ожидает код ответа сервера, чтобы определить статус отправки SMS.
Функция setup()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { // put your setup code here, to run once: Serial.begin(9600); // We start by connecting to a WiFi network Serial.println(); Serial.println("******************************************************"); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); dht.begin(); } |
Прежде всего, программа подключает ESP32 к существующей сети Wi-Fi, используя свои учетные данные, а затем проверяет, подключена ли она к сети. Если да, то выводит IP-адрес ESP32.
Наконец, вызывается функция dht.begin(), чтобы подготовить датчик DHT11 к получению данных о температуре окружающей среды и отправке их на входной контакт ESP32.
Функция loop()
|
1 2 3 4 5 6 7 8 9 10 |
void loop() { read_temperature(); if(temperature >= 30.00){ sendSMS(); //Stop sending further SMS alerts until the temperature gets back to 28 while(temperature > 28){ read_temperature(); } } } |
Функция loop() используется для непрерывного получения данных о температуре с датчика DHT11 и проверки, превышает ли она 30 градусов Цельсия или равна им. Если да, то запускается SMS-уведомление, и дальнейшие SMS-уведомления прекращаются до тех пор, пока температура не вернется к 28 градусам Цельсия.
Загрузка кода
Итак, этап кодирования завершен, перейдем к этапу загрузки кода. Для этого убедитесь, что плата ESP32 выбрана правильно. Поскольку существует множество вариантов плат разработки на базе ESP32, выберите подходящую именно для вашей платы ESP32.

После этого убедитесь, что в Arduino IDE правильно выбран последовательный порт ESP32. Иногда опция выбора порта недоступна (заблокирована), что означает, что в вашей системе не установлен необходимый драйвер USB-UART. Убедитесь, что он установлен.

Наконец, нажмите кнопку загрузки, чтобы сохранить скомпилированный код во флэш-память вашего ESP32.

Тестирование работы проекта
Мы вступаем в самую захватывающую часть, да! Вы всё правильно поняли, мы находимся на заключительном этапе тестирования, чтобы наш ESP32 мог отправлять SMS-уведомления без необходимости использования сложных и дорогостоящих GSM-модулей.
Давайте проверим это.
Здесь вы можете увидеть, что ESP32 отправляет SMS-уведомление на мой телефон, когда температура достигает 30 градусов Цельсия.






Уж лучше использовать российские гейты, что бы на любой +7 можно было отправлять.
Если не сложно посоветуйте здесь в комментариях такие гейты. Я просто таких не знаю.
А индийский сайт, сервис которого упоминается в данной статье, я с него очень много просто уже полезных статей перевел и ко многим есть слова благодарности в комментариях. Заслужил он, так сказать, доверие и мое, и пользователей моего сайта. А с этой вот статьей такая неувязочка вышла, к сожалению
!!!only India cellphones!!!
Ну у всего бесплатного есть недостатки. Установите себе eSIM, которая может работать в Индии. Сейчас много разных акций по eSIM, можно взять бесплатный пакет с несколькими десятками Мб трафика