如何通过语音命令控制灯光

电子说

1.3w人已加入

描述

步骤1:Google Assistant控制的家庭自动化项目概述

我正在使用Arduino UNO微控制器端和用于连接互联网的ESP8266模块。老实说,还有很多其他方法可以解决这个问题。您可以将功能更强大的处理器(如Raspberry Pi或其他SOC)与内置Wi-Fi(如ESP12E或ESP32)结合使用。但是我决定使用老式的Arduino和ESP8266板来降低成本,并且不要过度设计任何东西。

对于这个项目,我们还将使用ESP8266贴身地构建一个Arduino WiFi防护罩在Arduino UNO板上。此屏蔽可用于通过AT命令或直接使用Arduino IDE对ESP8266进行编程。它还具有将FTDI模块直接连接到ESP8226的选项,这允许将ESP8266编程为无需Arduino的独立设备,并且还可以根据需要将新固件刷新到ESP8266模块中。因此,该防护罩可用于许多其他需要互联网连接的创意Arduino项目。

为了在手机上与Google助手通信,我们使用了IFTTT服务,该服务将助手配置为侦听特定命令并在收到命令时触发链接。现在,您可能已经知道ESP8266仅可以通过API调用从Internet读取信息,因此我们需要一个可以为我们提供此API选项的平台,这就是ThingSpeak所在的位置。基本上,提供给Google Assistant的语音命令会更改此值相应地在ThingSpeak频道中的字段。 ESP8266使用API调用定期检查此字段的值,然后使用串行通信将此值发送给Arduino。 Arduino然后执行所需的操作,例如根据接收到的值切换继电器。

步骤2:使用ESP8266的Arduino Uno Wi-Fi Shield

Arduino

让我们开始将Arduino UNO板与ESP8266 Wi-Fi模块连接。 ESP8266是一个棘手的模块。它需要自己的电源和特定的连接设置才能与Arduino通信。如果您是绝对的初学者,则强烈建议您阅读ESP8266入门教程,然后再继续进行操作。

请记住,ESP8266购买时随附带有可与AT通讯的默认固件。命令。但是,如果模块是直接用Arduino编程的,则默认固件将被删除,如果要使用AT命令,则必须再次刷新。

我们将使用LM317作为3.3V稳压器。该3.3V用于为ESP8266模块供电,因为来自Arduino UNO的3.3V将无法为ESP模块提供足够的电流。 LM317输入引脚可以由Arduino UNO板Vin引脚的DC输入桶式插孔供电。

ESP模块的GPIO0引脚连接到跳线引脚,该跳线可以切换为将该引脚接地。这允许用户将ESP模块设置为在AT命令模式或编程模式(Arduino IDE)下工作。 GPIO0和GPIO2都连接到外部连接器,因此这些GPIO引脚也可以使用。

最后在Arduino方面,我们将ESP8266模块的Rx和Tx引脚连接到Arduino的12和13引脚。我们没有使用硬件串行(引脚0和1)来简化调试。您还可以注意到,还提供了连接16x2 LCD的选项,因此可以将其直接安装在屏蔽层的顶部。 LCD由Arduino的5V引脚供电。

步骤3:使用EasyEDA为ESP8266 Wi-Fi模块制作PCB

为Arduino板设计屏蔽层时,一个具有挑战性的部分就是要正确地占用空间。如果尺寸错误,那么屏蔽将无法正确地安装在Arduino UNO板上。但是,幸运的是,EasyEDA几乎可以为市场上的所有组件提供封装。这是由于其庞大的用户社区,用户可以在其中创建足迹并使其可供公众使用以用于其项目。

EasyEDA是一种在线EDA工具,我以前使用过很多次,发现它非常方便可以使用,因为它具有良好的覆盖范围并且是开源的。设计完PCB之后,我们可以通过低成本的PCB制造服务订购PCB样品。他们还提供元件采购服务,其中有大量的电子元件库存,用户可以与PCB订单一起订购所需的元件。

在设计电路和PCB时,您还可以公开电路和PCB设计,以便其他用户可以复制或编辑它们并从您的工作中受益,我们还制作了整个电路和PCB此电路的公共布局,请查看以下链接:

https://easyeda.com/CircuitDigest/Arduino-WiFi-sh 。..

您可以查看任何层(顶部,“底部”,“底部丝绸”,“底部丝绸”等),方法是从“层”窗口中选择层。除此之外,它们还提供PCB在制造后的外观的3D模型视图。 Wi-Fi防护层的顶层和底层的快照看起来像这样

第4步:使用EasyEDA在线计算和订购PCB样品

完成此设计之后Arduino Uno Wi-Fi模块,您可以通过JLCPCB.com订购PCB。要从JLCPCB订购PCB,您需要Gerber File。要下载PCB的Gerber文件,只需单击EasyEDA编辑器页面上的Generate Fabrication File按钮,然后从那里下载Gerber文件,或者您可以单击JLCPCB上的订购,如上图所示。这会将您重定向到JLCPCB.com,您可以在其中选择要订购的PCB数量,所需的铜层数量,PCB厚度,铜重量以及甚至是PCB颜色,如上面的快照所示。

在JLCPCB按钮上单击订购后,它将带您到JLCPCB网站,在此您可以以非常低的价格订购PCB,即2美元。他们的构建时间也非常短,只需DHL交付3-5天即可交付48小时,基本上您可以在订购一周后得到PCB。

订购PCB后,您可以检查生产进度日期和时间对您的PCB的影响。您可以通过在“帐户”页面上进行检查,然后单击PCB下方的“生产进度”链接,如上图所示。

订购PCB几天后,我得到了包装精美的PCB样品,如下图所示以上图片。

确保轨道和足迹正确无误。我开始组装PCB,我使用了母头来放置Arduino Nano和LCD,以便以后在其他项目中需要时可以将它们卸下。完全焊接的电路板看起来像上面的

步骤5:Arduino Wi-Fi Shield编程模式和AT模式

当使用Arduino IDE直接对ESP8266进行编程或对其进行闪烁时,应在每次上传之前将GPIO 0引脚接地,并且每次都要将Reset引脚暂时接地。同样,当ESP8266使用AT指令时,应将GPIO引脚留空,然后再次将Reset引脚暂时接地以将其复位。

为了简化设计,我们设计了Wi-Fi屏蔽具有一个可在编程模式和AT命令模式之间切换的拨动引脚,如上图所示。同样,在每次上传代码之前,只要每次按下复位按钮(红色),就可以将Reset引脚接地。

开发板上还可以选择将FTDI模块直接连接到ESP,这对于刷新ESP8266模块要进行闪烁,请连接FTDI模块,然后将引脚设置为编程模式,如上所示。然后从给定的链接下载ESP8266_Flasher软件和固件bin文件。然后打开软件并使用Bin按钮浏览到bin文件,然后键入右侧的COM端口并将默认地址保留为0x00000。最后单击下载按钮以刷新ESP8266模块。该软件也显示在上图中,但请记住,只有在ESP8266上的默认固件被覆盖后,您才需要刷新它。

步骤6:为Google助手设置ThingSpeak频道

我们在ThingSpeak中需要一个通道,该通道将存储来自Google助手的数据,并允许ESP8266使用API调用来检索这些数据。如果您不熟悉ThingSpeak,请通过在Thingspeak.com上注册并单击新频道来设置帐户,还请查看我们之前的项目,以了解有关将ThingSpeak与Arduino结合使用的更多信息。您可以为您的频道选择任何名称并提供描述。由于我们仅切换一个光源,因此我仅使用了一个字段并将其命名为Light,但同样可以使用任意多个字段。我的频道设置看起来像这样,记下我的情况下的频道ID(683739)和我的情况下的字段号(1),以后我们将需要它。

下一步单击API密钥标签,此处将为您提供两个API密钥,一个用于写入功能,另一个用于读取功能。您只能分别使用这些键将值读取或写入字段。每个键都是唯一的,上面显示的我的键肯定会有所不同。切勿共享您的密钥,因为它可以授予对您的频道进行写入或读取的权限。上面显示的这些键在使用后已销毁。

现在让我们看一下API GET调用,通过这些调用我们可以向刚创建的字段写入和读取数据。

从中读取事物字段:

api.thingspeak.com/channels/683739/fields/1/last.json?api_key=7EK8DHQDV3M0EJ6S&results=2

写入事物字段:

api。 Thingspeak.com/update?api_key=UEI3D4YTWX9OQQ4B&field1=7

这些是我的API,您必须用键替换键值,并根据ThingSpeak通道更改通道ID。如果您选择了如图中所示的第一个字段,则无需更改字段值。

您还可以尝试在您的浏览器上加载这些API调用,并检查其工作方式。在上面的“写物”字段中,我们将7(最后添加)写入通道。您可以在浏览器中加载它,并检查该值是否反映在您的ThingSpeak帐户中。同样,加载到浏览器中时从Thing Field API调用中读取的内容应为您以前发送给Field的值,在这种情况下为7。

步骤7:设置IFTTT小程序

h2》

现在我们知道如何从该字段发送和读取值,接下来我们必须在IFTTT帐户中设置两个applet。如果您不熟悉IFTTT,只需注册并链接您的Gmail帐户,则该Gmail帐户应采用与您使用Google语音助手相同的一种形式。两个小程序中的两个都将通过上述链接用于将值写入字段。但是,使用上面的API调用,一个会监听“打开阅读灯”并将其写入“ 1”,而另一个小程序会监听“关闭阅读灯”并写入“ 0”。

要创建小程序,请进入我的小程序,然后单击“新小程序”。然后在“此”部分中选择Google语音助手,并在“那”部分中选择Webhooks服务。这与我们对基于物联网的门安全项目所做的工作非常相似。如果您对如何操作感到困惑,请参阅本文,下面的图像也将为您提供帮助。

步骤8:为Google Assistant Home Automation编程Arduino

现在应该同时设置IFTTT和ThingSpeak帐户。因此,根据向Google助手发送的命令,IFTTT将向我们的ThingSpeak帐户发送一个值(0或1)。现在,在Arduino方面,我们必须编写一个程序来检查field的值是0还是1。如果0,则必须关闭灯,如果1,则必须打开灯。

最后,给出了完成此操作的完整程序,我将程序分成有意义的代码片段,并在上面进行了解释。我们首先定义将ESP和LCD连接到Arduino的引脚。您可以参考电路图进行验证。

SoftwareSerial ESP(12,13); //ESP is connected to 12 and 13 pin of Arduino

const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Mention the pin number for LCD connection

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

然后,我们必须输入一些关键参数,例如ESP应该连接到其密码的Wi-Fi名称,最后是我们从中获得的API调用请求我们的话语。确保已根据您的应用程序更改了这些凭据。验证API密钥并将其加载到浏览器中以确保。

String WiFi_SSID = “Oneplus”;

String WiFi_Pass = “nightfury”;

String sendData = “GET /channels/683739/fields/1/last.json?api_key=7EK8DHQDV3M0EJ6S&results=2”;

String output = “”; //Initialize a null string variable

在设置功能中,我们将引脚10声明为输出,这是我们通过继电器连接负载的地方。然后,我们在LCD上显示一小段介绍文字,并使用上述代码行初始化串行监视器。

pinMode(10,OUTPUT);

lcd.begin(16, 2); //Initialise 16*2 LCD

lcd.print(“ Arduino WiFi”); //Intro Message line 1

lcd.setCursor(0, 1);

lcd.print(“ Shield ”); //Intro Message line 2

delay(2000);

Serial.begin (9600);

默认情况下,ESP的波特率为115200,但Arduino并非如此足够快的速度以如此高的速度从ESP读取数据。它确实读取数据,但是我个人很多次发现很多垃圾值。因此,我决定使用AT + CIOBAUD = 9600将ESP更改为以9600波特率工作,如上所示。更改波特率后,我们可以重新初始化软件序列以使用9600波特率。

ESP.begin(115200);

ESP.println(“AT+CIOBAUD=9600”);

delay(100);

ESP.begin(9600);

接下来,我们有一系列AT命令,这些命令只需要发送到模块一次。它们包括关闭Echo选项(ATE0),然后将ESP设置为在站模式下工作(AT + CWMODE = 1),然后使用(AT + CWJAP)等将其连接到路由器。一旦执行,ESP就会记住这些详细信息,并在每次开机时将其作为站点连接到我们的路由器。因此,您可以在第一次使用后注释这些行(不过是可选的)。

ESP_talk(“ATE0”, 1000); //Turn off Echo

ESP_talk(“AT+CWMODE=1”, 1000); //Set ESP as station

ESP_talk(“AT+CWJAP=”“+ WiFi_SSID +”“,”“+ WiFi_Pass +”“”, 5000); //Connect to WiFi

delay(1000);

ESP_talk(“AT+CIPMUX=1”,1000);

delay(1000);

在主循环函数中,我们必须连接到ThingSpeak API。这可以通过首先使用以下命令启动与ThingSpeak网络的TCP连接来完成。

ESP_talk(“AT+CIPSTART=”TCP“,”api.thingspeak.com“,80”,1000);

然后我们必须知道使用AT + CIPSEND将多少个字符发送给该连接。在我的情况下是76。因为我们将发送上述命令,所以我们有74个字符,并且必须在“/n”中添加2个字符,从而得到76。

GET /channels/683739/fields/1/last.json?api_key=7EK8DHQDV3M0EJ6S&results=2

然后我们实际上发送了上面存储在变量sendData中的数据。为了稳定起见,这些命令以100ms的延迟发送,但这不是强制性的。上面显示了相同的程序。

ESP_talk(“AT+CIPSTART=”TCP“,”api.thingspeak.com“,80”,1000);//AT+CIPSTART=“TCP”,“api.thingspeak.com”,80

delay(100);

ESP_talk(“AT+CIPSEND=76”,1000);

delay(100);

ESP_talk(sendData,1000); delay(100);

上面的代码将从ThingSpeak网站上以字符串值的形式获取字段数据,并将其存储在变量“ output”中,看起来像像这样。

+IPD,64:{“created_at”:“2019-01-22T12:13:32Z”,“entry_id”:15,“field1”:“0”}CLOSED

如您所见,在整个字符串值上,我们只需要检查field1值是0还是1。因此我们在Arduino中使用charAT函数来获取特定的char值构成整个字符串。该值的位置比上一个值落后11步。因此,代码看起来像

int light_value = int (output.charAt(output.length()-11))-48;

的最后一步是将该值与0和1进行比较。然后,如果为1,则将灯打开,如果为0,则将其关闭。还会根据字段值使LCD显示结果。

lcd.clear();

lcd.print(“Listning.。..”); //Intro Message line 1

lcd.setCursor(0, 1);

if (light_value == 0) //light should be off

{

lcd.print(“Light is OFF :-(” );

digitalWrite(10,LOW);

}

if (light_value == 1) //light should be off

{

lcd.print(“:-) Light is ON”);

digitalWrite(10,HIGH);

}

您会注意到ESP_talk函数在整个程序中得到了广泛使用。该功能基本上有两个参数,一个是发送到ESP模块的实际命令,另一个是ESP应该在该超时值之内响应发送的命令。 ESP的响应然后存储在变量输出中。在调试ESP模块时,这非常方便。功能定义如下所示。

void ESP_talk(String AT_cmd, const int timeout)

{

Serial.print(“Sent: ”);

Serial.print(AT_cmd);

ESP.println(AT_cmd); //print to ESP through software serial

Serial.println(“”);//Move to next line

long int time = millis();

output=“”; //clear the string

while ( (time + timeout) 》 millis())

{

while (ESP.available())

{

char i = ESP.read(); // read one char

output +=i;//Combine char to string

}

}

Serial.print(“Received: ”);

Serial.print(output);

}

使用Google Assistant切换灯光

因此,我们都准备使用Arduino ESP8266 Wi-Fi模块通过Google Assistant在任何地方控制家用电器。如前所述,以上程序用于切换引脚10。因此,您可以在引脚10上添加一个继电器,并根据需要连接继电器额定值范围内的任何交流负载。上面显示了我使用Relay和带Wi-Fi屏蔽的Arduino板的设置。

我已经使用了一个小阅读灯作为演示负载,但是您可以选择使用任何东西。启动设置并向您的Google助手说出命令,您应该会看到Light得到相应的控制。当您向Google助手发出命令时,您还可以看到ThingSpeak频道值正在更改。为了进行调试,您可以打开串行监视器以检查是否一切正常。如果是,则您的串行监视器应显示类似这样的内容。

您可以观看上面的视频以检查项目的完整工作,还可以检查我们的其他Arduino家庭自动化项目。希望您喜欢该项目并喜欢构建它。如果您有任何问题,请随时将它们留在上面的评论部分中,我会尽力解决。您也可以将论坛用于其他技术问题。
        责任编辑:wv 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分