# 前言
之前开发一直使用开发版,在实际应用中或者说在产品中是不可能使用开发版的,只能使用相对比较小巧的芯片或者自己设计电路板.
针对 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 个动作即可用手机来控制继电器了 (视频演示).