Создадим на основе Arduino и модуля ESP8266 устройство для отправки SMS, когда PIR датчик обнаруживает движение.
Компоненты
Для этого проекта мы собираемся связать ИК-датчик (PIR) движения с Arduino UNO, а затем передать цифровой сигнал на модуль ESP8266.
ИК-датчик, также известный как пассивный инфракрасный датчик приближения, представляет собой цифровой датчик, который выдает высокий импульс при обнаружении движения.
Модуль ESP8266 сконфигурирован для отправки запроса GET в IFTTT, когда сигнал ВЫСОКИЙ (HIGH). Запрос GET запускает апплет, который затем отправляет SMS на ваше устройство.
Для этого нам понадобятся следующие компоненты:
- Arduino Uno
- ESP8266-01 WiFi модуль
- ИК-датчик (PIR) движения
- Резистор 1 кОм x 3
- Резистор 10 кОм
- Перемычки
- Макетная плата
IFTTT
Мы собираемся использовать IFTTT.
IFTTT ( If This Then That ) - это бесплатная веб-платформа, которая соединяет такие устройства и сервисы, как Gmail, Twitter, Instagram, Dropbox, Fitbit, Amazon Alexa и Google Assistant. Она связывает эти услуги таким образом, что Instagram может использовать функции Dropbox.
IFTTT работает так же, как стандартный оператор if
- если это условие сработало, выполните это действие.
Для этого IFTTT использует апплеты. Апплеты - это программы, которые используют триггер для проведения событий. Апплет может делать такие вещи, как публикация регулярных твитов о погоде или отправка SMS-уведомлений всякий раз, когда кто-то открывает определенную дверь.
Чтобы интегрировать IFTTT с ESP8266, нам нужны вебхуки (webhooks). Вебхуки - это сервисы, которые запускают события через HTTP-запросы.
Простая система вебхука работает следующим образом:
Первоначальный триггер системы вебхуков - HTTP-запрос. Они могут быть отключены тактильным переключателем, цифровой кнопкой, уровнем звука, температурным порогом и т.п.
Чтобы создать веб-запрос для запуска вебхуков, вам необходимо указать ключ и имя события.
Ключ обеспечивает аутентификацию хука для вашей учетной записи IFTTT, а имя события указывает действие, которое должно быть инициировано при выполнении условия. Без одного из этих двух способов невозможно узнать, чьи и какие действия необходимо предпринять.
Схема соединения
Все компоненты соединяем согласно схеме ниже:
В собранном виде наш проект должен выглядеть примерно так:
Настраиваем IFTTT
Сначала зайдите на сайт IFTTT и создайте аккаунт.
После входа в систему перейдите в верхнюю правую панель инструментов на домашней странице и выберите «Создать» (Create). После входа вас перенаправит на страницу, где вы сможете начать создавать апплет.
Затем установите условие, нажав "+ This".
Далее ищем вебхуки (webhooks).
В разделе вебхуков выберите получение веб-запроса. Нажмите на создание триггера после присвоения имени вашему событию.
Теперь, чтобы установить действие, нажмите "+ That".
На этот раз мы ищем смс. К сожалению, IFTTT прекратил поддержку прямых SMS с использованием веб-хуков. Прямо сейчас, единственный способ сделать эту работу - это установить приложение IFTTT на устройство Android или использовать учетную запись ClickSend. В этом уроке мы используем первое.
Наконец, напишите содержание SMS. Существуют удобные переменные, которые вы можете использовать для составления вашего сообщения:
- EventName, которое содержит название события;
- OccurnAt, который отображает дату и время, когда событие инициировано;
- Value - значение, которое может включать любой номер, который вы хотите отправить на сервер IFTTT.
Проверьте, правильно ли вы указали данные.
Апплет готов. Теперь, чтобы использовать ваше устройство Android для SMS-уведомлений, найдите приложение IFTTT в магазине Google Play и установите его.
После установки войдите в систему с учетными данными IFTTT, чтобы выполнить сопряжение с вашей учетной записью.
Получение ключа
Чтобы вызвать получение апплета, нам нужен ключ вместе с именем события в нашем HTTP-запросе. Чтобы получить уникальный ключ IFTTT, перейдите на домашнюю страницу и выполните поиск веб-хуков в левой верхней панели поиска. Вы можете найти хук в разделе сервисов (Services).
Теперь на странице вебхуков нажмите на ссылку Документация (Documentation) в правом верхнем углу страницы.
Наконец, появится страница, содержащая ваш личный ключ, и полный веб-запрос для вашего события. Этот ключ уникален для каждого аккаунта IFTTT. Включив в него название события, Вы можете запустить действие IFTTT через вубхук.
Скетч для Ардуино
#include "SerialTransfer.h"
SerialTransfer myTransfer;
int status;
void setup()
{
Serial.begin(115200);
myTransfer.begin(Serial);
pinMode(5, INPUT);
}
void loop()
{
status = digitalRead(D5);
myTransfer.txObj(status, sizeof(status));
myTransfer.sendData(sizeof(status));
delay(100);
}
Код для модуля ESP8266
#include <ESP8266WiFi.h>
#include "SerialTransfer.h"
SerialTransfer myTransfer;
const char* ssid = "Wifi Name";
const char* password = "WiFi Password";
const char* resource = "https://maker.ifttt.com/trigger/YOUR EVENT NAME HERE/with/key/YOUR KEY HERE";
const char* server = "maker.ifttt.com";
void setup() {
Serial.begin(115200);
pinMode(D5, INPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
myTransfer.begin(Serial);
}
void loop()
{
if(myTransfer.available())
{
int status;
myTransfer.rxObj(myFloat, sizeof(myFloat));
if (status==1)
{
WiFiClient client;
client.print(String("GET ") + resource +
" HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
int timeout = 5 * 10; // 5 seconds
while(!!!client.available() && (timeout-- > 0))
{
delay(100);
}
while(client.available())
{
Serial.write(client.read());
}
client.stop();
delay(10000);
}
}
}
Код для NodeMCU
#include <ESP8266WiFi.h>
const char* ssid = "Wifi Name";
const char* password = "WiFI";
const char* resource = "https://maker.ifttt.com/trigger/YOUR EVENT NAME HERE/with/key/YOUR KEY HERE";
const char* server = "maker.ifttt.com";
int status;
void setup() {
Serial.begin(115200);
pinMode(D5, INPUT);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop()
{
status = digitalRead(D5);
delay(500);
Serial.println(status);
if (status==1)
{
WiFiClient client;
client.print(String("GET ") + resource +
" HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
int timeout = 5 * 10; // 5 seconds
while(!!!client.available() && (timeout-- > 0))
{
delay(100);
}
while(client.available())
{
Serial.write(client.read());
}
client.stop();
delay(10000);
}
else
{
return;
}
}
Объяснение кода
Для отправки цифрового сигнала в модуль ESP8266 мы используем библиотеку SerialTransfer.h. Вы можете скачать её с GitHub.
Вот важные строки, которые мы использовали из библиотеки:
SerialTransfer myTransfer
- создает экземпляр SerialTransfer, называемый myTransfermyTransfer.begin(Serial)
- запускает последовательную связь с использованием скорости передачи данных Serial (последовательная)- m
yTransfer.txObj(status, sizeof(status))
- создает объект специально для статуса myTransfer.sendData(sizeof(status))
- отправляет статус в пакете прямо по его размеруmyTransfer.rxObj(status, sizeof(status))
- получает статус от отправителя
Далее, используя const char*
, мы соединяем строки, содержащие ваше WiFi имя, пароль, URL веб-запроса и сервер создателя IFTTT. Затем, используя WiFi.mode(WIFI_STA
, мы объявляем модуль ESP8266 станцией, чтобы предотвратить его переход в другие режимы по умолчанию. С помощью WiFi.begin
и myTransfer.begin
мы инициализируем WiFi-соединение и последовательную связь соответственно.
Основной цикл использует оператор if
, который возвращается, когда сигнал LOW, или посылает GET-запрос, когда сигнал HIGH. Отправка GET-запроса на URL события IFTTT приводит к срабатыванию апплета. Следовательно, это отправляет SMS-уведомление на ваше устройство Android.
Мы добавили 10-секундную задержку до того, как устройство снова проверит HIGH импульс, чтобы предотвратить перегрузку вашего IFTTT-апплета. Отправка слишком большого количества запросов может привести к отключению вашего апплета, или, что еще хуже, к блокировке вашей учетной записи.
Я добавил бонусный код, если вы используете набор для разработки NodeMCU. С NodeMCU вам не нужно использовать последовательную связь для отправки цифрового сигнала от датчика. Вместо этого вы можете использовать последовательный монитор, чтобы проверить, соответствует ли выходной сигнал вашему коду.
Демонстрация
Чтобы протестировать проект, нам достаточно помахать рукой перед ИК-сенсором на расстоянии, примерно, в 1 метр. Через пару секунд мы получим уведомление из приложения IFTTT, а вскоре после этого - СМС.