ESP8266:Примеры/WiFi-кнопка

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


WiFi-кнопка

В этом руководстве мы научимся создавать при помощи ESP8266 так называемую «WiFi-кнопку» – устройство, при нажатии на кнопку которого система автоматизации дома будет запускать некоторое событие. Это что-то вроде пульта дистанционного управления, который можно носить в кармане или положить куда угодно. При нажатии на кнопку оно будет отправлять электронное письмо.

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

Amazon-Dash.jpg

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

Esp01 button 1.png

Вместо заказа продуктов мы можем запрограммировать «WiFi-кнопку» на выполнение какого-то другого действия – включения света в комнате или лампы, отправки данных или электронного письма и т.д.

Необходимое оборудование

IFTT

В этом проекте мы воспользуемся бесплатным сервисом IFTTT (это аббревиатура расшифровывается как «if this than that», т.е. «если это, то вот это»).

Этот сервис используется для онлайн-автоматизации самых разнообразных задач. В нашем случае надо, чтобы «WiFi-кнопка» при нажатии отправляла электронное письмо. Зайдите на сайт ifttt.com и кликните на кнопку Get started. Затем заполните форму и создайте аккаунт.

Iftt main page 1.PNG

Создаем апплет

Откройте вкладку My Applets, а затем нажмите на кнопку New Applet.

Iftt new applet 1.PNG

Кликните по слову This

Iftt new applet if+this then that 1.PNG

и поищите сервис Webhooks.

Iftt new applet webhooks searches 1.PNG

Названием события (Event Name) нужно сделать «button_pressed». При помощи сервиса Webhooks вы можете запускать действие при выполнении HTTP-запроса на заданный URL.

Iftt choose trigger 1.PNG

Кликните по кнопке Create trigger:

Iftt create trigger 1.PNG

Теперь нажмите на слово That

Ifttt if webhooks then +that 1.PNG

и поищите сервис Gmail.

Ifttt if webhooks then +that gmail 1.PNG

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

Далее выберите вариант Send an email и введите в поле To Address электронную почту, на которую хотите отправить уведомление. Вы можете отредактировать тему и текст письма, но я – в демонстрационных целях – оставил их как есть. Наконец, нажмите на кнопку Create action.

Ifttt if webhooks then +that gmail settings 1.PNG

Теперь нажмите на кнопку Finish, чтобы завершить создание апплета.

Ifttt if webhooks then +that gmail settings finish 1.PNG

Проверяем апплет

Откройте вкладку Search, найдите сервис Webhooks и откройте его.

Ifttt webhooks service 1.PNG

Перейдите на вкладку Documentation.

Ifttt webhooks service main page 1.PNG

Здесь находится ваш уникальный API-ключ, который нужно держать в тайне. Введите здесь название события – «button_pressed». В нижней части страницы должен появиться URL, скопируйте его.

Ifttt webhooks service api test 1.PNG

Откройте в браузере новую вкладку, вставьте туда этот URL и нажмите на  ↵ Enter . В браузере должно появиться сообщение «Congratulations!» (Поздравляем!).

Или вы можете просто нажать внизу кнопку Test it, для отправки запроса.

Откройте Gmail. Там тоже должно появиться новое сообщение.

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

Примечание: Если все работает, скопируйте этот URL в «Блокнот», т.к. позже он нам еще понадобится.

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

  • Запускается последовательная коммуникация на скорости 115200 бод;
  • Запускается функция initWifi(), устанавливающая WiFi-соединение между ESP8266 и роутером;
  • Запускается функция makeIFTTTRequest(), выполняющая запрос к сервису IFTTT, после чего IFTTT отправляет электронное письмо;

О методе deepSleep()

Наконец, мы используем метод deepSleep(), чтобы ESP8266 перешел в почти выключенное состояние и потреблял минимум электроэнергии. Об использовании метода deepSleep() в программировании ESP8266 хорошо рассказывалось в руководстве «Использование ESP8266 в режиме глубокого сна при помощи IDE Arduino».

Если вкратце, то проект будет работать следующим образом: при нажатии на кнопку ESP8266 будет просыпаться, выполнять действие и возвращаться в режим глубокого сна (с целью экономии электроэнергии). Все предельно просто.

Вписав в скетч SSID, пароль и URL, загрузите его на ESP8266 при помощи FTDI-программатора.

Итого

Думаю, стоит напомнить, что возможности применения этого проекта безграничны. К примеру, событие «button_pressed» может иметь разное значение в зависимости от того, куда мы помещаем этот пульт управления.

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

Также имейте в виду, что такой проект можно реализовать не только с помощью стороннего сервиса вроде IFTTT, но и другими средствами:

  • Включить реле, подключенное к другой ESP8266-плате;
  • Отправить запрос другому устройству в вашей сети;
  • Сделать HTTP-запрос на Node-RED, чтобы активировать действие;
  • Опубликовать MQTT-сообщение;
  • Подключиться к любому другому ПО для домашней автоматизации;

Что дальше

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

Если заменить кнопку на геркон, это позволит определить, открылась ли дверь/окно. Кроме того, геркон также можно установить на (настоящем) почтовом ящике, чтобы определить не принесли ли вам письмо, посылку и т.д.

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

Схема

Подключите эти компоненты друг к другу согласно схеме ниже:

Esp8266 voltage regulator scheme 1.png

Или можете воспользоваться в качестве подсказки вот этой Fritzing-схемой:

Esp8266 ldo stab fritzing scheme 1.png

Рекомендую сначала собрать цепь на контактной макетной плате, чтобы проверить, все ли работает правильно.

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

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

Код

  1 /*
  2  * «WiFi-кнопка» на базе ESP8266
  3  * Автор – Руи Сантос
  4  * Более подробно о проекте на: http://randomnerdtutorials.com
  5  */
  6  
  7 #include <ESP8266WiFi.h>
  8 
  9 // Вставьте здесь SSID и пароль для своей WiFi-сети:
 10 const char* ssid     = "REPLACE_WITH_YOUR_SSID";
 11 const char* password = "REPLACE_WITH_YOUR_PASSWORD";
 12 
 13 // Вставьте здесь уникальную ссылку из сервиса IFTTT:
 14 const char* resource = "REPLACE_WITH_YOUR_IFTTT_URL_RESOURCE";
 15 
 16 // IFTTT-ссылка должна выглядеть примерно так, но с вашим API-ключом
 17 // (API-ключ в этой ссылке ниже – просто пример):
 18 //const char* resource = "/trigger/button_pressed/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy";
 19 
 20 // Сервер IFTTT-сервиса Webhooks:
 21 const char* server = "maker.ifttt.com";
 22 
 23 void setup() {
 24   Serial.begin(115200); 
 25 
 26   initWifi();
 27   makeIFTTTRequest();
 28 
 29   // ESP8266 будет оставаться в режиме глубокого сна,
 30   // пока на контакт RESET не будет подан сигнал «LOW»
 31   // (например, с помощью нажатия на кнопку):
 32   ESP.deepSleep(0);
 33 }
 34 
 35 void loop() {
 36   // ESP8266 перейдет в режим глубокого сна
 37   // до того, как доберется до блока loop()
 38 }
 39 
 40 // Устанавливаем WiFi-соединение с роутером:
 41 void initWifi() {
 42   Serial.print("Connecting to: ");  //  "Подключаемся к: "
 43   Serial.print(ssid);
 44   WiFi.begin(ssid, password);  
 45 
 46   int timeout = 10 * 4; // 10 секунд
 47   while(WiFi.status() != WL_CONNECTED  && (timeout-- > 0)) {
 48     delay(250);
 49     Serial.print(".");
 50   }
 51   Serial.println("");
 52 
 53   if(WiFi.status() != WL_CONNECTED) {
 54      Serial.println("Failed to connect, going back to sleep");
 55                 //  "Подключиться не удалось,
 56                 //   переходим обратно в режим сна"
 57   }
 58 
 59   Serial.print("WiFi connected in: ");
 60            //  "Время подключения к WiFi: "
 61   Serial.print(millis());
 62   Serial.print(", IP address: ");  //  ", IP-адрес: "
 63   Serial.println(WiFi.localIP());
 64 }
 65 
 66 // Делаем HTTP-запрос на веб-сервис IFTTT:
 67 void makeIFTTTRequest() {
 68   Serial.print("Connecting to ");  //  "Подключаемся к "
 69   Serial.print(server);
 70   
 71   WiFiClient client;
 72   int retries = 5;
 73   while(!!!client.connect(server, 80) && (retries-- > 0)) {
 74     Serial.print(".");
 75   }
 76   Serial.println();
 77   if(!!!client.connected()) {
 78      Serial.println("Failed to connect, going back to sleep");
 79                 //  "Подключиться не удалось,
 80                 //   возвращаемся ко сну"
 81   }
 82   
 83   Serial.print("Request resource: ");  //  "Ресурс запроса: "
 84   Serial.println(resource);
 85   client.print(String("GET ") + resource + 
 86                   " HTTP/1.1\r\n" +
 87                   "Host: " + server + "\r\n" + 
 88                   "Connection: close\r\n\r\n");
 89                   
 90   int timeout = 5 * 10; // 5 секунд             
 91   while(!!!client.available() && (timeout-- > 0)){
 92     delay(100);
 93   }
 94   if(!!!client.available()) {
 95      Serial.println("No response, going back to sleep");
 96                 //  "Нет ответа, возвращаемся ко сну"
 97   }
 98   while(client.available()){
 99     Serial.write(client.read());
100   }
101   
102   Serial.println("\nclosing connection");
103              //  "отключаем соединение"
104   client.stop();
105 }

См.также

Внешние ссылки