# 前言
之前开发一直使用开发版,在实际应用中或者说在产品中是不可能使用开发版的,只能使用相对比较小巧的芯片或者自己设计电路板.
针对 esp8266 来说有个产品就特别合适,那就是 esp01 或者 esp01s , 大概一个的价格不到 10 元,见下图

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

以下视频是我开发的一个小应用,使用手机无线控制继电器开关
# esp01 烧写接线
我买了一个 ch340G USB转TTL 芯片作为烧写器,以下是接线示意图

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

# 代码
| #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为高电平时,继电器断开
# 烧写测试
编译烧写进板子后,断电,然后将 gpio0 由 GND 改插到 3.3V , 即为运行模式,然后再上电,就能在串口中获取到 ip 了.
接下来将 esp8266 esp01 板子插到继电器上即可.
在 IOS 系统的捷径上加入 2 个动作即可用手机来控制继电器了 (视频演示).
