ESP32 SIM800L: отправка текстовых сообщений (SMS-оповещения) с показаниями датчиков

В этом проекте мы создадим систему SMS-уведомлений с модулем T-Call ESP32 SIM800L, которая отправляет SMS, когда показания датчика превышают или падают ниже определённого порогового значения.

ESP32 SIM800L Send Text Messages (SMS Alert) with Sensor Readings

В этом примере мы будем использовать датчик температуры DS18B20, и отправим текстовое сообщение, когда температура превысит 28°C. Как только температура опустится ниже порогового значения, мы отправим ещё одно SMS-оповещение.

Чтобы отправить SMS с модулем T-Call ESP32 SIM800L, достаточно использовать modem.sendSMS(SMS_TARGET, smsMessage) после инициализации объекта modem для модуля SIM800L (с использованием библиотеки TinyGSM).

Важно: SIM800L работает в сетях 2G, поэтому он будет работать только в вашей стране, если доступны сети 2G. Проверьте, есть ли в вашей стране сеть 2G, иначе он не будет работать.

Обзор проекта

Этот урок разделён на две части:

  1. Отправка SMS с TTGO T-Call ESP32 SIM800L: вы узнаете, как отправить простое сообщение «Hello World».

  2. Система SMS-уведомлений с показаниями датчиков: отправка сообщения каждый раз, когда показания температуры пересекают пороговое значение.

SMS Notification System with Sensor Readings using the T-Call ESP32 SIM800L Board
  • 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.

TTGO T-Call ESP32 SIM800L Board

Помимо 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-карту с предоплаченным или ежемесячным планом, чтобы вы точно знали, сколько потратите.

TTGO T-Call ESP32 SIM800L Insert nano SIM card

3. Библиотеки

Для этого проекта вам также необходимо установить библиотеку TinyGSM для взаимодействия с модулем SIM800L, а также библиотеку One Wire от Paul Stoffregen и библиотеку Dallas Temperature для получения показаний датчика температуры DS18B20.

Установка библиотеки TinyGSM

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться Library Manager. Найдите TinyGSM. Выберите библиотеку TinyGSM от Volodymyr Shymanskyy.

Installing TinyGSM library Arduino IDE

Установка библиотек DS18B20

В Arduino IDE Library Manager введите «onewire» в поле поиска и установите библиотеку OneWire от Paul Stoffregen.

Install OneWire library by Paul Stoffregen in Arduino IDE

Затем найдите «Dallas» и установите библиотеку DallasTemperature от Miles Burton.

Install DallasTemperature library by Miles Burton in Arduino IDE

После установки библиотек перезапустите Arduino IDE.

Необходимые компоненты

T-Call ESP32 SIM800L DS18B20 Temperature Sensor Circuit

Для выполнения этого урока вам понадобятся следующие компоненты:

Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

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

Alternative Antenna for TTGO T-Call ESP32 SIM800L Board

Отправка 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-порт, к которому подключена ваша плата. Наконец, нажмите кнопку загрузки, чтобы загрузить код на плату.

Upload Code to Arduino IDE

Примечание: на данный момент для T-Call ESP32 SIM800L нет отдельной платы в списке, но мы выбрали ESP32 Dev Module, и всё работает нормально.

После загрузки кода откройте Serial Monitor на скорости 115200 бод, чтобы увидеть, что происходит.

Initializing the T-Call ESP32 SIM800L Board Serial Monitor Arduino IDE

Через несколько секунд вы должны получить SMS на номер телефона получателя.

Send SMS with T-Call ESP32 SIM800L Board

Устранение неполадок

Если на данный момент вы не получили SMS, это может быть вызвано одной из следующих причин:

  • Этот модуль работает только если в вашей стране поддерживается 2G;

  • Номер телефона может содержать опечатку или неправильно отформатирован (без знака плюс (+) и кода страны);

  • Антенна может работать неправильно. В нашем случае мы заменили антенну на эту;

  • Возможно, вам нужно выйти на улицу для лучшего покрытия сигнала;

  • Или вы можете не обеспечивать достаточный ток для модуля. Если вы подключаете модуль к компьютеру через USB-хаб, он может не обеспечивать достаточный ток для работы.


Система SMS-уведомлений ESP32

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

Схема подключения

Перед продолжением подключите датчик температуры DS18B20 к плате T-Call ESP32 SIM800L, как показано на следующей схеме. Мы подключаем вывод данных DS18B20 к GPIO 13.

T-Call ESP32 SIM800L Wiring to DS18B20 Schematic Diagram

Код

Скопируйте следующий код в 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.

Receive SMS with Temperature Readings from T-Call ESP32 SIM800L Board

Когда температура опустится ниже порога, вы получите ещё одно SMS.

Receive Temperature Below Threshold SMS from T-Call ESP32 SIM800L Board

Заключение

В этом проекте вы узнали, как отправлять 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>`