Alexa (Echo) с ESP32 и ESP8266 – Реле с голосовым управлением

В этом проекте вы узнаете, как управлять ESP8266 или ESP32 голосовыми командами с помощью Alexa (Amazon Echo Dot). В качестве примера мы будем управлять двумя 12В лампами, подключёнными к модулю реле. Мы также добавим два настенных выключателя на частоте 433 МГц для физического управления лампами.

Примечание: данное руководство совместимо со всеми поколениями Echo Dot и с последней версией библиотеки fauxmoESP (3.1.0). Работает с ESP32 и ESP8266.

Смотрите видеоурок

Мы рекомендуем следующие руководства в качестве справочных материалов:

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

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

Управление лампами с помощью Alexa

К концу этого проекта вы сможете управлять двумя лампами (лампа 1 и лампа 2) голосовыми командами с помощью Alexa. На рисунке ниже показан общий обзор того, как проект работает для управления лампой 1 – аналогично работает и для лампы 2.

Обзор проекта Alexa ESP8266 ESP32

Alexa будет реагировать на следующие команды:

  • «Alexa, turn on lamp 1»

  • «Alexa, turn off lamp 1»

  • «Alexa, turn on lamp 2»

  • «Alexa, turn off lamp 2»

  • «Alexa, turn on lamps» включает обе лампы

  • «Alexa, turn off lamps» выключает обе лампы

Когда вы говорите что-то вроде «Alexa, turn on lamp 1», ESP8266 или ESP32 активирует реле для включения лампы 1. Когда вы говорите что-то вроде «Alexa, turn off lamp 1», ESP8266 или ESP32 отправляет сигнал реле для выключения лампы. Аналогично работает и для лампы 2.

Управление лампами с помощью настенных выключателей 433 МГц

В этом проекте мы также добавим два настенных выключателя 433 МГц для физического управления лампами. У вас будет отдельный выключатель для каждой лампы. Выключатель изменяет состояние лампы на противоположное текущему. Например, если лампа выключена, нажмите настенный выключатель, чтобы включить её. Чтобы выключить, просто нажмите выключатель ещё раз. Посмотрите на рисунок ниже, который иллюстрирует принцип работы.

Схема работы ESP32 с лампой через 433 МГц

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

Вот полный список компонентов, необходимых для этого проекта (нажмите на ссылки ниже, чтобы найти лучшую цену на Maker Advisor):

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

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Как купить Amazon Echo

Вы можете использовать ссылки ниже для покупки Amazon Echo. Доступно несколько моделей – все они совместимы с этим проектом.

Модели Amazon Echo

Покупка Amazon Echo через Amazon доступна не для всех стран. Мы предоставляем ссылки для Amazon в Великобритании, США и Германии. Если Amazon Echo не доставляется в вашу страну через Amazon, вы можете приобрести его на eBay (доставка по всему миру).

Echo Dot (2-е поколение)

Echo (2-е поколение)

Echo Show

Настенный выключатель 433 МГц RF

Настенный выключатель 433 МГц RF – отличный способ дистанционного управления устройствами. Он легко крепится к стене на клейкую ленту, без необходимости сверлить отверстия в стенах. Кроме того, он беспроводной, поэтому вам не нужно беспокоиться о прокладке и скрытии кабелей.

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

Настенный выключатель 433 МГц

Этот настенный выключатель имеет кнопку в своей схеме, как показано на рисунке ниже, которая при нажатии излучает сигнал 433 МГц. Вы можете использовать этот сигнал для управления чем угодно. Этот настенный выключатель использует батарею типа 27A 12V (не входит в комплект). Поэтому вам может понадобиться приобрести её при покупке настенного выключателя.

Внутренности настенного выключателя 433 МГц

Декодирование RF-сигналов 433 МГц настенного выключателя

При нажатии настенного выключателя 433 МГц он отправляет сигнал на частоте 433 МГц. Вам нужно декодировать этот сигнал с помощью приёмника 433 МГц. Чтобы узнать, как декодировать сигнал 433 МГц, прочитайте следующую публикацию: Декодирование и отправка RF-сигналов 433 МГц с Arduino – прочитайте раздел «Decoder Sketch». Скетч работает с Arduino, ESP32 и ESP8266.

Запишите десятичный (24-битный) код для каждого из ваших выключателей, потому что он понадобится вам позже.

Декодированный RF-сигнал 433 МГц

В моём случае:

  • выключатель 1: 6819768

  • выключатель 2: 9463928

У вас должны получиться другие значения. Затем вы будете использовать эти сигналы в скетче для ESP8266 или ESP32. При нажатии выключателя он отправляет сигнал 433 МГц. Этот сигнал обнаруживается приёмником, подключённым к ESP. Таким образом, ESP знает, что выключатель был нажат, и инвертирует текущее состояние лампы.

Схема работы 433 МГц с ESP32 и лампой

Библиотека FauxmoESP

Для управления ESP8266 или ESP32 с помощью Amazon Echo необходимо установить библиотеку FauxmoESP. Эта библиотека эмулирует устройство Belkin Wemo, позволяя управлять ESP32 или ESP8266 с помощью этого протокола. Таким образом, Echo или Echo Dot мгновенно распознаёт устройство после загрузки кода, без каких-либо дополнительных навыков или сторонних сервисов. Подробнее о FauxmoESP можно прочитать здесь.

Установка библиотеки FauxmoESP

  1. Нажмите здесь, чтобы скачать библиотеку FauxmoESP. У вас должен появиться .zip файл в папке Загрузки

  2. Распакуйте .zip файл, и вы должны получить папку xoseperez-fauxmoesp-50cbcf3087fd

  3. Переименуйте папку из xoseperez-fauxmoesp-50cbcf3087fd в xoseperez_fauxmoesp

  4. Переместите папку xoseperez_fauxmoesp в папку libraries вашей установки Arduino IDE

  5. Наконец, перезапустите Arduino IDE

Alexa – Echo Dot с ESP8266

Следуйте этим инструкциям, если вы используете ESP8266.

Установка платы ESP8266 в Arduino IDE

Для загрузки кода на ESP8266 с помощью Arduino IDE необходимо установить дополнение для Arduino IDE, которое позволяет программировать ESP8266, используя Arduino IDE и его язык программирования. Если вы ещё не установили дополнение ESP8266 для Arduino IDE, следуйте следующему руководству:

Установка библиотеки ESPAsyncTCP

Вам также необходимо установить библиотеку ESPAsyncTCP. Следуйте инструкциям ниже для её установки:

  1. Нажмите здесь, чтобы скачать библиотеку ESPAsyncTCP. У вас должен появиться .zip файл в папке Загрузки

  2. Распакуйте .zip файл, и вы должны получить папку ESPAsyncTCP-master

  3. Переименуйте папку из ESPAsyncTCP-master в ESPAsyncTCP

  4. Переместите папку ESPAsyncTCP в папку libraries вашей установки Arduino IDE

  5. Наконец, перезапустите Arduino IDE

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

Если вы используете плату ESP8266, соберите схему, следуя диаграмме ниже – вы можете нажать на изображение для увеличения.

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

Если вам сложно разобраться в схеме, вы можете использовать следующую таблицу в качестве справки:

ESP8266

Подключение к

GPIO 5

Вывод данных приёмника 433 МГц

GPIO 4

Вывод IN1 реле

GPIO 14

Вывод IN2 реле

ВАЖНОЕ ПРИМЕЧАНИЕ: перед подачей питания убедитесь, что выходное напряжение понижающего преобразователя установлено на 5В! В противном случае вы можете повредить ESP.

Понижающий преобразователь настроен на 5В

Alexa – Echo Dot с ESP32

Следуйте этим инструкциям, если вы используете ESP32.

Установка платы ESP32 в Arduino IDE

Для загрузки кода на ESP32 с помощью Arduino IDE необходимо установить дополнение для Arduino IDE, которое позволяет программировать ESP32, используя Arduino IDE и его язык программирования. Если вы ещё не установили дополнение ESP32 для Arduino IDE, следуйте следующим руководствам:

Установка библиотеки AsyncTCP

Вам также необходимо установить библиотеку AsyncTCP. Следуйте инструкциям ниже для её установки:

  1. Нажмите здесь, чтобы скачать библиотеку AsyncTCP. У вас должен появиться .zip файл в папке Загрузки

  2. Распакуйте .zip файл, и вы должны получить папку AsyncTCP-master

  3. Переименуйте папку из AsyncTCP-master в AsyncTCP

  4. Переместите папку AsyncTCP в папку libraries вашей установки Arduino IDE

  5. Наконец, перезапустите Arduino IDE

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

Если вы используете плату ESP32, соберите схему, следуя диаграмме ниже – вы можете нажать на изображение для увеличения.

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

Если вам сложно разобраться в схеме, вы можете использовать следующую таблицу в качестве справки:

ESP32

Подключение к

GPIO 13

Вывод данных приёмника 433 МГц

GPIO 14

Вывод IN1 реле

GPIO 12

Вывод IN2 реле

ВАЖНОЕ ПРИМЕЧАНИЕ: перед подачей питания убедитесь, что выходное напряжение понижающего преобразователя установлено на 5В! В противном случае вы можете повредить ESP.

Понижающий преобразователь настроен на 5В

Код

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

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <Arduino.h>
#ifdef ESP32
  #include <WiFi.h>
  #define RF_RECEIVER 13
  #define RELAY_PIN_1 12
  #define RELAY_PIN_2 14
#else
  #include <ESP8266WiFi.h>
  #define RF_RECEIVER 5
  #define RELAY_PIN_1 4
  #define RELAY_PIN_2 14
#endif
#include "fauxmoESP.h"

#include <RCSwitch.h>

#define SERIAL_BAUDRATE 115200

#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASS "REPLACE_WITH_YOUR_PASSWORD"

#define LAMP_1 "lamp one"
#define LAMP_2 "lamp two"

fauxmoESP fauxmo;

RCSwitch mySwitch = RCSwitch();

// Wi-Fi Connection
void wifiSetup() {
  // Set WIFI module to STA mode
  WiFi.mode(WIFI_STA);

  // Connect
  Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  // Wait
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }
  Serial.println();

  // Connected!
  Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}

void setup() {
  // Init serial port and clean garbage
  Serial.begin(SERIAL_BAUDRATE);
  Serial.println();

  // Wi-Fi connection
  wifiSetup();

  // LED
  pinMode(RELAY_PIN_1, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);

  pinMode(RELAY_PIN_2, OUTPUT);
  digitalWrite(RELAY_PIN_2, HIGH);

  mySwitch.enableReceive(RF_RECEIVER);  // Receiver on interrupt 0 => that is pin #2

  // By default, fauxmoESP creates it's own webserver on the defined port
  // The TCP port must be 80 for gen3 devices (default is 1901)
  // This has to be done before the call to enable()
  fauxmo.createServer(true); // not needed, this is the default value
  fauxmo.setPort(80); // This is required for gen3 devices

  // You have to call enable(true) once you have a WiFi connection
  // You can enable or disable the library at any moment
  // Disabling it will prevent the devices from being discovered and switched
  fauxmo.enable(true);
  // You can use different ways to invoke alexa to modify the devices state:
  // "Alexa, turn lamp two on"

  // Add virtual devices
  fauxmo.addDevice(LAMP_1);
  fauxmo.addDevice(LAMP_2);

  fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
    // Callback when a command from Alexa is received.
    // You can use device_id or device_name to choose the element to perform an action onto (relay, LED,...)
    // State is a boolean (ON/OFF) and value a number from 0 to 255 (if you say "set kitchen light to 50%" you will receive a 128 here).
    // Just remember not to delay too much here, this is a callback, exit as soon as possible.
    // If you have to do something more involved here set a flag and process it in your main loop.

    Serial.printf("[MAIN] Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value);
    if ( (strcmp(device_name, LAMP_1) == 0) ) {
      // this just sets a variable that the main loop() does something about
      Serial.println("RELAY 1 switched by Alexa");
      //digitalWrite(RELAY_PIN_1, !digitalRead(RELAY_PIN_1));
      if (state) {
        digitalWrite(RELAY_PIN_1, LOW);
      } else {
        digitalWrite(RELAY_PIN_1, HIGH);
      }
    }
    if ( (strcmp(device_name, LAMP_2) == 0) ) {
      // this just sets a variable that the main loop() does something about
      Serial.println("RELAY 2 switched by Alexa");
      if (state) {
        digitalWrite(RELAY_PIN_2, LOW);
      } else {
        digitalWrite(RELAY_PIN_2, HIGH);
      }
    }
  });

}

void loop() {
  // fauxmoESP uses an async TCP server but a sync UDP server
  // Therefore, we have to manually poll for UDP packets
  fauxmo.handle();

  static unsigned long last = millis();
  if (millis() - last > 5000) {
    last = millis();
    Serial.printf("[MAIN] Free heap: %d bytes\n", ESP.getFreeHeap());
  }

  if (mySwitch.available()) {
  /*Serial.print("Received ");
    Serial.print( mySwitch.getReceivedValue() );
    Serial.print(" / ");
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print("bit ");
    Serial.print("Protocol: ");
    Serial.println( mySwitch.getReceivedProtocol() );*/
    if (mySwitch.getReceivedValue()==6819768) {
      digitalWrite(RELAY_PIN_1, !digitalRead(RELAY_PIN_1));
    }
    if (mySwitch.getReceivedValue()==9463928) {
      digitalWrite(RELAY_PIN_2, !digitalRead(RELAY_PIN_2));
    }
    delay(600);
    mySwitch.resetAvailable();
  }
}

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

Выбор правильной платы

Этот код работает как с ESP32, так и с ESP8266. Чтобы он работал с вашей платой, вам нужно выбрать плату, которую вы используете, в Tools > Board. Выберите вашу модель ESP8266 или ESP32.

Выбор платы в Arduino IDE

Добавление учётных данных сети

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

#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASS "REPLACE_WITH_YOUR_PASSWORD"

Добавление кодов сигналов 433 МГц

Вам также нужно включить сигналы, которые вы ранее декодировали для ваших настенных выключателей.

Замените значение, выделенное красным, на значение, которое вы получили для выключателя, управляющего лампой 1:

if (mySwitch.getReceivedValue()==6819768) {
  digitalWrite(RELAY_PIN_1, !digitalRead(RELAY_PIN_1));
}

И значение для лампы 2 в следующем фрагменте:

if (mySwitch.getReceivedValue()==9463928) {
  digitalWrite(RELAY_PIN_2, !digitalRead(RELAY_PIN_2));
}

Загрузка кода

После внесения всех необходимых изменений вы можете загрузить код на ESP. Убедитесь, что выбран правильный COM-порт в Tools > Port. Для демонстрации вы можете открыть монитор порта (Serial Monitor) на скорости 115200 бод, пока подготавливаете Echo Dot.

Alexa, обнаружение устройств

Когда схема готова и код загружен на ESP8266 или ESP32, вам нужно попросить Alexa обнаружить устройства.

Скажите: «Alexa, discover devices». Она должна ответить, как показано на рисунке ниже.

Alexa обнаруживает устройства ESP

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

Обнаружение устройств в приложении Alexa

Затем попросите Alexa включить/выключить лампы. Вы также получите информацию о состоянии ламп в мониторе порта (Serial Monitor).

Вывод Serial Monitor

Убедившись, что всё работает правильно, вы можете превратить вашу схему в постоянное решение.

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

В демонстрационных целях мы собрали нашу схему на макетной плате (stripboard) и закрепили всё на деревянной доске, как показано на рисунке ниже:

Готовая схема Alexa ESP на плате

Теперь вы можете попросить Alexa управлять вашими лампами с помощью следующих голосовых команд:

  • «Alexa, turn on lamp 1»

  • «Alexa, turn off lamp 1»

  • «Alexa, turn on lamp 2»

  • «Alexa, turn off lamp 2»

Вы также можете управлять обеими лампами одновременно, создав группу в приложении Amazon Alexa. Мы назвали её «lamps».

Создание группы в приложении Alexa

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

  • «Alexa, turn on lamps»

  • «Alexa, turn off lamps»

Вы также можете физически управлять лампами с помощью настенных выключателей 433 МГц.

Тестирование настенного выключателя 433 МГц

Заключение

В этом проекте мы показали, как управлять ESP8266 и ESP32 голосовыми командами с помощью Amazon Echo. В качестве примера мы управляли двумя 12В лампами с помощью реле. Вместо 12В ламп вы можете управлять любыми другими электронными устройствами. Мы также показали, как можно дистанционно управлять лампами с помощью настенного выключателя 433 МГц.

Надеемся, что этот проект оказался для вас полезным. Если вам понравилась эта публикация, вам также могут понравиться:

Спасибо за чтение.

Источник: Alexa (Echo) with ESP32 and ESP8266 – Voice Controlled Relay