语音控制继电器 语音控制继电器模块
liebian365 2024-10-19 07:57 25 浏览 0 评论
在本项目中,您将学习如何使用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墙壁开关来物理控制灯。每个灯都有一个开关。开关将灯的状态更改为与当前状态相反的状态。例如,如果灯泡熄灭,请按墙壁开关将其打开。要关闭它,您只需要再次按一下开关即可。看一下下图,它说明了它是如何工作的。
所需零件
这是此项目所需零件的完整列表:
- 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墙面板开关远程控制灯。
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)