# 前言

之前开发一直使用开发版,在实际应用中或者说在产品中是不可能使用开发版的,只能使用相对比较小巧的芯片或者自己设计电路板.

针对 esp8266 来说有个产品就特别合适,那就是 esp01 或者 esp01s , 大概一个的价格不到 10 元,见下图

芯片

可以在淘宝上买到和它搭配的继电器模组,1 个 12 元左右, 继电器淘宝链接

继电器模组

以下视频是我开发的一个小应用,使用手机无线控制继电器开关

# esp01 烧写接线

我买了一个 ch340G USB转TTL 芯片作为烧写器,以下是接线示意图

接线图

按照接线示意图接的线,剩下就是开发代码了

接线图

# 代码

p
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// 定义 wifi 名称和密码
const char* ssid = "CU_JW3K";
const char* password = "kjkhf7tz";
// 设置 led 灯的 gpio
const int led = 1;
const int swit = 0;// 开关默认监听 gpio0
const int switState = 0;// 存储开关状态 0 为开,1 为关
// 创建一个 WebServer 监听 80 端口
ESP8266WebServer server(80);
void handleRoot(){
  const String Html = "<!DOCTYPE html>\
    <html>\
      <head>\
        <meta charset=\"utf-8\">\
        <title>Hello ESP8266!</title>\
      </head>\
      <body>\
        <h1>看到的这个网页为ESP8266提供<h1>\
      </body>\
    </html>";
  digitalWrite(led,1);
  server.send(200,"text/html",Html);
  digitalWrite(led,0);
}
// 打开开关
void setOn(){
  const String Html = "<!DOCTYPE html>\
    <html>\
      <head>\
        <meta charset=\"utf-8\">\
        <title>Hello ESP8266!</title>\
      </head>\
      <body>\
        开关已打开\
      </body>\
    </html>";
  digitalWrite(led,0);
  digitalWrite(swit,0);
  switState = 0;
  server.send(200,"text/html",Html);
}
// 获取开关当前状态
void getState(){
  String res = "0";
  if(switState == 0){
    res = "0";
  }else{
    res = "1";
  }
  server.send(200,"text/plain",res);
}
// 关闭开关
void setOff(){
  const String Html = "<!DOCTYPE html>\
    <html>\
      <head>\
        <meta charset=\"utf-8\">\
        <title>Hello ESP8266!</title>\
      </head>\
      <body>\
        开关已关闭\
      </body>\
    </html>";
  digitalWrite(led,1);
  digitalWrite(swit,1);
  switState = 1;
  server.send(200,"text/html",Html);
}
void handleNotFound(){
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}
void setup() {
  Serial.begin(115200);
  // 设置 led 为输出模式
  pinMode(led,OUTPUT);
  pinMode(swit,OUTPUT);
  // 设置开关为打开状态,即刚上电则默认打开开关
  digitalWrite(led,0);
  digitalWrite(swit,0);
  // 设置 Wifi 连接模式为 STA
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid,password);
  while(WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(2000);
  }
  server.on("/",handleRoot);
  server.on("/on",setOn);
  server.on("/off",setOff);
  server.on("/state",getState);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("connect success!");
  Serial.println(WiFi.localIP());
  digitalWrite(led,1);
}
void loop() {
  server.handleClient();
}

先使用最简单的 Http 接口做开关的控制.

这款 esp8266 继电器开关的原理是:

供电需要 5V 直流 供电,一般电源都支持

  • gpio0 为低电平时,继电器吸合
  • gpio0 为高电平时,继电器断开

# 烧写测试

编译烧写进板子后,断电,然后将 gpio0GND 改插到 3.3V , 即为运行模式,然后再上电,就能在串口中获取到 ip 了.

接下来将 esp8266 esp01 板子插到继电器上即可.

在 IOS 系统的捷径上加入 2 个动作即可用手机来控制继电器了 (视频演示).