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 будет реагировать на следующие команды:
«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 МГц для физического управления лампами. У вас будет отдельный выключатель для каждой лампы. Выключатель изменяет состояние лампы на противоположное текущему. Например, если лампа выключена, нажмите настенный выключатель, чтобы включить её. Чтобы выключить, просто нажмите выключатель ещё раз. Посмотрите на рисунок ниже, который иллюстрирует принцип работы.
Необходимые компоненты
Вот полный список компонентов, необходимых для этого проекта (нажмите на ссылки ниже, чтобы найти лучшую цену на Maker Advisor):
Плата ESP (можно использовать ESP32 или ESP8266):
ESP8266 – читайте Лучшие платы разработки ESP8266 Wi-Fi
ESP32 – мы используем ESP32 DOIT DEVKIT V1 Board – 36 GPIO (читайте сравнение плат разработки ESP32)
Alexa – Echo, Echo Show или Echo Dot (читайте следующий раздел для подробностей)
12В лампа
Патрон для 12В лампы
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Как купить Amazon Echo
Вы можете использовать ссылки ниже для покупки Amazon Echo. Доступно несколько моделей – все они совместимы с этим проектом.
Покупка Amazon Echo через Amazon доступна не для всех стран. Мы предоставляем ссылки для Amazon в Великобритании, США и Германии. Если Amazon Echo не доставляется в вашу страну через Amazon, вы можете приобрести его на eBay (доставка по всему миру).
Echo Dot (2-е поколение)
Echo (2-е поколение)
Echo Show
Настенный выключатель 433 МГц RF
Настенный выключатель 433 МГц RF – отличный способ дистанционного управления устройствами. Он легко крепится к стене на клейкую ленту, без необходимости сверлить отверстия в стенах. Кроме того, он беспроводной, поэтому вам не нужно беспокоиться о прокладке и скрытии кабелей.
В этом проекте мы используем два настенных выключателя. Вместо них вы можете использовать панельный выключатель с двумя кнопками – есть также версия с тремя выключателями.
Этот настенный выключатель имеет кнопку в своей схеме, как показано на рисунке ниже, которая при нажатии излучает сигнал 433 МГц. Вы можете использовать этот сигнал для управления чем угодно. Этот настенный выключатель использует батарею типа 27A 12V (не входит в комплект). Поэтому вам может понадобиться приобрести её при покупке настенного выключателя.
Декодирование RF-сигналов 433 МГц настенного выключателя
При нажатии настенного выключателя 433 МГц он отправляет сигнал на частоте 433 МГц. Вам нужно декодировать этот сигнал с помощью приёмника 433 МГц. Чтобы узнать, как декодировать сигнал 433 МГц, прочитайте следующую публикацию: Декодирование и отправка RF-сигналов 433 МГц с Arduino – прочитайте раздел «Decoder Sketch». Скетч работает с Arduino, ESP32 и ESP8266.
Запишите десятичный (24-битный) код для каждого из ваших выключателей, потому что он понадобится вам позже.
В моём случае:
выключатель 1: 6819768
выключатель 2: 9463928
У вас должны получиться другие значения. Затем вы будете использовать эти сигналы в скетче для ESP8266 или ESP32. При нажатии выключателя он отправляет сигнал 433 МГц. Этот сигнал обнаруживается приёмником, подключённым к ESP. Таким образом, ESP знает, что выключатель был нажат, и инвертирует текущее состояние лампы.
Библиотека FauxmoESP
Для управления ESP8266 или ESP32 с помощью Amazon Echo необходимо установить библиотеку FauxmoESP. Эта библиотека эмулирует устройство Belkin Wemo, позволяя управлять ESP32 или ESP8266 с помощью этого протокола. Таким образом, Echo или Echo Dot мгновенно распознаёт устройство после загрузки кода, без каких-либо дополнительных навыков или сторонних сервисов. Подробнее о FauxmoESP можно прочитать здесь.
Установка библиотеки FauxmoESP
Нажмите здесь, чтобы скачать библиотеку FauxmoESP. У вас должен появиться .zip файл в папке Загрузки
Распакуйте .zip файл, и вы должны получить папку xoseperez-fauxmoesp-50cbcf3087fd
Переименуйте папку из xoseperez-fauxmoesp-50cbcf3087fd в xoseperez_fauxmoesp
Переместите папку xoseperez_fauxmoesp в папку libraries вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
Alexa – Echo Dot с ESP8266
Следуйте этим инструкциям, если вы используете ESP8266.
Установка платы ESP8266 в Arduino IDE
Для загрузки кода на ESP8266 с помощью Arduino IDE необходимо установить дополнение для Arduino IDE, которое позволяет программировать ESP8266, используя Arduino IDE и его язык программирования. Если вы ещё не установили дополнение ESP8266 для Arduino IDE, следуйте следующему руководству:
Установка библиотеки ESPAsyncTCP
Вам также необходимо установить библиотеку ESPAsyncTCP. Следуйте инструкциям ниже для её установки:
Нажмите здесь, чтобы скачать библиотеку ESPAsyncTCP. У вас должен появиться .zip файл в папке Загрузки
Распакуйте .zip файл, и вы должны получить папку ESPAsyncTCP-master
Переименуйте папку из ESPAsyncTCP-master в ESPAsyncTCP
Переместите папку ESPAsyncTCP в папку libraries вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
Схема подключения (ESP8266)
Если вы используете плату ESP8266, соберите схему, следуя диаграмме ниже – вы можете нажать на изображение для увеличения.
Если вам сложно разобраться в схеме, вы можете использовать следующую таблицу в качестве справки:
ESP8266 |
Подключение к |
|---|---|
GPIO 5 |
Вывод данных приёмника 433 МГц |
GPIO 4 |
Вывод IN1 реле |
GPIO 14 |
Вывод IN2 реле |
ВАЖНОЕ ПРИМЕЧАНИЕ: перед подачей питания убедитесь, что выходное напряжение понижающего преобразователя установлено на 5В! В противном случае вы можете повредить ESP.
Alexa – Echo Dot с ESP32
Следуйте этим инструкциям, если вы используете ESP32.
Установка платы ESP32 в Arduino IDE
Для загрузки кода на ESP32 с помощью Arduino IDE необходимо установить дополнение для Arduino IDE, которое позволяет программировать ESP32, используя Arduino IDE и его язык программирования. Если вы ещё не установили дополнение ESP32 для Arduino IDE, следуйте следующим руководствам:
Инструкции для Windows – Установка платы ESP32 в Arduino IDE
Инструкции для Mac и Linux – Установка платы ESP32 в Arduino IDE
Установка библиотеки AsyncTCP
Вам также необходимо установить библиотеку AsyncTCP. Следуйте инструкциям ниже для её установки:
Нажмите здесь, чтобы скачать библиотеку AsyncTCP. У вас должен появиться .zip файл в папке Загрузки
Распакуйте .zip файл, и вы должны получить папку AsyncTCP-master
Переименуйте папку из AsyncTCP-master в AsyncTCP
Переместите папку AsyncTCP в папку libraries вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
Схема подключения (ESP32)
Если вы используете плату ESP32, соберите схему, следуя диаграмме ниже – вы можете нажать на изображение для увеличения.
Если вам сложно разобраться в схеме, вы можете использовать следующую таблицу в качестве справки:
ESP32 |
Подключение к |
|---|---|
GPIO 13 |
Вывод данных приёмника 433 МГц |
GPIO 14 |
Вывод IN1 реле |
GPIO 12 |
Вывод IN2 реле |
ВАЖНОЕ ПРИМЕЧАНИЕ: перед подачей питания убедитесь, что выходное напряжение понижающего преобразователя установлено на 5В! В противном случае вы можете повредить ESP.
Код
Скопируйте следующий код в 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.
Добавление учётных данных сети
Вам нужно изменить следующие строки, чтобы включить ваши учётные данные сети.
#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». Она должна ответить, как показано на рисунке ниже.
В качестве альтернативы вы также можете обнаружить устройства с помощью приложения Amazon Alexa, выполнив шаги, показанные на рисунке ниже.
Затем попросите Alexa включить/выключить лампы. Вы также получите информацию о состоянии ламп в мониторе порта (Serial Monitor).
Убедившись, что всё работает правильно, вы можете превратить вашу схему в постоянное решение.
Демонстрация
В демонстрационных целях мы собрали нашу схему на макетной плате (stripboard) и закрепили всё на деревянной доске, как показано на рисунке ниже:
Теперь вы можете попросить 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, turn on lamps»
«Alexa, turn off lamps»
Вы также можете физически управлять лампами с помощью настенных выключателей 433 МГц.
Заключение
В этом проекте мы показали, как управлять ESP8266 и ESP32 голосовыми командами с помощью Amazon Echo. В качестве примера мы управляли двумя 12В лампами с помощью реле. Вместо 12В ламп вы можете управлять любыми другими электронными устройствами. Мы также показали, как можно дистанционно управлять лампами с помощью настенного выключателя 433 МГц.
Надеемся, что этот проект оказался для вас полезным. Если вам понравилась эта публикация, вам также могут понравиться:
Спасибо за чтение.
—
Источник: Alexa (Echo) with ESP32 and ESP8266 – Voice Controlled Relay