ESP32: Оповещение по Email на основе порогового значения температуры (изменение параметров через веб-сервер)

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

ESP32 оповещение по Email на основе порогового значения температуры с веб-сервером

Обновлено 12 апреля 2025 г.

Мы будем считывать температуру с помощью датчика DS18B20 и отправлять электронные письма через SMTP-сервер. ESP32 будет программироваться с помощью Arduino IDE.

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

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

На следующем изображении показан общий обзор проекта, который мы будем создавать.

Обзор проекта ESP32 отправка Email через SMTP сервер на основе порогового значения температуры
  • ESP32 размещает веб-сервер, который показывает последние показания температуры с датчика температуры DS18B20.

  • Есть поле ввода для установки порогового значения. Когда температура поднимается выше или опускается ниже порогового значения, вы получите электронное письмо.

  • Вы также можете указать адрес электронной почты получателя на веб-странице.

  • Систему можно активировать или деактивировать через веб-сервер. Если вы решите деактивировать систему, вы не будете получать уведомления по электронной почте, когда температура пересечёт пороговое значение.

На следующем изображении показан обзор страницы веб-сервера.

ESP32 веб-сервер с пороговым значением температуры и уведомлением по Email

Предварительные требования

Перед началом работы над проектом убедитесь, что выполнены все следующие предварительные требования.

1. Дополнение ESP32 для Arduino IDE

Мы будем программировать ESP32 с помощью Arduino IDE. Поэтому вам необходимо установить дополнение ESP32 в вашей Arduino IDE. Следуйте следующему руководству, если вы ещё этого не сделали.

2. Библиотека ESP Mail Client

Для отправки электронных писем с ESP32 мы будем использовать библиотеку ESP-Mail-Client. Выполните следующие шаги для установки библиотеки.

Перейдите в Sketch > Include Library > Manage Libraries и найдите ESP Mail Client. Установите библиотеку ESP Mail Client от Mobizt.

Установка библиотеки ESP Mail Client в Arduino IDE

3. Создание электронной почты отправителя (новый аккаунт)

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

Создайте новый аккаунт электронной почты для отправки писем с ESP32. Если вы хотите использовать аккаунт Gmail, перейдите по этой ссылке для создания нового аккаунта.

Gmail создание нового аккаунта

Создание пароля приложения

Вам необходимо создать пароль приложения, чтобы ESP32 мог отправлять электронные письма с вашего аккаунта Gmail. Пароль приложения – это 16-значный код доступа, который даёт менее безопасному приложению или устройству разрешение на доступ к вашему аккаунту Google. Узнайте больше о входе с паролями приложений здесь.

Пароль приложения можно использовать только с аккаунтами, у которых включена двухэтапная аутентификация (2-step verification).

  1. Откройте ваш Google Account.

  2. В панели навигации выберите Security (Безопасность).

  3. В разделе «Signing in to Google» (Вход в Google) выберите 2-Step Verification > Get started.

  4. Следуйте инструкциям на экране.

После включения двухэтапной аутентификации вы можете создать пароль приложения.

  1. Откройте ваш Google Account.

  2. В панели поиска найдите App Passwords (Пароли приложений).

  3. Откройте меню App Passwords.

Аккаунт Google создание пароля приложения для отправки email с ESP32
  1. Дайте имя паролю приложения, например ESP. Затем нажмите Create (Создать). Появится окно с паролем, который вы будете использовать с ESP32 или ESP8266 для отправки электронных писем. Сохраните этот пароль (даже если написано, что его не нужно запоминать), потому что он понадобится вам позже.

Создание пароля приложения для использования с ESP

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

Сгенерированный пароль приложения Google Account

Теперь у вас должен быть пароль приложения, который вы будете использовать в коде ESP32 для отправки электронных писем.

Пароль приложения Gmail создан для ESP32 отправка email

Если вы используете другого поставщика электронной почты, проверьте, как создать пароль приложения. Вы сможете найти инструкции с помощью быстрого поиска в Google: «ваш_поставщик_почты + create app password».

4. Настройки SMTP-сервера

Перед продолжением вам необходимо знать настройки SMTP-сервера электронной почты отправителя.

Настройки SMTP-сервера Gmail

Если вы используете аккаунт Gmail, вот данные SMTP-сервера:

  • SMTP-сервер: smtp.gmail.com

  • Имя пользователя SMTP: Полный адрес Gmail

  • Пароль SMTP: Ваш пароль Gmail

  • Порт SMTP (TLS): 587

  • Порт SMTP (SSL): 465

  • Требуется SMTP TLS/SSL: да

Настройки SMTP-сервера Outlook

Для аккаунтов Outlook настройки SMTP-сервера следующие:

  • SMTP-сервер: smtp.office365.com

  • Имя пользователя SMTP: Полный адрес электронной почты Outlook

  • Пароль SMTP: Ваш пароль Outlook

  • Порт SMTP: 587

  • Требуется SMTP TLS/SSL: Да

Настройки SMTP-сервера Live или Hotmail

Для аккаунтов Live или Hotmail настройки SMTP-сервера следующие:

  • SMTP-сервер: smtp.live.com

  • Имя пользователя SMTP: Полный адрес электронной почты Live/Hotmail

  • Пароль SMTP: Ваш пароль Windows Live Hotmail

  • Порт SMTP: 587

  • Требуется SMTP TLS/SSL: Да

Если вы используете другого поставщика электронной почты, вам нужно найти настройки его SMTP-сервера.

5. Библиотеки Async Web Server и DS18B20

Библиотеки AsyncWebServer

В этом проекте мы создадим асинхронный веб-сервер, используя следующие библиотеки:

Вы можете установить эти библиотеки в менеджере библиотек Arduino. Откройте менеджер библиотек, нажав на значок библиотеки в левой боковой панели.

Найдите ESPAsyncWebServer и установите ESPAsyncWebServer от ESP32Async.

Установка ESPAsyncWebServer ESP32 Arduino IDE

Затем установите библиотеку AsyncTCP. Найдите AsyncTCP и установите AsyncTCP от ESP32Async.

Установка AsyncTCP ESP32 Arduino IDE

Библиотеки DS18B20

Для DS18B20 мы будем использовать следующие библиотеки.

Вы можете установить их через менеджер библиотек Arduino. Перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек. Затем найдите названия библиотек и установите их.

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

ESP32 с датчиком температуры DS18B20

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

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

Подключите датчик температуры DS18B20 к ESP32, как показано на следующей схеме, с выводом данных, подключённым к GPIO 4.

Схема подключения датчика температуры DS18B20 к плате ESP32

Код ESP32 – веб-сервер для Email-оповещений

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

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-email-alert-temperature-threshold/
  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.
*********/

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP_Mail_Client.h>

// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// To send Emails using Gmail on port 465 (SSL), you need to create an app password: https://support.google.com/accounts/answer/185833
#define emailSenderAccount    "example_sender_account@gmail.com"
#define emailSenderPassword   "email_sender_app_password"
#define smtpServer            "smtp.gmail.com"
#define smtpServerPort        465
#define emailSubject          "[ALERT] ESP32 Temperature"

// Default Recipient Email Address
String inputMessage = "your_email_recipient@gmail.com";
String enableEmailChecked = "checked";
String inputMessage2 = "true";
// Default Threshold Temperature Value
String inputMessage3 = "25.0";
String lastTemperature;

// HTML web page to handle 3 input fields (email_input, enable_email_input, threshold_input)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>Email Notification with Temperature</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  </head><body>
  <h2>DS18B20 Temperature</h2>
  <h3>%TEMPERATURE% C</h3>
  <h2>ESP Email Notification</h2>
  <form action="/get">
    Email Address <input type="email" name="email_input" value="%EMAIL_INPUT%" required><br>
    Enable Email Notification <input type="checkbox" name="enable_email_input" value="true" %ENABLE_EMAIL%><br>
    Temperature Threshold <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
    <input type="submit" value="Submit">
  </form>
</body></html>)rawliteral";

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

AsyncWebServer server(80);

// Replaces placeholder with DS18B20 values
String processor(const String& var){
  if(var == "TEMPERATURE"){
    return lastTemperature;
  }
  else if(var == "EMAIL_INPUT"){
    return inputMessage;
  }
  else if(var == "ENABLE_EMAIL"){
    return enableEmailChecked;
  }
  else if(var == "THRESHOLD"){
    return inputMessage3;
  }
  return String();
}

// Flag variable to keep track if email notification was sent or not
bool emailSent = false;

const char* PARAM_INPUT_1 = "email_input";
const char* PARAM_INPUT_2 = "enable_email_input";
const char* PARAM_INPUT_3 = "threshold_input";

// Interval between sensor readings
unsigned long previousMillis = 0;
const long interval = 5000;

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

// SMTP session object
SMTPSession smtp;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Failed!");
    return;
  }
  Serial.println();
  Serial.print("ESP IP Address: http://");
  Serial.println(WiFi.localIP());

  // Start the DS18B20 sensor
  sensors.begin();

  // Send web page to client
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/html", index_html, processor);
  });

  // Receive an HTTP GET request at <ESP_IP>/get?email_input=<inputMessage>&enable_email_input=<inputMessage2>&threshold_input=<inputMessage3>
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
    if (request->hasParam(PARAM_INPUT_1)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      if (request->hasParam(PARAM_INPUT_2)) {
        inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
        enableEmailChecked = "checked";
      }
      else {
        inputMessage2 = "false";
        enableEmailChecked = "";
      }
      if (request->hasParam(PARAM_INPUT_3)) {
        inputMessage3 = request->getParam(PARAM_INPUT_3)->value();
      }
    }
    else {
      inputMessage = "No message sent";
    }
    Serial.println(inputMessage);
    Serial.println(inputMessage2);
    Serial.println(inputMessage3);
    request->send(200, "text/html", "HTTP GET request sent to your ESP.<br><a href=\"/\">Return to Home Page</a>");
  });
  server.onNotFound(notFound);
  server.begin();

  // Initialize ESP-Mail-Client
  MailClient.networkReconnect(true);
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    sensors.requestTemperatures();
    // Temperature in Celsius degrees
    float temperature = sensors.getTempCByIndex(0);
    Serial.print(temperature);
    Serial.println(" *C");

    lastTemperature = String(temperature);

    // Check if temperature is above threshold and if it needs to send the Email alert
    if(temperature > inputMessage3.toFloat() && inputMessage2 == "true" && !emailSent){
      String emailMessage = String("Temperature above threshold. Current temperature: ") +
                            String(temperature) + String("C");
      if(sendEmailNotification(emailMessage)) {
        Serial.println(emailMessage);
        emailSent = true;
      }
      else {
        Serial.println("Email failed to send");
      }
    }
    // Check if temperature is below threshold and if it needs to send the Email alert
    else if((temperature < inputMessage3.toFloat()) && inputMessage2 == "true" && emailSent) {
      String emailMessage = String("Temperature below threshold. Current temperature: ") +
                            String(temperature) + String(" C");
      if(sendEmailNotification(emailMessage)) {
        Serial.println(emailMessage);
        emailSent = false;
      }
      else {
        Serial.println("Email failed to send");
      }
    }
  }
}

bool sendEmailNotification(String emailMessage) {
  // Configure the session
  ESP_Mail_Session session;
  session.server.host_name = smtpServer;
  session.server.port = smtpServerPort;
  session.login.email = emailSenderAccount;
  session.login.password = emailSenderPassword;
  session.login.user_domain = "";

  // Configure the message
  SMTP_Message message;
  message.sender.name = "ESP32";
  message.sender.email = emailSenderAccount;
  message.subject = emailSubject;
  message.addRecipient("Recipient", inputMessage);
  message.text.content = emailMessage.c_str();
  message.text.charSet = "utf-8";
  message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
  message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_high;
  // Set the callback function
  smtp.callback(smtpCallback);

  // Connect to the server and send the email
  if (!smtp.connect(&session)) {
    Serial.println("Failed to connect to SMTP server: " + smtp.errorReason());
    return false;
  }

  if (!MailClient.sendMail(&smtp, &message)) {
    Serial.println("Error sending Email: " + smtp.errorReason());
    smtp.closeSession();
    return false;
  }

  smtp.closeSession();
  return true;
}

// Callback function for email sending status
void smtpCallback(SMTP_Status status) {
  Serial.println(status.info());
  if (status.success()) {
    Serial.println("Email sent successfully");
    Serial.println("----------------");
  }
}

Посмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу демонстрации.

Библиотеки

Начните с импорта необходимых библиотек. WiFi, AsyncTCP и ESPAsyncWebServer необходимы для создания веб-сервера. OneWire и DallasTemperature необходимы для взаимодействия с DS18B20, а ESP_Mail_Client необходим для отправки электронных писем с ESP32 через SMTP-сервер.

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP_Mail_Client.h>

Учётные данные сети

Вставьте учётные данные вашей сети в следующие строки:

// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Настройки электронной почты

Вставьте адрес электронной почты отправителя – это адрес, который будет использоваться ESP32 для отправки писем.

#define emailSenderAccount "example_sender_account@gmail.com"

Введите пароль приложения отправителя электронной почты (это ПАРОЛЬ ПРИЛОЖЕНИЯ, который вы определили ранее – это не пароль от электронной почты):

#define emailSenderPassword   "email_sender_app_password"

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

#define smtpServer      "smtp.gmail.com"
#define smtpServerPort  465

Вставьте тему письма в следующей строке:

#define emailSubject "[ALERT] ESP32 Temperature"

Вспомогательные переменные

Далее у нас есть несколько вспомогательных переменных для сохранения значений, отправленных через форму. Переменная inputMessage хранит адрес электронной почты получателя. Вы можете вставить адрес получателя по умолчанию. Адрес электронной почты получателя можно изменить позже через форму.

String inputMessage = "your_email_recipient@gmail.com";

Переменная enableEmailChecked сообщает нам, отмечен ли флажок отправки электронной почты или нет.

String enableEmailChecked = "checked";

Если он отмечен, значение, сохранённое в inputMessage2, должно быть установлено в true.

String inputMessage2 = "true";

Переменная inputMessage3 хранит пороговое значение температуры. По умолчанию оно установлено на 25.0 градусов Цельсия, но вы можете установить любое другое значение по умолчанию, подходящее для вашего проекта. Вы также можете изменить его позже в HTML-форме.

String inputMessage3 = "25.0";

Переменная lastTemperature сохраняет последнее значение температуры для сравнения с текущим значением.

String lastTemperature;

HTML-текст

Затем у нас есть базовый HTML-текст для создания страницы с тремя полями ввода: адрес электронной почты получателя, флажок для включения или отключения уведомлений по электронной почте и поле ввода порогового значения температуры. Веб-страница также отображает последние показания температуры с датчика DS18B20.

Следующие строки отображают температуру:

<h2>DS18B20 Temperature</h2>
<h3>%TEMPERATURE% &deg;C</h3>

%TEMPERATURE% – это заполнитель, который будет заменён фактическим значением температуры, когда ESP32 обслуживает страницу.

Затем у нас есть форма с тремя полями ввода и кнопкой «Submit» (Отправить). Когда пользователь вводит данные и нажимает кнопку «Submit», эти значения отправляются на ESP32 для обновления переменных.

<form action="/get">
  Email Address <input type="email" name="email_input" value="%EMAIL_INPUT%" required><br>
  Enable Email Notification <input type="checkbox" name="enable_email_input" value="true" %ENABLE_EMAIL%><br>
  Temperature Threshold <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
  <input type="submit" value="Submit">
</form>

Первое поле ввода имеет тип email, второе поле ввода – это флажок, а последнее поле ввода имеет тип number. Чтобы узнать больше о полях ввода, рекомендуем ознакомиться со следующими ресурсами на сайте w3schools:

Атрибут action формы указывает, куда отправлять данные, введённые в форму, после нажатия кнопки submit. В данном случае выполняется HTTP GET запрос к:

/get?email_input=value&enable_email_input=value&threshold_input=value

Значение value соответствует тексту, который вы вводите в каждое из полей ввода. Чтобы узнать больше об обработке полей ввода с ESP32, прочитайте: Input Data on HTML Form ESP32 Web Server using Arduino IDE.

Функция processor()

Функция processor() заменяет все заполнители в HTML-тексте фактическими значениями.

  • %TEMPERATURE% – lastTemperature

  • %EMAIL_INPUT% – inputMessage

  • %ENABLE_EMAIL% – enableEmailChecked

  • %THRESHOLD% – inputMessage3

String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return lastTemperature;
  }
  else if(var == "EMAIL_INPUT"){
    return inputMessage;
  }
  else if(var == "ENABLE_EMAIL"){
    return enableEmailChecked;
  }
  else if(var == "THRESHOLD"){
    return inputMessage3;
  }
  return String();
}

Параметры полей ввода

Следующие переменные будут использоваться для проверки, получили ли мы HTTP GET запрос от этих полей ввода, и для сохранения значений в переменные соответственно.

const char* PARAM_INPUT_1 = "email_input";
const char* PARAM_INPUT_2 = "enable_email_input";
const char* PARAM_INPUT_3 = "threshold_input";

Инициализация датчика температуры DS18B20

Инициализация датчика температуры DS18B20.

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

Чтобы узнать больше о взаимодействии датчика температуры DS18B20 с ESP32, прочитайте: ESP32 DS18B20 Temperature Sensor with Arduino IDE.

Объект SMTPSession

Объект smtpSession содержит конфигурации и данные для отправки по электронной почте. Эти конфигурации устанавливаются позже в функции sendEmailNotification().

SMTPSession smtp;

Функция setup()

В функции setup() подключаемся к Wi-Fi в режиме станции и выводим IP-адрес ESP32:

Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
  Serial.println("WiFi Failed!");
  return;
}
Serial.println();
Serial.print("ESP IP Address: http://");
Serial.println(WiFi.localIP());

Инициализация датчика температуры DS18B20:

sensors.begin();

Обработка запросов веб-сервера

Затем определяем, что происходит, когда ESP32 получает HTTP-запросы. Когда мы получаем запрос на корневой URL /, отправляем HTML-текст с процессором (чтобы заполнители были заменены последними значениями).

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});

Когда форма отправляется, ESP32 получает запрос на следующий URL:

<ESP_IP>/get?email_input=<inputMessage>&enable_email_input=<inputMessage2>&threshold_input=<inputMessage3>

Поэтому мы проверяем, содержит ли запрос входные параметры, и сохраняем эти параметры в переменные:

server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
  // GET email_input value on <ESP_IP>/get?email_input=<inputMessage>
  if (request->hasParam(PARAM_INPUT_1)) {
    inputMessage = request->getParam(PARAM_INPUT_1)->value();
    // GET enable_email_input value on <ESP_IP>/get?enable_email_input=<inputMessage2>
    if (request->hasParam(PARAM_INPUT_2)) {
      inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
      enableEmailChecked = "checked";
    }
    else {
      inputMessage2 = "false";
      enableEmailChecked = "";
    }
    // GET threshold_input value on <ESP_IP>/get?threshold_input=<inputMessage3>
    if (request->hasParam(PARAM_INPUT_3)) {
      inputMessage3 = request->getParam(PARAM_INPUT_3)->value();
    }
  }
  else {
    inputMessage = "No message sent";
  }

Это часть кода, где переменные будут заменены значениями, отправленными через форму. Переменная inputMessage сохраняет адрес электронной почты получателя, inputMessage2 сохраняет, включена ли система уведомлений по электронной почте или нет, а inputMessage3 сохраняет пороговое значение температуры.

После отправки значений через форму отображается новая страница, сообщающая, что запрос был успешно отправлен на ESP32, со ссылкой для возврата на главную страницу.

request->send(200, "text/html", "HTTP GET request sent to your ESP.<br><a href=\"/\">Return to Home Page</a>");
});

Наконец, запускаем сервер:

server.begin();

Функция loop()

В функции loop() мы используем таймеры для получения новых показаний температуры каждые 5 секунд.

unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
  previousMillis = currentMillis;
  sensors.requestTemperatures();
  // Temperature in Celsius degrees
  float temperature = sensors.getTempCByIndex(0);
  Serial.print(temperature);
  Serial.println(" *C");

  // Temperature in Fahrenheit degrees
  /*float temperature = sensors.getTempFByIndex(0);
  SerialMon.print(temperature);
  SerialMon.println(" *F");*/

  lastTemperature = String(temperature);

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

Вы отправите оповещение по электронной почте, если выполнены все следующие условия:

  • Текущая температура выше порогового значения;

  • Уведомления по электронной почте включены (флажок отмечен на веб-странице);

  • Электронное письмо ещё не было отправлено.

if(temperature > inputMessage3.toFloat() && inputMessage2 == "true" && !emailSent){
  String emailMessage = String("Temperature above threshold. Current temperature: ") +
                        String(temperature) + String("C");
  if(sendEmailNotification(emailMessage)) {
    Serial.println(emailMessage);
    emailSent = true;
  }
  else {
    Serial.println("Email failed to send");
  }
}

Электронное письмо содержит сообщение о том, что температура выше порогового значения, и текущую температуру.

Затем, если температура опускается ниже порогового значения, отправляется ещё одно электронное письмо.

else if((temperature < inputMessage3.toFloat()) && inputMessage2 == "true" && emailSent) {
  String emailMessage = String("Temperature below threshold. Current temperature: ")
                        + String(temperature) + String(" C");
  if(sendEmailNotification(emailMessage)) {
    Serial.println(emailMessage);
    emailSent = false;
  }
  else {
    Serial.println("Email failed to send");
  }
}

Для отправки электронных писем мы создали функцию sendEmailNotification(), которая содержит все данные для отправки письма. Эта функция возвращает true, если письмо было успешно отправлено, или false, если отправка не удалась.

bool sendEmailNotification(String emailMessage) {
  // Configure the session
  ESP_Mail_Session session;
  session.server.host_name = smtpServer;
  session.server.port = smtpServerPort;
  session.login.email = emailSenderAccount;
  session.login.password = emailSenderPassword;
  session.login.user_domain = "";

  // Configure the message
  SMTP_Message message;
  message.sender.name = "ESP32";
  message.sender.email = emailSenderAccount;
  message.subject = emailSubject;
  message.addRecipient("Recipient", inputMessage);
  message.text.content = emailMessage.c_str();
  message.text.charSet = "utf-8";
  message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
  message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_high;
  // Set the callback function
  smtp.callback(smtpCallback);

  // Connect to the server and send the email
  if (!smtp.connect(&session)) {
    Serial.println("Failed to connect to SMTP server: " + smtp.errorReason());
    return false;
  }

  if (!MailClient.sendMail(&smtp, &message)) {
    Serial.println("Error sending Email: " + smtp.errorReason());
    smtp.closeSession();
    return false;
  }

  smtp.closeSession();
  return true;
}

Чтобы узнать больше об отправке электронных писем через SMTP-сервер с ESP32, прочитайте: ESP32 Send Emails using an SMTP Server.

Демонстрация

Загрузите код на вашу плату ESP32 (с DS18B20, подключённым к вашей плате ESP32).

ESP32 веб-сервер с пороговым значением температуры и получением оповещения по Email

Откройте монитор последовательного порта на скорости 115200 бод и нажмите встроенную кнопку RST. ESP32 выведет свой IP-адрес и начнёт отображать новые значения температуры каждые 5 секунд.

Откройте браузер и введите IP-адрес ESP32. Должна загрузиться подобная веб-страница со значениями по умолчанию (определёнными в вашем коде):

ESP32 веб-сервер уведомлений по Email со значениями температуры, адресом получателя и пороговым значением

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

ESP32 отправка Email уведомлений при превышении порогового значения температуры -- монитор последовательного порта

После этого, когда температура опустится ниже порогового значения, вы получите ещё одно электронное письмо.

ESP32 оповещение по Email о достижении порогового значения температуры выше и ниже

Вы можете использовать поля ввода на веб-странице для настройки другого адреса электронной почты получателя, включения или отключения уведомлений по электронной почте и изменения порогового значения. Чтобы изменения вступили в силу, вам просто нужно нажать кнопку «Submit» (Отправить).

Одновременно вы должны увидеть новые значения полей ввода в мониторе последовательного порта.

Заключение

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

В этом проекте мы использовали чистый HTML-текст, чтобы упростить понимание проекта. Мы предлагаем добавить немного CSS для стилизации вашей веб-страницы, чтобы она выглядела красивее.

Вместо DS18B20 вы можете рассмотреть использование другого датчика температуры: DHT vs LM35 vs DS18B20 vs BME280 vs BMP180.

Если вы хотите узнать больше об ESP32, попробуйте наши проекты и ресурсы:


Источник: ESP32 Email Alert Based on Temperature Threshold (change values on web server)