语音控制继电器 语音控制继电器模块
liebian365 2024-10-19 07:57 31 浏览 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墙面板开关远程控制灯。
相关推荐
- 精品博文嵌入式6410中蓝牙的使用
-
BluetoothUSB适配器拥有一个BluetoothCSR芯片组,并使用USB传输器来传输HCI数据分组。因此,LinuxUSB层、BlueZUSB传输器驱动程序以及B...
- win10跟这台计算机连接的前一个usb设备工作不正常怎么办?
-
前几天小编闲来无事就跑到网站底下查看粉丝朋友给小编我留言询问的问题,还真的就给小编看到一个问题,那就是win10跟这台计算机连接的一个usb设备运行不正常怎么办,其实这个问题的解决方法时十分简单的,接...
- 制作成本上千元的键盘,厉害在哪?
-
这是稚晖君亲自写的开源资料!下方超长超详细教程预警!!全文导航:项目简介、项目原理说明、硬件说明、软件说明项目简介瀚文智能键盘是一把我为自己设计的——多功能、模块化机械键盘。键盘使用模块化设计。左侧的...
- E-Marker芯片,USB数据线的“性能中枢”?
-
根据线缆行业的研究数据,在2019年搭载Type-C接口的设备出货量已达到20亿台,其中80%的笔记本电脑和台式电脑采用Type-C接口,50%的智能手机和平板电脑也使用Type-C接口。我们都知道,...
- ZQWL-USBCANFD二次开发通讯协议V1.04
-
修订历史:1.功能介绍1.1型号说明本文档适用以下型号: ZQWL-CAN(FD)系列产品,USB通讯采用CDC类实现,可以在PC机上虚拟出一个串口,串口参数N,8,1格式,波特率可以根据需要设置(...
- win10系统无法识别usb设备怎么办(win10不能识别usb)
-
从驱动入手,那么win10系统无法识别usb设备怎么办呢?今天就为大家分享win10系统无法识别usb设备的解决方法。1、右键选择设备管理器,如图: 2、点击更新驱动程序,如图: 3、选择浏览...
- 微软七月Win8.1可选补丁有内涵,含大量修复
-
IT之家(www.ithome.com):微软七月Win8.1可选补丁有内涵,含大量修复昨日,微软如期为Win7、Win8.1发布7月份安全更新,累计为6枚安全补丁,分别修复总计29枚安全漏洞,其中2...
- 如何从零开始做一个 USB 键盘?(怎么制作usb)
-
分两种情况:1、做一个真正的USB键盘,这种设计基本上不涉及大量的软件编码。2、做一个模拟的USB键盘,实际上可以没有按键功能,这种的需要考虑大量的软件编码,实际上是一个单片机。第一种设计:买现成的U...
- 电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题
-
电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题注意:有些方法会清除USB设备里的数据,请谨慎操作,如果不想丢失数据,可以先连接到其他电脑,看能否将数据复制出来,或者用一些数据恢复软件去扫...
- 未知usb设备设备描述符请求失败怎么解决
-
出现未知daousb设备设备描述符请求失du败解决办zhi法如下:1、按下Windows+R打开【运行】;2、在版本运行的权限输入框中输入:services.msc按下回车键打开【服务】;2、在服务...
- 读《飘》47章20(飘每章概括)
-
AndAhwouldn'tleaveMissEllen'sgrandchildrenfornotrashystep-patobringup,never.Here,Ah...
- 英翻中 消失的过去 37(消失的英文怎么说?)
-
翻译(三十七):消失的过去/茱迪o皮考特VanishingActs/JodiPicoult”我能做什么?“直到听到了狄利亚轻柔的声音,我才意识到她已经在厨房里站了好一会儿了。当她说话的时候,...
- RabbitMQ 延迟消息实战(rabbitmq如何保证消息不被重复消费)
-
现实生活中有一些场景需要延迟或在特定时间发送消息,例如智能热水器需要30分钟后打开,未支付的订单或发送短信、电子邮件和推送通知下午2:00开始的促销活动。RabbitMQ本身没有直接支持延迟...
- Java对象拷贝原理剖析及最佳实践(java对象拷贝方法)
-
作者:宁海翔1前言对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po、Dto、Do、Vo各个表现层数据的转换,也存在于系统交互如序列化、反序列化。Java对象拷贝分为深拷贝和浅拷贝,目前常用的...
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
-
Qt组件推荐:QtitanRibbon:遵循MicrosoftRibbonUIParadigmforQt技术的RibbonUI组件,致力于为Windows、Linux和MacOSX提...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)