语音控制继电器


在本项目中,您将学习如何使用Alexa(Amazon Echo Dot)的语音命令控制ESP8266或ESP32。作为示例,我们将控制连接到继电器模块的两个12V灯。我们还将添加两个433 MHz RF墙面板开关,以物理方式控制灯。

注意:本教程与所有Echo Dot版本以及最新的fauxmoESP库(3.1.0)兼容。它与ESP32和ESP8266一起使用。

项目概况

该项目适用于ESP8266和ESP32。我们为两个开发板都提供了说明。在继续进行该项目之前,请阅读本节以了解到该项目结束时将要实现的目标。

使用Alexa的控制灯

在该项目结束时,您将能够使用Alexa使用语音命令控制两个灯(灯1和灯2)。下图显示了该项目如何控制灯1的高级概述–它与灯2相似。


Alexa将响应以下命令:

· " Alexa,打开灯1"

· " Alexa,关闭灯1"

· " Alexa,打开灯2"

· " Alexa,关闭灯2"

· " Alexa,打开灯"打开两个灯

· " Alexa,关闭灯"关闭两个灯

当您说" Alexa,打开灯1"时,ESP8266或ESP32将触发继电器以打开灯1。当您说 " Alexa,关闭灯1"时,ESP8266或ESP32将发送信号给继电器关闭灯。这与灯2相似。

使用433 MHz墙壁开关的控制灯

在此项目中,我们还将添加两个433 MHz墙壁开关来物理控制灯。每个灯都有一个开关。开关将灯的状态更改为与当前状态相反的状态。例如,如果灯泡熄灭,请按墙壁开关将其打开。要关闭它,您只需要再次按一下开关即可。看一下下图,它说明了它是如何工作的。

语音控制继电器

所需零件

这是此项目所需零件的完整列表:

语音控制继电器

  • ESP板(您可以使用ESP32或ESP8266):
  • ESP8266
  • ESP32 –我们使用 ESP32 DOIT DEVKIT V1 开发板– 36 GPIO
    • Alexa –回声,回声显示或回声点
    • 433 MHz射频墙面板开关
    • 433 MHz发射器/接收器
    • 12V 2A电源适配器
    • 降压型降压转换器
    • 继电器模块
    • 12V灯
    • 12V灯头
    • 直流DC桶形插孔2.1mm
    • 面包板
    • 跳线

    Amazon Echo有几种可用的模型–它们都与此项目兼容。

    语音控制继电器

    433 MHz射频墙面板开关

    433 MHz射频墙面板开关是远程控制设备的好方法。它可以通过胶水龙头轻松地固定在墙上,而无需在墙上打孔。此外,它是无线的,因此您无需担心接线和隐藏电缆的麻烦。

    在这个项目中,我们使用两个墙面板开关。相反,您可以使用带有两个按钮的面板开关–还有一个带有三个开关的版本。

    语音控制继电器

    该墙面板开关的电路中有一个按钮,如下图所示,按下该按钮将发出433 MHz信号。您可以使用该信号来控制您想要的任何东西。该墙面板开关使用27A 12V型电池(包装中未提供)。因此,当您获得墙面板开关时,您可能想要购买一个。

    语音控制继电器

    解码墙面板开关433 MHz RF信号

    当您按下433 MHz墙壁面板开关时,它将发送433 MHz信号。您需要使用433 MHz接收器对该信号进行解码。该程序适用于Arduino,ESP32和ESP8266。

    记下每个开关的十进制(24Bit)代码,因为稍后将需要它们。

    语音控制继电器

    就我而言:

    · 开关1:6819768

    · 开关2: 9463928

    您应该获得不同的值。然后,您将在ESP8266或ESP32程序中使用这些信号。当您按下开关时,它会发送433 MHz信号。该信号被连接到ESP的接收器检测到。这样,ESP便知道该开关已按下,并反转了灯的当前状态。

    语音控制继电器

    FauxmoESP

    要使用Amazon Echo控制ESP8266或ESP32,您需要安装FauxmoESP库。该库模拟Belkin Wemo设备,使您可以使用此协议控制ESP32或ESP8266。这样,在上传代码后,Echo或Echo Dot可以立即识别设备,而无需任何其他技能或第三方服务。

    安装FauxmoESP库

    1. 下载xoseperez-fauxmoesp-50cbcf3087fd

    .zip文件

    2. 解压缩 .zip 文件夹,您应该得到xoseperez-fauxmoesp-50cbcf3087fd 文件夹

    3. 重命名您的文件夹 为xoseperez_fauxmoesp

    4. 将xoseperez_fauxmoesp文件夹移至Arduino IDE安装 文件夹

    5. 最后,重新打开您的Arduino IDE

    Alexa –带ESP8266的Echo Dot

    如果您使用的是ESP8266,请按照以下说明进行操作。

    在Arduino IDE中安装ESP8266开发板

    · 为了使用Arduino IDE将代码上传到ESP8266,您应该为Arduino IDE安装一个插件,使您可以使用Arduino IDE及其编程语言对ESP8266进行编程。

    安装ESPAsyncTCP库

    您还需要安装ESPAsyncTCP库库。请按照以下说明进行安装:

    1. 下载ESPAsyncTCP-master

    .zip文件

    2. 解压缩 .zip 文件夹,您应该得到 ESPAsyncTCP-master 文件夹

    3. 重命名您的文件夹 到ESPAsyncTCP

    4. 将ESPAsyncTCP文件夹移至Arduino IDE安装 文件夹

    5. 最后,重新打开您的Arduino IDE

    重要提示:在接通电源之前,请确保将降压型降压转换器的输出电压设置为5V!否则,可能会损坏ESP。

    语音控制继电器

    Alexa –带ESP32的Echo Dot

    如果您使用的是ESP32,请遵循以下指示。

    在Arduino IDE中安装ESP32开发板

    · 为了使用Arduino IDE将代码上传到ESP32,您应该为Arduino IDE安装一个插件,该插件允许您使用Arduino IDE及其编程语言对ESP32进行编程。

    安装AsyncTCP库

    您还需要安装AsyncTCP库。请按照以下说明进行安装:

    1. 下载AsyncTCP-master.zip文件夹

    2. 解压缩 .zip 文件夹,您应该获得 AsyncTCP-master 文件夹

    3. 重命名您的文件夹 到 AsyncTCP

    4. 将AsyncTCP文件夹移至Arduino IDE安装 文件夹

    5. 最后,重新打开您的Arduino IDE


    重要提示:在接通电源之前,请确保将降压型降压转换器的输出电压设置为5V!否则,可能会损坏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。为了使其适合您的电路板,您需要在"

    工具" > "电路板"中选择要使用的电路。选择您的ESP8266或ESP32型号。

    语音控制继电器

    添加您的网络凭据

    您需要修改以下几行以包括您的网络凭据。

    #定义WIFI_SSID" REPLACE_WITH_YOUR_SSID "

    #定义WIFI_PASS" REPLACE_WITH_YOUR_PASSWORD "

    添加您的433 MHz信号代码

    您还需要包括您先前为墙面板开关解码的信号。

    将红色突出显示的值替换为您获得的用于控制指示灯1的开关的值:

    如果(mySwitch.getReceivedValue()== 6819768){

    digitalWrite(RELAY_PIN_1,!digitalRead(RELAY_PIN_1));

    }

    以及灯泡2的值如下:

    如果(mySwitch.getReceivedValue()== 9463928) {

    digitalWrite(RELAY_PIN_2,!digitalRead(RELAY_PIN_2));

    }

    上传代码

    进行所有必要的更改后,您可以将代码上传到ESP。请确保你选择了正确的COM端口,在工具 >

    端口。出于演示目的,您可以在准备Amazon Alexa时以115200的波特率打开串行监视器。

    Alexa发现设备

    准备好电路并将代码上传到ESP8266或ESP32后,您需要询问Alexa发现设备。

    说:" Alexa,发现设备"。答案如下图所示。

    语音控制继电器

    或者,您也可以按照下图所示的步骤使用Amazon Alexa应用程序发现设备。

    语音控制继电器

    然后,要求Alexa打开/关闭灯。您还将在串行监视器上获得有关指示灯状态的信息。

    语音控制继电器

    确保一切正常后,您可以将电路变成永久解决方案。

    示范

    出于演示目的,我们将电路构建在木板上,并将所有内容都安装在木板上,如下图所示:

    语音控制继电器

    现在,您可以要求Alexa通过以下语音命令控制您的灯:

    · " Alexa,打开灯1"

    · " Alexa,关闭灯1"

    · " Alexa,打开灯2"

    · " Alexa,关闭灯2"

    您还可以通过在Amazon Alexa应用程序中创建一个组来同时控制两个灯。我们称它为"灯"。

    语音控制继电器

    现在,您可以使用以下语音命令同时控制两个灯泡。

    · " Alexa,打开灯"

    · " Alexa,关灯"

    您还可以使用433 MHz墙壁面板开关来物理控制灯。

    语音控制继电器

    写在最后

    在这个项目中,我们展示了如何使用Amazon Echo的语音命令来控制ESP8266和ESP32。例如,我们使用继电器控制了两个12V灯。您可以控制任何其他电子设备来代替12V灯。我们还向您展示了如何使用433 MHz墙面板开关远程控制灯。


    分享到:


    相關文章: