ESP32: Оповещение по Email на основе порогового значения температуры (изменение параметров через веб-сервер)
Узнайте, как отправлять оповещение по электронной почте с ESP32 на основе порогового значения температуры. ESP32 также размещает веб-сервер, который показывает последние показания датчика и поля ввода для изменения порогового значения, адреса электронной почты получателя и возможности включения или отключения системы.
Обновлено 12 апреля 2025 г.
Мы будем считывать температуру с помощью датчика DS18B20 и отправлять электронные письма через SMTP-сервер. ESP32 будет программироваться с помощью Arduino IDE.
Для лучшего понимания работы этого проекта рекомендуем ознакомиться со следующими руководствами:
ESP32 Send Emails using an SMTP Server: HTML, Text and Attachments (Arduino IDE)
Input Data on HTML Form ESP32/ESP8266 Web Server (Arduino IDE)
ESP32/ESP8266 Thermostat Web Server – Control Output Based on Temperature
Обзор проекта
На следующем изображении показан общий обзор проекта, который мы будем создавать.
ESP32 размещает веб-сервер, который показывает последние показания температуры с датчика температуры DS18B20.
Есть поле ввода для установки порогового значения. Когда температура поднимается выше или опускается ниже порогового значения, вы получите электронное письмо.
Вы также можете указать адрес электронной почты получателя на веб-странице.
Систему можно активировать или деактивировать через веб-сервер. Если вы решите деактивировать систему, вы не будете получать уведомления по электронной почте, когда температура пересечёт пороговое значение.
На следующем изображении показан обзор страницы веб-сервера.
Предварительные требования
Перед началом работы над проектом убедитесь, что выполнены все следующие предварительные требования.
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.
3. Создание электронной почты отправителя (новый аккаунт)
Мы рекомендуем создать новый аккаунт электронной почты для отправки писем на ваш основной личный адрес. Не используйте свою основную личную почту для отправки писем через ESP32. Если что-то пойдёт не так в вашем коде или если вы по ошибке сделаете слишком много запросов, ваш аккаунт может быть заблокирован или временно отключён.
Создайте новый аккаунт электронной почты для отправки писем с ESP32. Если вы хотите использовать аккаунт Gmail, перейдите по этой ссылке для создания нового аккаунта.
Создание пароля приложения
Вам необходимо создать пароль приложения, чтобы ESP32 мог отправлять электронные письма с вашего аккаунта Gmail. Пароль приложения – это 16-значный код доступа, который даёт менее безопасному приложению или устройству разрешение на доступ к вашему аккаунту Google. Узнайте больше о входе с паролями приложений здесь.
Пароль приложения можно использовать только с аккаунтами, у которых включена двухэтапная аутентификация (2-step verification).
Откройте ваш Google Account.
В панели навигации выберите Security (Безопасность).
В разделе «Signing in to Google» (Вход в Google) выберите 2-Step Verification > Get started.
Следуйте инструкциям на экране.
После включения двухэтапной аутентификации вы можете создать пароль приложения.
Откройте ваш Google Account.
В панели поиска найдите App Passwords (Пароли приложений).
Откройте меню App Passwords.
Дайте имя паролю приложения, например ESP. Затем нажмите Create (Создать). Появится окно с паролем, который вы будете использовать с ESP32 или ESP8266 для отправки электронных писем. Сохраните этот пароль (даже если написано, что его не нужно запоминать), потому что он понадобится вам позже.
Появится окно с паролем, который вы будете использовать с ESP32 для отправки электронных писем. Сохраните этот пароль (даже если написано, что его не нужно запоминать), потому что он понадобится вам позже.
Теперь у вас должен быть пароль приложения, который вы будете использовать в коде ESP32 для отправки электронных писем.
Если вы используете другого поставщика электронной почты, проверьте, как создать пароль приложения. Вы сможете найти инструкции с помощью быстрого поиска в 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.
Затем установите библиотеку AsyncTCP. Найдите AsyncTCP и установите AsyncTCP от ESP32Async.
Библиотеки DS18B20
Для DS18B20 мы будем использовать следующие библиотеки.
One Wire от Paul Stoffregen (Руководство по DS18B20) *в Arduino IDE она указана как «OneWire by Jim Studt, Tom Pollard, …»
Вы можете установить их через менеджер библиотек Arduino. Перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек. Затем найдите названия библиотек и установите их.
6. Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
Схема подключения
Подключите датчик температуры DS18B20 к ESP32, как показано на следующей схеме, с выводом данных, подключённым к GPIO 4.
Код 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% °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).
Откройте монитор последовательного порта на скорости 115200 бод и нажмите встроенную кнопку RST. ESP32 выведет свой IP-адрес и начнёт отображать новые значения температуры каждые 5 секунд.
Откройте браузер и введите IP-адрес ESP32. Должна загрузиться подобная веб-страница со значениями по умолчанию (определёнными в вашем коде):
Если уведомления по электронной почте включены (флажок отмечен) и температура поднимется выше порогового значения, вы получите уведомление по электронной почте.
После этого, когда температура опустится ниже порогового значения, вы получите ещё одно электронное письмо.
Вы можете использовать поля ввода на веб-странице для настройки другого адреса электронной почты получателя, включения или отключения уведомлений по электронной почте и изменения порогового значения. Чтобы изменения вступили в силу, вам просто нужно нажать кнопку «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)