通过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针脚,我们就可以通过手机或电脑的浏览器对继电器进行远程控制了。

硬件连接

继电器连接NodeMCU模块

继电器模块的 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远程控制继电器,串口监视器输出你现在可以看到路由器的分配给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”,可以分别传递打开或关闭继电器的指令。