語音控制繼電器


在本項目中,您將學習如何使用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牆面板開關遠程控制燈。


    分享到:


    相關文章: