ESP32 SIM800L: отправка текстовых сообщений (SMS-оповещения) с показаниями датчиков
В этом проекте мы создадим систему SMS-уведомлений с модулем T-Call ESP32 SIM800L, которая отправляет SMS, когда показания датчика превышают или падают ниже определённого порогового значения.
В этом примере мы будем использовать датчик температуры DS18B20, и отправим текстовое сообщение, когда температура превысит 28°C. Как только температура опустится ниже порогового значения, мы отправим ещё одно SMS-оповещение.
Чтобы отправить SMS с модулем T-Call ESP32 SIM800L, достаточно использовать modem.sendSMS(SMS_TARGET, smsMessage) после инициализации объекта modem для модуля SIM800L (с использованием библиотеки TinyGSM).
Важно: SIM800L работает в сетях 2G, поэтому он будет работать только в вашей стране, если доступны сети 2G. Проверьте, есть ли в вашей стране сеть 2G, иначе он не будет работать.
Обзор проекта
Этот урок разделён на две части:
Отправка SMS с TTGO T-Call ESP32 SIM800L: вы узнаете, как отправить простое сообщение «Hello World».
Система SMS-уведомлений с показаниями датчиков: отправка сообщения каждый раз, когда показания температуры пересекают пороговое значение.
ESP32 получает новые показания температуры каждые 5 секунд
Проверяет, превышает ли температура пороговое значение
Если температура выше порога, отправляет SMS-оповещение с текущим значением температуры
Когда температура опускается ниже порога, отправляет ещё одно оповещение
ESP32 отправляет только одно SMS каждый раз, когда показания температуры пересекают пороговое значение
Вы можете модифицировать этот проект для вашего конкретного случая. Например, вы можете перевести ESP32 в режим глубокого сна и отправлять SMS каждый час с текущими показаниями температуры и т.д.
Вам также может понравиться: ESP32 Publish Data to Cloud without Wi-Fi (TTGO T-Call ESP32 SIM800L)
TTGO T-Call ESP32 SIM800L
TTGO T-Call — это новая плата разработки ESP32, которая объединяет модуль GSM/GPRS SIM800L. Вы можете приобрести её примерно за $11.
Помимо Wi-Fi и Bluetooth, вы можете общаться с этой платой ESP32 с помощью SMS, телефонных звонков или подключить её к интернету. В этом уроке вы узнаете, как отправить SMS-уведомление.
Для полного обзора этой платы вы можете прочитать следующую статью: $11 TTGO T-Call ESP32 with SIM800L GSM/GPRS (Overview)
Необходимые условия
1. Дополнение ESP32 для Arduino IDE
Мы будем программировать ESP32 с помощью Arduino IDE. Поэтому вам необходимо установить дополнение ESP32 в вашей Arduino IDE. Следуйте следующему руководству, если вы ещё этого не сделали.
2. Предоплаченная SIM-карта (тарифный план SMS)
Для использования платы TTGO T-Call ESP32 SIM800L вам нужна nano SIM-карта. Мы рекомендуем использовать SIM-карту с предоплаченным или ежемесячным планом, чтобы вы точно знали, сколько потратите.
3. Библиотеки
Для этого проекта вам также необходимо установить библиотеку TinyGSM для взаимодействия с модулем SIM800L, а также библиотеку One Wire от Paul Stoffregen и библиотеку Dallas Temperature для получения показаний датчика температуры DS18B20.
Установка библиотеки TinyGSM
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться Library Manager. Найдите TinyGSM. Выберите библиотеку TinyGSM от Volodymyr Shymanskyy.
Установка библиотек DS18B20
В Arduino IDE Library Manager введите «onewire» в поле поиска и установите библиотеку OneWire от Paul Stoffregen.
Затем найдите «Dallas» и установите библиотеку DallasTemperature от Miles Burton.
После установки библиотек перезапустите Arduino IDE.
Необходимые компоненты
Для выполнения этого урока вам понадобятся следующие компоненты:
Nano SIM-карта с тарифным планом SMS
Антенна (опционально)
Датчик температуры DS18B20 (Руководство по датчику DS18B20 с ESP32)
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Примечание: у нас возникли проблемы с уровнем сигнала антенны, которая шла в комплекте с платой, поэтому мы использовали другую антенну (как показано ниже), и все проблемы с подключением были решены.
Отправка SMS с T-Call ESP32 SIM800L
В этом разделе мы покажем, как отправить SMS с платой T-Call ESP32 SIM800L. Давайте создадим простой пример, который отправляет сообщение «Hello from ESP32!» на ваш смартфон.
Скопируйте следующий код в Arduino IDE. Но пока не загружайте его, вам нужно вставить номер телефона получателя в код.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-sim800l-send-text-messages-sms/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
// SIM card PIN (leave empty, if not defined)
const char simPIN[] = "";
// Your phone number to send SMS: + (plus sign) and country code, for Portugal +351, followed by phone number
// SMS_TARGET Example for Portugal +351XXXXXXXXX
#define SMS_TARGET "+351XXXXXXXXX"
// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#include <Wire.h>
#include <TinyGsmClient.h>
// TTGO T-Call pins
#define MODEM_RST 5
#define MODEM_PWKEY 4
#define MODEM_POWER_ON 23
#define MODEM_TX 27
#define MODEM_RX 26
#define I2C_SDA 21
#define I2C_SCL 22
// Set serial for debug console (to Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to SIM800 module)
#define SerialAT Serial1
// Define the serial console for debug prints, if needed
//#define DUMP_AT_COMMANDS
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
#define IP5306_ADDR 0x75
#define IP5306_REG_SYS_CTL0 0x00
bool setPowerBoostKeepOn(int en){
Wire.beginTransmission(IP5306_ADDR);
Wire.write(IP5306_REG_SYS_CTL0);
if (en) {
Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on
} else {
Wire.write(0x35); // 0x37 is default reg value
}
return Wire.endTransmission() == 0;
}
void setup() {
// Set console baud rate
SerialMon.begin(115200);
// Keep power when running from battery
Wire.begin(I2C_SDA, I2C_SCL);
bool isOk = setPowerBoostKeepOn(1);
SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL"));
// Set modem reset, enable, power pins
pinMode(MODEM_PWKEY, OUTPUT);
pinMode(MODEM_RST, OUTPUT);
pinMode(MODEM_POWER_ON, OUTPUT);
digitalWrite(MODEM_PWKEY, LOW);
digitalWrite(MODEM_RST, HIGH);
digitalWrite(MODEM_POWER_ON, HIGH);
// Set GSM module baud rate and UART pins
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
delay(3000);
// Restart SIM800 module, it takes quite some time
// To skip it, call init() instead of restart()
SerialMon.println("Initializing modem...");
modem.restart();
// use modem.init() if you don't need the complete restart
// Unlock your SIM card with a PIN if needed
if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
modem.simUnlock(simPIN);
}
// To send an SMS, call modem.sendSMS(SMS_TARGET, smsMessage)
String smsMessage = "Hello from ESP32!";
if(modem.sendSMS(SMS_TARGET, smsMessage)){
SerialMon.println(smsMessage);
}
else{
SerialMon.println("SMS failed to send");
}
}
void loop() {
delay(1);
}
Как работает код
Вставьте PIN-код вашей SIM-карты в следующую переменную. Если он не определён, вы можете оставить эту переменную пустой.
// SIM card PIN (leave empty, if not defined)
const char simPIN[] = "";
Затем добавьте номер телефона, на который хотите отправить SMS. Номер должен быть в международном формате, иначе он не будет работать: знак плюс (+) и код страны, для Португалии +351, затем номер телефона.
Пример для Португалии +351XXXXXXXXX
#define SMS_TARGET "+351XXXXXXXXXXXX"
Настройте библиотеку TinyGSM для работы с модемом SIM800L:
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
Подключите следующие библиотеки:
#include <Wire.h>
#include <TinyGsmClient.h>
Следующие строки определяют пины, используемые модулем SIM800L:
#define MODEM_RST 5
#define MODEM_PWKEY 4
#define MODEM_POWER_ON 23
#define MODEM_TX 27
#define MODEM_RX 26
#define I2C_SDA 21
#define I2C_SCL 22
Инициализируйте последовательное соединение для взаимодействия с Serial Monitor и ещё одно для взаимодействия с модулем SIM800L.
// Set serial for debug console (to Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to SIM800 module)
#define SerialAT Serial1
В setup() инициализируйте Serial Monitor.
SerialMon.begin(115200);
Настройте пины SIM800L в правильное состояние для работы:
pinMode(MODEM_PWKEY, OUTPUT);
pinMode(MODEM_RST, OUTPUT);
pinMode(MODEM_POWER_ON, OUTPUT);
digitalWrite(MODEM_PWKEY, LOW);
digitalWrite(MODEM_RST, HIGH);
digitalWrite(MODEM_POWER_ON, HIGH);
Инициализируйте последовательное соединение с модулем SIM800L:
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
Инициализируйте модуль SIM800L и разблокируйте PIN-код SIM-карты, если необходимо.
SerialMon.println("Initializing modem...");
modem.restart();
// use modem.init() if you don't need the complete restart
// Unlock your SIM card with a PIN if needed
if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
modem.simUnlock(simPIN);
}
Для отправки SMS вам нужно использовать метод sendSMS() на объекте modem и передать в качестве аргументов номер телефона получателя и сообщение.
modem.sendSMS(SMS_TARGET, smsMessage);
В данном случае сообщение — «Hello from ESP32!», но его можно заменить другой информацией, например данными датчиков.
String smsMessage = "Hello from ESP32!";
if(modem.sendSMS(SMS_TARGET, smsMessage)){
SerialMon.println(smsMessage);
}
else{
SerialMon.println("SMS failed to send");
}
Демонстрация
С nano SIM-картой, вставленной в модуль, загрузите код на вашу плату T-Call ESP32 SIM800L.
Перейдите в Tools > Board и выберите ESP32 Dev Module. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ваша плата. Наконец, нажмите кнопку загрузки, чтобы загрузить код на плату.
Примечание: на данный момент для T-Call ESP32 SIM800L нет отдельной платы в списке, но мы выбрали ESP32 Dev Module, и всё работает нормально.
После загрузки кода откройте Serial Monitor на скорости 115200 бод, чтобы увидеть, что происходит.
Через несколько секунд вы должны получить SMS на номер телефона получателя.
Устранение неполадок
Если на данный момент вы не получили SMS, это может быть вызвано одной из следующих причин:
Этот модуль работает только если в вашей стране поддерживается 2G;
Номер телефона может содержать опечатку или неправильно отформатирован (без знака плюс (+) и кода страны);
Антенна может работать неправильно. В нашем случае мы заменили антенну на эту;
Возможно, вам нужно выйти на улицу для лучшего покрытия сигнала;
Или вы можете не обеспечивать достаточный ток для модуля. Если вы подключаете модуль к компьютеру через USB-хаб, он может не обеспечивать достаточный ток для работы.
Система SMS-уведомлений ESP32
В этом разделе мы покажем, как создать систему SMS-уведомлений, которая отправляет текстовое сообщение, когда показания датчика пересекают заданное пороговое значение температуры.
Схема подключения
Перед продолжением подключите датчик температуры DS18B20 к плате T-Call ESP32 SIM800L, как показано на следующей схеме. Мы подключаем вывод данных DS18B20 к GPIO 13.
Код
Скопируйте следующий код в Arduino IDE. Вставьте номер телефона получателя и установите пороговое значение. Затем вы можете загрузить код на плату T-Call ESP32 SIM800L.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-sim800l-send-text-messages-sms/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
// SIM card PIN (leave empty, if not defined)
const char simPIN[] = "";
// Your phone number to send SMS: + (plus sign) and country code, for Portugal +351, followed by phone number
// SMS_TARGET Example for Portugal +351XXXXXXXXX
#define SMS_TARGET "+351XXXXXXXXX"
// Define your temperature Threshold (in this case it's 28.0 degrees Celsius)
float temperatureThreshold = 28.0;
// Flag variable to keep track if alert SMS was sent or not
bool smsSent = false;
// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#include <Wire.h>
#include <TinyGsmClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// GPIO where the DS18B20 is connected to
const int oneWireBus = 13;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
// TTGO T-Call pins
#define MODEM_RST 5
#define MODEM_PWKEY 4
#define MODEM_POWER_ON 23
#define MODEM_TX 27
#define MODEM_RX 26
#define I2C_SDA 21
#define I2C_SCL 22
// Set serial for debug console (to Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to SIM800 module)
#define SerialAT Serial1
// Define the serial console for debug prints, if needed
//#define DUMP_AT_COMMANDS
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
#define IP5306_ADDR 0x75
#define IP5306_REG_SYS_CTL0 0x00
bool setPowerBoostKeepOn(int en){
Wire.beginTransmission(IP5306_ADDR);
Wire.write(IP5306_REG_SYS_CTL0);
if (en) {
Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on
} else {
Wire.write(0x35); // 0x37 is default reg value
}
return Wire.endTransmission() == 0;
}
void setup() {
// Set console baud rate
SerialMon.begin(115200);
// Keep power when running from battery
Wire.begin(I2C_SDA, I2C_SCL);
bool isOk = setPowerBoostKeepOn(1);
SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL"));
// Set modem reset, enable, power pins
pinMode(MODEM_PWKEY, OUTPUT);
pinMode(MODEM_RST, OUTPUT);
pinMode(MODEM_POWER_ON, OUTPUT);
digitalWrite(MODEM_PWKEY, LOW);
digitalWrite(MODEM_RST, HIGH);
digitalWrite(MODEM_POWER_ON, HIGH);
// Set GSM module baud rate and UART pins
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
delay(3000);
// Restart SIM800 module, it takes quite some time
// To skip it, call init() instead of restart()
SerialMon.println("Initializing modem...");
modem.restart();
// use modem.init() if you don't need the complete restart
// Unlock your SIM card with a PIN if needed
if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
modem.simUnlock(simPIN);
}
// Start the DS18B20 sensor
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
// Temperature in Celsius degrees
float temperature = sensors.getTempCByIndex(0);
SerialMon.print(temperature);
SerialMon.println("*C");
// Temperature in Fahrenheit degrees
/*float temperature = sensors.getTempFByIndex(0);
SerialMon.print(temperature);
SerialMon.println("*F");*/
// Check if temperature is above threshold and if it needs to send the SMS alert
if((temperature > temperatureThreshold) && !smsSent){
String smsMessage = String("Temperature above threshold: ") +
String(temperature) + String("C");
if(modem.sendSMS(SMS_TARGET, smsMessage)){
SerialMon.println(smsMessage);
smsSent = true;
}
else{
SerialMon.println("SMS failed to send");
}
}
// Check if temperature is below threshold and if it needs to send the SMS alert
else if((temperature < temperatureThreshold) && smsSent){
String smsMessage = String("Temperature below threshold: ") +
String(temperature) + String("C");
if(modem.sendSMS(SMS_TARGET, smsMessage)){
SerialMon.println(smsMessage);
smsSent = false;
}
else{
SerialMon.println("SMS failed to send");
}
}
delay(5000);
}
Как работает код
В предыдущем примере мы уже объяснили, как инициализировать SIM800L и все необходимые настройки. Поэтому давайте перейдём к соответствующим частям этого проекта.
Сначала введите PIN-код вашей SIM-карты. Если он не определён, вы можете оставить эту переменную пустой.
const char simPIN[] = "";
Затем добавьте номер телефона, на который хотите отправить SMS. Номер должен быть в международном формате, иначе он не будет работать.
#define SMS_TARGET "+351XXXXXXXXXXX"
Определите пороговое значение температуры. Мы установили его на 28 градусов Цельсия.
float temperatureThreshold = 28.0;
Создайте переменную для отслеживания, было ли отправлено SMS или нет.
bool smsSent = false;
Датчик температуры подключён к GPIO 13, но вы можете использовать любой другой GPIO.
const int oneWireBus = 13;
Связанный контент: ESP32 DS18B20 Temperature Sensor with Arduino IDE (Single, Multiple, Web Server)
В loop() получите показания температуры.
sensors.requestTemperatures();
// Temperature in Celsius degrees
float temperature = sensors.getTempCByIndex(0);
SerialMon.print(temperature);
SerialMon.println("*C");
По умолчанию температура измеряется в градусах Цельсия, но вы можете раскомментировать следующие строки, чтобы использовать температуру в градусах Фаренгейта. Тогда вам также следует настроить пороговое значение в соответствии с вашими единицами измерения температуры.
// Temperature in Fahrenheit degrees
/*float temperature = sensors.getTempFByIndex(0);
SerialMon.print(temperature);
SerialMon.println("*F");*/
После этого следует условие, которое проверяет, превышает ли текущее значение температуры определённый порог и не было ли уже отправлено SMS-оповещение.
if((temperature > temperatureThreshold) && !smsSent){
Если это условие истинно, отправляется SMS с текстом «Temperature above threshold: « и текущим значением температуры.
String smsMessage = String("Temperature above threshold: ") +
String(temperature) + String("C");
if(modem.sendSMS(SMS_TARGET, smsMessage)){
SerialMon.println(smsMessage);
smsSent = true;
}
else{
SerialMon.println("SMS failed to send");
}
Как видите, для отправки текстового сообщения используется метод sendSMS() на объекте modem. Вам нужно передать в качестве аргументов номер телефона, на который вы хотите отправить SMS, и содержимое сообщения.
if(modem.sendSMS(SMS_TARGET, smsMessage)){
После отправки сообщения установите переменную smsSent в true, чтобы избежать множественных SMS-оповещений при достижении одного и того же порога.
smsSent = true;
Когда температура опускается ниже порога, мы также получаем SMS.
else if((temperature < temperatureThreshold) && smsSent){
String smsMessage = String("Temperature below threshold: ") +
String(temperature) + String("C");
if(modem.sendSMS(SMS_TARGET, smsMessage)){
SerialMon.println(smsMessage);
smsSent = false;
}
else{
SerialMon.println("SMS failed to send");
}
}
На этот раз установите переменную smsSent в false, чтобы мы прекратили получать сообщения ниже порога.
Эти условия проверяются каждые 5 секунд, но вы можете изменить время задержки.
Загрузка кода
После ввода номера телефона получателя и PIN-кода SIM-карты загрузите скетч на ваш ESP32.
Перейдите в Tools > Board и выберите ESP32 Dev module
Затем перейдите в Tools > Port и выберите COM-порт, к которому подключён ESP32
Нажмите кнопку Upload
Через несколько секунд код должен быть успешно загружен.
Вы также можете открыть Serial Monitor на скорости 115200 бод, чтобы увидеть текущие показания датчика.
Если приложить палец к датчику, температура начнёт повышаться. Когда она превысит 28°C, будет отправлено SMS.
Когда температура опустится ниже порога, вы получите ещё одно SMS.
Заключение
В этом проекте вы узнали, как отправлять SMS с модулем T-Call ESP32 SIM800L. Теперь вы можете использовать этот проект в реальном приложении и оставить его отправлять SMS-уведомления, когда достигается пороговое значение, или отправлять SMS с показаниями датчиков каждый час, например.
Чтобы сделать этот проект с питанием от батареи, рекомендуется использовать режим глубокого сна и пробуждение ESP32 каждый час для проверки текущей температуры, потому что если вы используете код из этого проекта, он быстро разрядит вашу батарею.
Другие статьи/проекты с платой T-Call ESP32 SIM800L:
Узнайте больше об ESP32 с нашими ресурсами:
Источник: :doc:`Random Nerd Tutorials — ESP32 SIM800L: Send Text Messages (SMS Alert) with Sensor Readings <../esp32-sim800l-send-text-messages-sms/index>`