ESP32: Мониторинг состояния двери с уведомлениями по Email (IFTTT)
В этом проекте вы будете отслеживать состояние двери с помощью платы ESP32 и магнитного герконового переключателя. Вы будете получать уведомление по электронной почте каждый раз, когда дверь меняет состояние: открыта или закрыта. Уведомления по электронной почте будут отправляться с использованием IFTTT, а плата ESP32 будет программироваться с помощью Arduino IDE.
Вместо отправки уведомлений по электронной почте через IFTTT, вы можете использовать SMTP-сервер. Чтобы узнать, как отправлять электронные письма с ESP32 с помощью SMTP-сервера, вы можете следовать следующему руководству:
Если вы предпочитаете, вы также можете отправлять уведомления в свой аккаунт Telegram. Узнайте, как использовать Telegram с ESP32, в следующем руководстве:
У нас есть аналогичное руководство для платы ESP8266: Door Status Monitor with Email Notifications (IFTTT)
Обзор проекта
В этом проекте вы будете отправлять уведомление по электронной почте каждый раз, когда дверь меняет состояние. Для обнаружения изменения мы будем использовать магнитный контактный переключатель. Для отправки электронного письма мы будем использовать IFTTT.
Магнитный контактный переключатель — это, по сути, герконовый переключатель, заключённый в пластиковый корпус, чтобы его можно было легко установить на дверь, окно или ящик для определения того, открыта или закрыта дверь.
Электрическая цепь замкнута, когда магнит находится рядом с переключателем — дверь закрыта. Когда магнит находится далеко от переключателя — дверь открыта — цепь разомкнута. Смотрите рисунок ниже.
Мы можем подключить герконовый переключатель к GPIO ESP32 для обнаружения изменений его состояния.
Отправка писем с помощью IFTTT
Для отправки электронных писем с ESP32 мы будем использовать бесплатный* сервис под названием IFTTT, что расшифровывается как «If This Then That» (Если это, тогда то).
IFTTT — это платформа, которая даёт вам творческий контроль над десятками продуктов и приложений. Вы можете заставить приложения работать вместе. Например, отправка определённого запроса в IFTTT запускает апплет, который выполняет какое-то действие, например, отправляет вам уведомление по электронной почте.
Мне нравится сервис IFTTT, и как только вы поймёте, как он работает, его легко использовать. Однако мне не очень нравится макет их веб-сайта и тот факт, что он постоянно меняется.
* в настоящее время в бесплатной версии можно иметь три активных апплета одновременно.
Создание аккаунта IFTTT
Создание аккаунта в IFTTT бесплатно!
Перейдите на официальный сайт: https://ifttt.com/ и нажмите кнопку Get Started в верхней части страницы или Signup, если у вас уже есть аккаунт.
Создание апплета
Сначала вам нужно создать апплет в IFTTT. Апплет соединяет два или более приложений или устройств вместе (например, ESP32 и отправку электронного письма).
Апплеты состоят из триггеров и действий:
Триггеры указывают апплету начать работу. ESP32 отправит запрос (webhooks), который запустит апплет.
Действия — это конечный результат работы апплета. В нашем случае — отправка электронного письма.
Следуйте приведённым ниже инструкциям для создания апплета.
1) Нажмите на эту ссылку, чтобы начать создание апплета.
2) Нажмите на кнопку Add.
3) Найдите «Webhooks» и выберите его.
4) Выберите опцию «Receive a web request».
5) Введите имя события, например, door_status. Вы можете назвать его как угодно, но если вы измените его, вам также нужно будет изменить его в коде, предоставленном далее.
6) Затем вам нужно нажать кнопку Add в меню «Then that», чтобы выбрать, что произойдёт, когда сработает предыдущее событие.
7) Найдите email и выберите опцию email.
8) Нажмите на Send me an email.
9) Затем напишите тему и тело письма. Вы можете оставить сообщение по умолчанию или изменить его на что угодно. {{EventName}} — это заполнитель для имени события, в данном случае это door_status. {{OccuredAt}} — это заполнитель для временной метки, когда событие было вызвано. {{Value1}} — это заполнитель для фактического состояния двери. Таким образом, вы можете использовать эти заполнители для написания собственного сообщения. Когда закончите, нажмите на Create action.
10) Теперь вы можете нажать на Continue.
11) Наконец, нажмите на Finish.
12) Вы будете перенаправлены на аналогичную страницу — как показано ниже.
Ваш апплет был успешно создан. Теперь давайте его протестируем.
Тестирование апплета
Перейдите по этому URL: https://ifttt.com/maker_webhooks и откройте вкладку «Documentation».
Вы получите доступ к веб-странице, где можно вызвать событие для его тестирования и получить доступ к вашему API-ключу (выделен красным). Сохраните ваш API-ключ в безопасном месте, потому что он вам понадобится позже.
Теперь давайте вызовем событие для его тестирования. В поле {event} введите событие, которое вы создали ранее. В нашем случае это door_status. Дополнительно добавьте значение в поле value1, например open. Затем нажмите кнопку Test It.
Вы должны получить сообщение об успехе «Event has been triggered», и вы должны получить электронное письмо в свой почтовый ящик с уведомлением о том, что событие было вызвано.
Если вы получили письмо, ваш апплет работает как ожидалось. Вы можете перейти к следующему разделу. Мы запрограммируем ESP32 для запуска вашего апплета при изменении состояния двери.
Список компонентов
Вот оборудование, которое вам понадобится для завершения этого проекта:
ESP32 – читайте Best ESP32 Development Boards
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!
Схема подключения – ESP32 с герконовым переключателем
Мы подключили герконовый переключатель к GPIO 4, но вы можете подключить его к любому подходящему GPIO.
Код
Скопируйте скетч ниже в вашу Arduino IDE. Замените SSID, пароль и API-ключ IFTTT на ваши собственные учётные данные.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-door-status-monitor-email/
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>
// Set GPIOs for LED and reedswitch
const int reedSwitch = 4;
const int led = 2; //optional
// Detects whenever the door changed state
bool changeState = false;
// Holds reedswitch state (1=opened, 0=close)
bool state;
String doorState;
// Auxiliary variables (it will only detect changes that are 1500 milliseconds apart)
unsigned long previousMillis = 0;
const long interval = 1500;
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
const char* host = "maker.ifttt.com";
const char* apiKey = "REPLACE_WITH_YOUR_IFTTT_API_KEY";
// Runs whenever the reedswitch changes state
ICACHE_RAM_ATTR void changeDoorStatus() {
Serial.println("State changed");
changeState = true;
}
void setup() {
// Serial port for debugging purposes
Serial.begin(115200);
// Read the current door state
pinMode(reedSwitch, INPUT_PULLUP);
state = digitalRead(reedSwitch);
// Set LED state to match door state
pinMode(led, OUTPUT);
digitalWrite(led, !state);
// Set the reedswitch pin as interrupt, assign interrupt function and set CHANGE mode
attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void loop() {
if (changeState){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// If a state has occurred, invert the current door state
state = !state;
if(state) {
doorState = "closed";
}
else{
doorState = "open";
}
digitalWrite(led, !state);
changeState = false;
Serial.println(state);
Serial.println(doorState);
//Send email
Serial.print("connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
String url = "/trigger/door_status/with/key/";
url += apiKey;
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("POST ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"Content-Length: 13\r\n\r\n" +
"value1=" + doorState + "\r\n");
}
}
}
У вас должно быть установлено дополнение для платы ESP32 в вашей Arduino IDE. Если нет, следуйте следующему руководству:
Как работает код
Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.
Сначала вам нужно подключить библиотеку WiFi, чтобы ESP32 мог подключиться к вашей сети для взаимодействия с сервисами IFTTT.
#include <WiFi.h>
Установите GPIO для герконового переключателя и светодиода (встроенный светодиод — это GPIO 2). Мы будем включать встроенный светодиод, когда дверь открыта.
const int reedSwitch = 4;
const int led = 2; //optional
Булева переменная changeState указывает, изменилось ли состояние двери.
bool changeState = false;
Переменная state будет хранить состояние герконового переключателя, а doorState, как следует из названия, будет хранить состояние двери — закрыта или открыта.
bool state;
String doorState;
Следующие переменные таймера позволяют нам устранить дребезг переключателя. Будут учитываться только изменения, произошедшие с интервалом не менее 1500 миллисекунд.
unsigned long previousMillis = 0;
const long interval = 1500;
Вставьте ваш SSID и пароль в следующие переменные, чтобы ESP32 мог подключиться к интернету.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Вставьте ваш собственный API-ключ IFTTT в переменную apiKey — тот, который вы получили на этом шаге.
const char* apiKey = "REPLACE_WITH_YOUR_IFTTT_API_KEY";
Функция changeDoorStatus() будет вызываться при каждом обнаружении изменения состояния двери. Эта функция просто устанавливает переменную changeState в true. Затем в loop() мы обрабатываем, что происходит при изменении состояния (инвертируем предыдущее состояние двери и отправляем электронное письмо).
ICACHE_RAM_ATTR void changeDoorStatus() {
Serial.println("State changed");
changeState = true;
}
setup()
В setup() инициализируйте Serial Monitor для целей отладки:
Serial.begin(115200);
Установите герконовый переключатель как INPUT. И сохраните текущее состояние при первом запуске ESP32.
pinMode(reedSwitch, INPUT_PULLUP);
state = digitalRead(reedSwitch);
Установите светодиод как OUTPUT и установите его состояние в соответствии с состоянием герконового переключателя (цепь замкнута и светодиод выключен; цепь разомкнута и светодиод включён).
pinMode(led, OUTPUT);
digitalWrite(led, !state);
Настройка прерывания
Установите герконовый переключатель как прерывание.
attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE);
Для настройки прерывания в Arduino IDE вы используете функцию attachInterrupt(), которая принимает в качестве аргументов: GPIO пин прерывания, имя вызываемой функции и режим.
Первый аргумент — это GPIO прерывания. Вы должны использовать digitalPinToInterrupt(GPIO) для установки фактического GPIO в качестве пина прерывания.
Второй аргумент функции attachInterrupt() — это имя функции, которая будет вызываться каждый раз при срабатывании прерывания — процедура обработки прерывания (ISR). В данном случае это функция changeDoorStatus.
Функция ISR должна быть как можно проще, чтобы процессор быстро вернулся к выполнению основной программы.
Третий аргумент — это режим. Мы установили его в CHANGE для срабатывания прерывания всякий раз, когда пин изменяет значение — например, с HIGH на LOW или с LOW на HIGH.
Чтобы узнать больше о прерываниях с ESP32, прочитайте следующее руководство:
Инициализация Wi-Fi
Следующие строки подключают ESP32 к Wi-Fi.
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
loop()
В loop() мы будем читать переменную changeState и, если произошло изменение, отправим электронное письмо с помощью IFTTT.
Сначала проверяем, произошло ли изменение:
if (changeState){
Затем проверяем, прошло ли не менее 1500 миллисекунд с момента последнего изменения состояния.
if(currentMillis - previousMillis >= interval) {
Если это так, сбрасываем таймер и инвертируем текущее состояние переключателя:
state = !state;
Если состояние герконового переключателя равно 1(true), дверь закрыта. Поэтому мы меняем переменную doorState на closed.
if(state) {
doorState = "closed";
}
Если оно равно 0(false), дверь открыта.
else{
doorState = "open";
}
Устанавливаем состояние светодиода соответственно и выводим состояние двери в Serial Monitor.
digitalWrite(led, !state);
changeState = false;
Serial.println(state);
Serial.println(doorState);
Наконец, следующие строки отправляют запрос в IFTTT с текущим состоянием двери для события (door_status), которое мы создали ранее.
// Send email
Serial.print("connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
String url = "/trigger/door_status/with/key/";
url += apiKey;
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("POST ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"Content-Length: 13\r\n\r\n" +
"value1=" + doorState + "\r\n");
Когда IFTTT получает этот запрос, он запускает действие по отправке электронного письма.
Демонстрация
После изменения скетча для включения ваших сетевых учётных данных и API-ключа загрузите его на ваш ESP32. Перейдите в Tools > Board и выберите вашу плату ESP32. Затем перейдите в Tools > Port и выберите COM-порт, к которому подключён ESP32.
Откройте Serial Monitor с скоростью передачи 115200, чтобы проверить, обнаруживаются ли изменения и может ли ESP32 подключиться к IFTTT.
Для прототипирования/тестирования вы можете прикрепить магнитный герконовый переключатель к вашей двери с помощью липучки Velcro.
Теперь, когда кто-то открывает/закрывает вашу дверь, вы получаете уведомление по электронной почте.
Заключение
В этом руководстве вы узнали, как запускать событие при изменении состояния герконового переключателя. Это может быть полезно для определения того, была ли открыта или закрыта дверь, окно или ящик. Вы также узнали, как использовать IFTTT для отправки электронного письма при срабатывании события.
Вместо отправки электронного письма вы, возможно, захотите отправить сообщение в Telegram, например.
—
Источник: ESP32 Door Status Monitor with Email Notifications (IFTTT)