通过WEB浏览器远程控制继电器
前言
使用Arduino通过WiFi控制继电器相对复杂,因为Arduino Uno 、Leonardo等开发板是没有 WiFi 接口的,Arduino系列中的暂时只有Arduino Yun配置了WiFi接口,但它的价格相对昂贵,实现起来稍显复杂。非常幸运的是,有一个低成本、易于使用的替代方案—NodeMCU,通过它远程控制一个继电器模块非常便捷。NodeMCU基板上焊接了ESP 8266芯片,芯片本身就是一个完整的WiFi系统,NodeMCU提供了一些GPIO 引脚和模拟输入引脚,最棒的是NodeMCU可用像普通的Arduino控制板一样,通过Arduino IDE对它进行编程。参考:Nodemcu ESP8266如何在Arduino IDE下使用
实际上,NodeMCU控制板有自己的编程语言,那就是 Lua 语言,而不是 C语言,但是在ESP8266社区大神们的努力下,NodeMCU控制板的固件可以被替换,使得NodeMCU控制板的编程方式几乎和其它的Arduino控制板一样。基于这样的特性,我们就可以将NodeMCU的控制程序设计成一个web服务器,当继电器模块连接到NodeMCU相应的GPIO针脚,我们就可以通过手机或电脑的浏览器对继电器进行远程控制了。
硬件连接
继电器模块的 GND引脚–> NodeMCU 控制板的 GND 针脚;
继电器模块的 VCC引脚 –> NodeMCU 控制板的 5V 针脚;
继电器模块的 IN1 引脚 –> NodeMCU 控制板的D0 针脚。
测试代码
测试代码是基于Nodemcu如何控制继电器文章中的基础代码进行的扩展,一些基础知识可以参考这篇文章。其中,继电器模块的引脚标识根据生产厂商不一致与本文有些许差异。
/****************************** *NodeMCU通过WEB网页远程控制继电器 ******************************/ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> const char* ssid = "你的SSID"; const char* password = "你的密码"; const int relayPin = D0; ESP8266WebServer server(80); void setup() { pinMode(relayPin, OUTPUT); Serial.begin(9600); connectToWiFi(); server.on("/", handleRoot); server.begin(); Serial.println("HTTP server started");} void loop() { server.handleClient();} void connectToWiFi() { Serial.print("\n\nConnecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(".");} Serial.println("\nWiFi connected"); //串口监视器中显示的信息 Serial.print("IP address: "); //串口监视器中显示IP地址 Serial.println(WiFi.localIP());} void handleRoot() { Serial.println("Got a Request"); if (server.arg(0)[0] == '1') { digitalWrite(relayPin, HIGH);} else { digitalWrite(relayPin, LOW);} String msg = ""; msg += "<html><body>\n"; //此部分为浏览器上显示的信息,可根据实际修改美化 msg += "<h1>Relay Remote</h1>"; msg += "<h2><a href='?a=1'/>On</a></h2>"; //开启 msg += "<h2><a href='?a=0'/>Off</a></h2>"; //关闭 msg += "</body></html>"; server.send(200, "text/html", msg);}
打开Arduino IDE 将代码复制粘贴进去,根据实际的WiFi网络信息修改SSID(网络名称)和Password(密码)的值以便NodeMCU登录到你的无线网络。编译时确保NodeMCU是否选择了正确的板型和端口号,然后上传代码至NodeMCU。相比Arduino 控制板NodeMCU需要花更长的上传时间。一旦程序上传完成,如何才能知道路由器分配给NodeMCU的IP地址呢?打开IDE的串口监视器,串口监视器的输出应该是这样的:
你现在可以看到路由器的分配给NodeMCU 的 IP地址是192.168.1.28,这时你可以在电脑,手机或者平板的浏览器地址栏中输入这个IP地址,你将看到一个简陋的web页面,如下图所示
你可以通过点击“ON”或“OFF”来打开和关闭继电器。 这里一定需要注意本文所指的远程控制,你的电脑,手机或者平板都必须在NodeMCU所接入的路由器网络内。
代码解释
设置函数:将继电器的 pin 设置为输出,串行通信波特率为9600,然后调用 connectToWiFi。指定函数handleRoot,当有人向服务器发出web请求时,它就会被调用。
循环函数:循环函数调用handleClient,它等待传入请求,然后为它们提供服务。其中,创建WiFi连接的过程以及在串口监视器中显示服务器IP地址等,都包含在connectToWiFi函数中。它反馈了NodeMCU连接到WiFi的进展情况,需要几秒钟的时间。
HandleRoot函数:HandleRoot函数体现了ESP8266WiFi library一个很酷的功能,函数读取第一个请求参数(server.arg(0)0),如果它等于“1”,则继电器被打开;否则,就被关闭。同时函数使用Arduino String 类来构造HTML文本。它生成的HTML包括返回的web请求,它有一个额外的请求参数“a”,它的值是“1”或“0”,可以分别传递打开或关闭继电器的指令。