在本項目中,您將學習如何使用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牆壁開關來物理控制燈。每個燈都有一個開關。開關將燈的狀態更改為與當前狀態相反的狀態。例如,如果燈泡熄滅,請按牆壁開關將其打開。要關閉它,您只需要再次按一下開關即可。看一下下圖,它說明了它是如何工作的。
![語音控制繼電器](http://p2.ttnews.xyz/loading.gif)
所需零件
這是此項目所需零件的完整列表:
![語音控制繼電器](http://p2.ttnews.xyz/loading.gif)
- 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牆面板開關遠程控制燈。
閱讀更多 工控電子愛好者 的文章