作者:admin,发布日期:2020-04-02
阅读:2080;评论:0

写在开头

本文使用Arduino ESP8266官方库ESP8266WebServer来开发web服务器,以实现简单的输出网页和控制继电器。

使用材料

ESP8266 NodeMCU * 1

2路继电器模块(高电平触发) * 1

杜邦线 * 若干

硬件接线

VCC - Vin

GND - GND

IN1 - GPIO15

IN2 - GPIO13

:需要注意的是ESP8266其中的几个GPIO口是无法用来控制继电器的,接上那些口之后ESP8266会无法开机,这是因为这些GPIO口在启动时不能接低电平,继电器模块的IN通过推动三极管的PN结对地连接,虽然有阻抗,但是模块认为已经接了低电平,所以不开机。

所需库

ESP8266WebServer

ESP8266WiFi

在Arduino中安装完ESP8266开发板后,这些库默认可用,所以无需单独安装。

原理

利用ESP8266WiFi库,开机连接家中WIFI,然后在串口中输出WIFI地址。

接着设置Web服务器的路由,设置完成后启动Web服务器。

当用户请求时,请求会被loop中的handleClient捕获,处理后分发给匹配的路由,如果是指定路由,就控制继电器开关。

具体可参考GitHub的README:https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer

效果预览

IMG_20200402_165845.jpg

博主这里增加了一盏LED灯,用于判断WIFI连接状态。

实现代码

// WIFI
#include <ESP8266WiFi.h>
// wifi ssid
#define WIFI_SSID ""
// wifi ssid
#define WIFI_PASS ""

#include <ESP8266WebServer.h>
// create webserver,the port is 80
ESP8266WebServer server(80);

// relay
int pinA = 13;
int pinB = 15;

void setup() {
  // put your setup code here, to run once:
  // start serial
  Serial.begin(115200);
  Serial.println();

  // set pin mode
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);

  // connect wifi
  setup_wifi();

  // set route
  server.on("/", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.on("/on1", []() {
    server.send(200, "text/plain", "on");
    digitalWrite(pinA, HIGH);
  });

  server.on("/off1", []() {
    server.send(200, "text/plain", "off");
    digitalWrite(pinA, LOW);
  });

  server.on("/on2", []() {
    server.send(200, "text/plain", "on");
    digitalWrite(pinB, HIGH);
  });

  server.on("/off2", []() {
    server.send(200, "text/plain", "off");
    digitalWrite(pinB, LOW);
  });

  server.onNotFound(handleNotFound);
  // start web server
  server.begin();
  Serial.println("HTTP server started");
}

void setup_wifi() {
  // connect WIFI
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  WiFi.softAPdisconnect (true);

  Serial.print("Connecting WIFI");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void handleNotFound() {
  // run when no route is found
  String message = "File Not Found\n\n";
  message += "URI: ";
  // get request uri
  message += server.uri();
  message += "\nMethod: ";
  // get request method
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  // get request args
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  // send with 404 code
  server.send(404, "text/plain", message);
}

void loop() {
  // put your main code here, to run repeatedly:
  // Processing request
  server.handleClient();
}

代码验证

将代码编译完烧写入ESP8266后,串口会输出WIFI连接信息,连接WIFI成功后会显示IP,我们用浏览器打开返回的IP,进行控制。

http://172.16.1.20/on1

打开第一路继电器

http://172.16.1.20/on2

打开第二路继电器

http://172.16.1.20/off1

关闭第一路继电器

http://172.16.1.20/off2

关闭第二路继电器

如果网页显示on或者off,且继电器有动作,即代表代码有效。

你可能感兴趣的文章