风筝
发表于: 2020-4-11 11:01:45 | 显示全部楼层

在本篇文章中我们主要介绍关于如何使用NodeMCU和Android实现Wifi和语音控制家庭自动化。我们之前介绍过类似的项目,即使用NodeMCU和Alexa设计基于语音的家庭自动化。我们使用Alexa来控制家用电器。现在,我们将制作类似的项目,但这次不是使用Alexa,而是在Android智能手机上开发自己的应用程序,以实现在本地控制我们的家用设备。


在本篇文章中,我们将4通道继电器与NodeMCU ESP8266模块连接,并控制4个不同的LED。这4个不同的LED类似于4个不同的家用电器。我们将使用具有5 + 5按钮的Android应用程序将信号发送到NodeMCU,以控制继电器输出。每个NodeMCU都有特定的IP地址。我们会将这个IP地址分配给Android应用进行访问控制。同样,需要NodeMCU连接到本地Wifi。


所需的组件

●    NodeMCU ESP8266 12E Wifi模块

●    4通道继电器模块

●    4个不同颜色的LED

●    5伏电源

●    面包板

●    连接导线


功能框图

以下是使用NodeMCU和Android实现Wifi和语音控制家庭自动化的功能框图。它简单易懂。

Block-Diagram.png


NodeMCU使用GPIO引脚与4通道继电器连接。 NodeMCU的输出引脚通过220欧姆电阻连接到4个不同的LED。 NodeMCU连接到本地Wifi,并能够通过Internet接收信号。


Android设备上安装了“Home Automation Control” Android应用。要控制NodeMCU的输入/输出,请在Android App IP框中输入NodeMCU的IP地址。


完成此设置后,您可以在世界任何地方控制Android App。您的Android手机充当遥控器,NodeMCU充当接收器,信号通过Internet传输。


连接电路图

Circuit-Diagram.jpg


我们将使用4通道继电器模块来控制4个LED,模拟4个家用设备。类似地,将4个输出通过4个电阻连接到4个不同的LED,如上图所示。

Image-for-Home-Automation.jpg


Wifi和语音控制的Android应用程序

The-Android-App-for-Wifi-Voice-Controlling.png


Android应用程序将发送一个字符串,该字符串必须由代码解释才能激活定义如下的每个继电器:

继电器1:

打开:“ r1on”;

关闭:“ r1off”;


继电器2:

开启:“ r2on”;

关闭:“ r2off”


继电器3:

开启:“ r3on”;

关闭:“ r3off”


继电器4:

开启:“ r4on”;

关闭:“ r4off”


如果Android App发送命令“ r1on”,则打开继电器1。我们还定义了“组命令”以同时打开(“ allon”)和关闭(“ alloff”)所有设备。同样,还会提供语音输入图像,单击该图像会弹出弹出窗口,让Google助手接受语音命令。


使用MIT App Inventor创建Android应用程序

此步骤是可选的。我已通过下面的链接直接下载了Android应用。我还添加了.aia链接,可以根据您的需要直接下载和修改该链接。


创建Android应用程序访问http://ai2.appinventor.mit.edu/并创建一个项目。

2-1.png

内部按钮包含用于继电器的继电器开关以及语音输入命令,如下图所示。您可以观看下面的视频以获取更多详细信息。

1-1.png


Android App下载链接

如果您是初学者,并且不想制作任何Android应用,则只需从下面的链接下载该应用即可:下载Android应用程序

您还可以通过导出.aia文件来修改Android应用:下载.aia文件


查找设备IP地址的代码

只需复制此代码并上传到Arduino IDE。代码上传后,单击“串口监视器”并获取IP。根据您的Android应用所需复制此IP。

  1. #include <ESP8266WiFi.h>
  2. WiFiClient client;
  3. WiFiServer server(80);
  4. const char* ssid = "how2electronics";
  5. const char* password = "alhabibi";

  6. void setup()
  7. {
  8. Serial.begin(115200);
  9. connectWiFi();
  10. server.begin();
  11. }

  12. void loop()
  13. {
  14. }

  15. /* connecting WiFi */
  16. void connectWiFi()
  17. {
  18. Serial.println("Connecting to WIFI");
  19. WiFi.begin(ssid, password);
  20. while ((!(WiFi.status() == WL_CONNECTED)))
  21. {
  22. delay(300);
  23. Serial.print("..");
  24. }
  25. Serial.println("");
  26. Serial.println("WiFi connected");
  27. Serial.println("NodeMCU Local IP is : ");
  28. Serial.print((WiFi.localIP()));
  29. }
复制代码

源代码/程序

以下是使用NodeMCU和Android实现Wifi和语音控制家庭自动化的源代码。 编译该代码并将其上传到您的NodeMCU开发板上。

警告:上传代码时,请断开继电器电源引脚。

  1. #include <ESP8266WiFi.h>
  2. WiFiClient client;
  3. WiFiServer server(80);
  4. const char* ssid = "how2electronics";
  5. const char* password = "alhabibi";
  6. String  command =""; // Command received from Android device

  7. // Set Relay Pins
  8. int relay1 = 1;
  9. int relay2 = 3;
  10. int relay3 = 12;
  11. int relay4 = 14;

  12. void setup()
  13. {
  14.   Serial.begin(115200);

  15.   pinMode(relay1, OUTPUT);
  16.   pinMode(relay2, OUTPUT);  
  17.   pinMode(relay3, OUTPUT);  
  18.   pinMode(relay4, OUTPUT);  

  19.   digitalWrite(relay1,HIGH);
  20.   digitalWrite(relay2,HIGH);
  21.   digitalWrite(relay3,HIGH);
  22.   digitalWrite(relay4,HIGH);
  23.       
  24.   connectWiFi();
  25.   server.begin();
  26. }

  27. void loop()
  28. {
  29.     client = server.available();
  30.     if (!client) return;
  31.     command = checkClient ();

  32.          if (command == "r1on"  || command == "turn on relay 1"    || command == "relay 1 on")        digitalWrite(relay1,0);
  33.     else if (command == "r1off" || command == "turn off relay 1" || command == "relay 1 off")     digitalWrite(relay1,1);
  34.     else if (command == "r2on"  || command == "turn on relay 2"    || command == "relay 2 on")      digitalWrite(relay2,0);     
  35.     else if (command == "r2off" || command == "turn off relay 2" || command == "relay 2 off")   digitalWrite(relay2,1);
  36.     else if (command == "r3on"  || command == "turn on relay 3"    || command == "relay 3 on")      digitalWrite(relay3,0);
  37.     else if (command == "r3off" || command == "turn off relay 3" || command == "relay 3 off")   digitalWrite(relay3,1);
  38.     else if (command == "r4on"  || command == "turn on relay 4"    || command == "relay 4 on")    digitalWrite(relay4,0);
  39.     else if (command == "r4off" || command == "turn off relay 4" || command == "relay 4 off") digitalWrite(relay4,1);
  40.     else if (command == "allon" || command == "Turn on all devices" || command == "all on")
  41.     {
  42.       digitalWrite(relay1,LOW);
  43.       digitalWrite(relay2,LOW);
  44.       digitalWrite(relay3,LOW);
  45.       digitalWrite(relay4,LOW);
  46.     }
  47.     else if (command == "alloff" || command == "Turn off all devices" || command == "all off")
  48.     {
  49.       digitalWrite(relay1,HIGH);
  50.       digitalWrite(relay2,HIGH);
  51.       digitalWrite(relay3,HIGH);
  52.       digitalWrite(relay4,HIGH);
  53.     }
  54.     sendBackEcho(command); // send command echo back to android device
  55.     command = "";
  56. }

  57. /* connecting WiFi */
  58. void connectWiFi()
  59. {
  60.   Serial.println("Connecting to WIFI");
  61.   WiFi.begin(ssid, password);
  62.   while ((!(WiFi.status() == WL_CONNECTED)))
  63.   {
  64.     delay(300);
  65.     Serial.print("..");
  66.   }
  67.   Serial.println("");
  68.   Serial.println("WiFi connected");
  69.   Serial.println("NodeMCU Local IP is : ");
  70.   Serial.print((WiFi.localIP()));
  71. }

  72. /* check command received from Android Device */
  73. String checkClient (void)
  74. {
  75.   while(!client.available()) delay(1);
  76.   String request = client.readStringUntil('\r');
  77.   request.remove(0, 5);
  78.   request.remove(request.length()-9,9);
  79.   return request;
  80. }

  81. /* send command echo back to android device */
  82. void sendBackEcho(String echo)
  83. {
  84.   client.println("HTTP/1.1 200 OK ");
  85.   client.println("Content-Type: text/html");
  86.   client.println("");
  87.   client.println("<!DOCTYPE HTML>");
  88.   client.println("<html>");
  89.   client.println(echo);
  90.   client.println("</html>");
  91.   client.stop();
  92.   delay(1);
  93. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-27 07:40 , Processed in 0.058708 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表