像 Amazon Echo 或 Google home 这样的智能扬声器现在越来越流行,它们都能够集成自定义技能或动作来控制使用这些智能扬声器的任何设备。
如今,家庭自动化已经变得非常普遍,人们正在使用物联网来自动化他们家中的一切。在本教程中,我们将使用真正的 Amazon Echo dot 扬声器并创建自定义技能来使用 Amazon Echo dot 扬声器来控制电灯、风扇、电视、插座等交流家用电器。在这里,我们将使用 Arduino UNO 和 ESP8266-01 Wi-Fi 模块将 Echo dot 扬声器与 AC 设备连接起来。在本教程之后,您将能够通过Alexa控制任何设备。
使用的硬件组件:
Arduino UNO
ESP-01 模块
亚马逊 Alexa 回声点
面包板
5V继电器模块
交流电器
跳线
使用 CP2102 USB-TTL 转换器对 ESP-01 模块进行编程:
这里 ESP-01 使用 CP2102 USB-TTL 转换器进行编程;它也可以使用 Arduino UNO 板进行编程。在我的例子中,我使用了 CP2102 模块,执行此操作的步骤如下所述。
ESP-01 模块
ESP8266 ESP-01 是一款在物联网应用设计中非常流行的 Wi-Fi 模块,用于让 Arduino UNO 等微控制器连接互联网。该模块是一个独立的片上系统 (SOC),可以像小型计算机一样工作。它带有预装的 AT 固件,因此我们可以使用 Arduino IDE 对其进行编程。您可以通过以下链接了解有关 ESP-01 Wi-Fi 收发器及其使用 Arduino IDE 编程的更多信息。
引脚说明:
GND: ESP-01 的接地参考引脚
TXD:用作 UART 发送器引脚
RXD:用作 UART 接收器引脚
RESET:用于复位模块,低电平有效。
CH_PD:芯片使能管脚,高电平有效。
GPIO0:此引脚有两个用途。一个是通用输入/输出,另一个是启用 ESP-01 的编程模式
GPIO2:这是一个通用输入/输出引脚。
ESP-01 与 CP2102 模块的连接:
下图为CP2102 USB-TTL 转换器的引脚图。按照下表将 ESP-01 模块与 CP2102 USB-TTL 转换器模块连接。
成功完成上述连接后,电路应如下所示:
然后将CP2102模块连接到我们的PC进行编程。在将代码上传到 ESP-01 之前,首先检查通信端口。为此,请转到开始-》 并搜索设备管理器。然后单击 COM 和端口。在这个选项下,我们应该得到一个带有 USB-TTL 转换器名称的 COM 端口,如“ Silicon labs CP21xx USB-UART Bridge ”,如下图所示:
成功完成上述步骤后,打开 Arduino IDE 并从Tools菜单中选择板为“ Generic ESP8266 Module ”,并选择我们在上一阶段获得的 COM 端口。
用于 Alexa 家庭自动化的 ESP-01 模块的编程
完整的代码在这个项目的最后给出。这是要上传到 ESP-01 模块的代码的逐步说明。第一步是包含所有必要的库。您可以从此处的链接下载“fauxmoESP.h”库。
#include#include #include “fauxmoESP.h”
在这一步中,我们必须定义将 ESP-01 连接到互联网所需的所有凭据。在程序中更新您的网络 SSID 和密码数据。
#define SSID "*******" #define pass "*******"
接下来定义我们需要从 Alexa 控制的设备的名称。就我而言,我将我的设备名称命名为“卧室灯”、“卧室风扇”和“智能插座” 。
#define device1 "卧室灯" #define device2 "卧室风扇" #define device3 "智能插座"
函数WiFi.mode用于将 ESP-01 模块设置为 Station 模式,函数WiFi.begin用于将 ESP-01 模块连接到互联网,它以网络的 SSID 和密码为参数。
WiFi.mode(WIFI_STA); WiFi.begin(ssid,pass);
下一部分是初始化 Fauxmo类的所有功能,例如创建服务器、启用 Alexa 设备的端口号、启用设备等。然后使用我们之前创建的fauxmo.addDevice添加所有设备。
fauxmo.createServer(true); fauxmo.setPort(80); fauxmo.enable(true); fauxmo.addDevice(device1); fauxmo.addDevice(device2); fauxmo.addDevice(device3);
接下来,编写一个函数来将我们的语音命令与预定义的设备名称进行比较。如果命令匹配,则使用Serial.print 向 Arduino 串行终端发送一个字符。
fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) { if (strcmp(device_name, device1) == 0) { 如果(状态) 序列号.print("1"); 别的 序列号.print("2"); } }
在void loop()函数中,fauxmo.handle函数将只检查来自 Alexa 的传入数据,并将使用onSetstate()函数执行操作。
无效循环() { fauxmo.handle(); }
现在将最后给出的完整代码上传到ESP-01模块并确保上传成功。
Arduino代码:
之后,是时候在 Arduino 中上传代码了。Arduino 的代码非常简单。它仅通过其 UART 端子接收从 ESP-01 模块发送的字符,并对其进行比较以向 Relay 发送打开/关闭信号。Arduino的完整程序如下所示:
字符数据; 无效设置() { 序列号.开始(115200); pinMode(7,输出); pinMode(6,输出); pinMode(5,输出); 数字写入(7,低); 数字写入(6,低); 数字写入(5,低); } 无效循环() { 如果(串行。可用()> 0) { 数据 = Serial.read(); 串行打印(数据); 序列号.print("\n"); 如果(数据 == '1') 数字写入(7,高); 否则如果(数据 == '2') 数字写入(7,低); 否则如果(数据 == '3') 数字写入(6,高); 否则如果(数据 == '4') 数字写入(6,低); 否则如果(数据 == '5') 数字写入(5,高); 否则如果(数据 == '6') 数字写入(5,低); }
}码到Arduino,接下来根据下面给出的原理图连接硬件。
电路原理图
使用 Alexa 的家庭自动化电路图如下所示:
在这里,我们将所有组件焊接在 Perfboard 上,使其充当Arduino 盾牌。
同样,我们还在 Perfboard 上构建了一个继电器模块:
为家庭自动化设置 Amazon Alexa 应用程序
成功完成硬件设置和编码后,现在是时候设置 Alexa Android 应用程序了。首先,我们需要通过这个应用搜索附近的任何智能设备。为此,请打开您的 Alexa 设备,然后打开您的 Alexa 应用程序并单击选项“设备”,然后单击要求您“添加设备”的“+”号。然后点击“添加设备”,在设备类型中点击“其他”,然后选择发现设备。然后您的 Alexa 应用程序应该搜索可能需要 45 秒的设备。
注意:或者我们也可以使用语音命令“ Alexa,发现设备”发现设备
完成设备发现后,您应该会按我们在代码中给出的名称获得 3 个新设备。就我而言,这些是卧室灯、卧室风扇 和智能插座。现在设置已准备好进行测试,只需通过说“ Alexa,打开卧室灯”进行测试,它应该会返回您的反馈说“好的”,并且灯应该打开。同样,我们可以测试所有其他命令。
这是Amazon Echo dot 控制的家用电器的完整设置的外观:
#include
#include
#include "fauxmoESP.h"
#define ssid "admin"
#define pass "12345678"
#define device1 "卧室灯"
#define device2 "卧室风扇"
#define device3 "智能插座"
fauxmoESP fauxmo;
无效 wifi()
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pass);
而(WiFi.status()!= WL_CONNECTED)
{
延迟(100);
}
}
无效设置()
{
Serial.begin(115200);
无线上网();
fauxmo.createServer(true);
fauxmo.setPort(80);
fauxmo.enable(true);
fauxmo.addDevice(device1);
fauxmo.addDevice(device2);
fauxmo.addDevice(device3);
fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
Serial.printf("[MAIN](%s) state: %s\n",device_name, state ? "ON " : "OFF");
if (strcmp(device_name, device1) == 0)
{
if (state)
Serial.print("1");
else
Serial.print("2");
}
if (strcmp(device_name, device2) == 0)
{
if (state)
Serial.print("3");
else
Serial.print("4");
}
if (strcmp(device_name, device3) == 0)
{
if (state)
Serial.print("5");
否则
Serial.print("6");
}
});
}
无效循环()
{
fauxmo.handle();
}
评论
查看更多