esp8266 远程点灯

概述

ESP8266 自带 wifi 功能,很容易实现远程控制,这篇文章介绍了使用 esp8266 实现远程控制 LED 灯开关。

远程控制原理

方式一:

使用 ESP8266 以 AP (Access Point)模式开启 wifi 服务,客户端连接 wifi 访问指定的地址,以此发送控制命令。

方式二:

ESP8266 以 STA (Station)模式连接网络,然后开启 http 服务,用户访问服务地址发送命令。

方式三:

ESP8266 以 STA (Station)模式连接网络,使用某种通信协议(如UDP、TCP、MQTT等)与远端服务器保持连接,客户调用远端服务器提供的方法给 ESP8266 发送控制命令。

代码实现

AP 模式 + http 服务

使用 ESP8266 开启 wifi ,并启动一个 http 服务,用户连接wifi后,访问指定页面即可完成开关灯的操作。

这种方式需要连接 esp8266 提供的 wifi 进行控制,这样会影响设备上网功能。

以下示例在上传到 esp8266 后,esp8266 将启动名为 ESP8266_TEST 的 wifi ,可使用手机或电脑连接,连接密码为 esp8266_test 。(wifi 名称和密码可以按需要修改)。连接wifi 后,访问 http://192.168.4.1 ,页面显示 You are connected 表示服务运行正常,然后可以点页面上的超链接,或者访问如下地址控制开关灯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
* 连接wifi 后访问 http://192.168.4.1
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef APSSID
#define APSSID "ESP8266_TEST"
#define APPSK "esp8266_test"
#endif

// wifi 名称 和 密码
const char *ssid = APSSID;
const char *password = APPSK;
// 在 80 端口启动 http 服务
ESP8266WebServer server(80);

/**
* 访问根路径的处理
*/
void handleRoot() {
// 返回状态码 200 表示请求成功,返回的数据 MIME 类型为 text/html,返回内容为 You are connected
server.send(200, "text/html", "<h1>You are connected</h1><h2><a href='/on'>Turn on</a></h2><h2><a href='/off'>Turn off</a></h2>");
}

/**
* 开灯请求的处理
* 即访问 http://192.168.4.1/on
*/
void handleOn() {
digitalWrite(LED_BUILTIN, LOW); // 将板载 LED 点亮
server.send(200, "text/html", "<h1>Turn on</h1>");
}

/**
* 关灯请求的处理
* 即访问 http://192.168.4.1/off
*/
void handleOff() {
digitalWrite(LED_BUILTIN, HIGH); // 将板载 LED 熄灭
server.send(200, "text/html", "<h1>Turn off</h1>");
}

void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 将板载 LED 的引脚设置为输出模式
digitalWrite(LED_BUILTIN, HIGH); // 将引脚模式设置为 HIGH,关闭板载 LED
delay(1000); // 休息一会
Serial.begin(115200); // 初始化串口输出,方便打印日志
Serial.println();
Serial.print("Esp8266 wifi is starting..."); // 串口打印提示信息

WiFi.softAP(ssid, password); // 开启wifi,如果不想设置密码,可以移除

IPAddress myIP = WiFi.softAPIP(); // 获取wifi 的 ip 地址
// 打印 wifi ip 地址信息
Serial.print("AP IP address: ");
Serial.println(myIP);

// 给 http 服务添加处理方法
server.on("/", handleRoot);
server.on("/on",handleOn);
server.on("/off",handleOff);
// 开启服务
server.begin();

Serial.println("HTTP server started"); // 提示信息
}

void loop() {
server.handleClient();
}

STA 模式 + HTTP 服务

将 esp8266 作为一个站点,连接已有的 wifi 并开启 http 服务,然后用手机或电脑连接同一个 wifi,访问 http 服务即可。这里的 服务地址是由连接的 wifi 路由器分配的,所以我们需要通过串口查看给 esp8266 分配的 ip 地址,用这个地址来访问。

这种方式需要控制设备和 esp8266 连接相同 wifi 即可进行控制,不影响设备正常上网功能,但由于地址是由路由器分配的,可能会改变,需要通过串口确认访问地址。

扩展:这个示例中连接wifi后启动的是 http 服务,开启别的类型的服务也可以实现控制,如开启一个 tcp 服务,那就可以通过tcp连接到 esp8266 进行控制;如开启一个 udp 服务,那通过 udp 协议给 esp8266 发送命令也可以控制。

代码与上面的类似,需要注意的是 wifi 的模式为 STA,wifi名和密码是已有 wifi 的。然后需要通过串口查看路由器给 esp8266 分配的 ip 地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef STASSID
#define STASSID "CMCC-b4Q9" // wifi 名称
#define STAPSK "31415926" // wifi 密码
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);

/**
* 访问根路径的处理
*/
void handleRoot() {
// 返回状态码 200 表示请求成功,返回的数据 MIME 类型为 text/html,返回内容为 You are connected
server.send(200, "text/html", "<h1>You are connected</h1><h2><a href='/on'>Turn on</a></h2><h2><a href='/off'>Turn off</a></h2>");
}

/**
* 开灯请求的处理
* 即访问 http://192.168.4.1/on
*/
void handleOn() {
digitalWrite(LED_BUILTIN, LOW); // 将板载 LED 点亮
server.send(200, "text/html", "<h1>Turn on</h1>");
}

/**
* 关灯请求的处理
* 即访问 http://192.168.4.1/off
*/
void handleOff() {
digitalWrite(LED_BUILTIN, HIGH); // 将板载 LED 熄灭
server.send(200, "text/html", "<h1>Turn off</h1>");
}

void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 将板载 LED 的引脚设置为输出模式
digitalWrite(LED_BUILTIN, HIGH); // 将引脚模式设置为 HIGH,关闭板载 LED
delay(1000); // 休息一会
Serial.begin(115200); // 初始化串口输出,方便打印日志
Serial.println("Esp8266 is starting..."); // 串口打印提示信息
WiFi.mode(WIFI_STA); // wifi 模式设置为 STA
WiFi.begin(ssid, password); // 开启wifi

// 等待连接
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("."); // 没连上打印一个点
}

// 打印连接成功和ip地址信息
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

// 给 http 服务添加处理方法
server.on("/", handleRoot);
server.on("/on",handleOn);
server.on("/off",handleOff);

server.begin(); // 开启服务http

Serial.println("HTTP server started"); // 服务启动成功提示信息
}

void loop() {
server.handleClient();
}

查看波特率为 115200 的串口输出:

1
2
3
4
5
Esp8266 is starting...
...........................
Connected to CMCC-b4Q9
IP address: 192.168.1.20
HTTP server started

通过查看串口输出日志,得知esp8266 的 ip 地址为 192.168.1.20,通过手机或电脑连接 wifi 后,访问 http://192.168.1.20 ,点击页面上的超链接控制开关灯,或访问如下地址控制:

STA 模式 + 远端服务器

将 esp8266 作为站点连接 wifi 联网并启动一个接收服务端控制信息的服务,然后向远端服务器发送注册请求,注册成功后,远端服务器即拥有 esp8266 连接信息,通过远端服务器可以向 esp8266 发送控制命令。

这种方式相对复杂一点,需要单独开发一个远端服务器,能让 esp8266 注册并持有连接信息,esp8266 还需要定时往服务端发送心跳信息,以保证连接信息有效。同时 esp8266 需要启动一个服务来接收和处理远端服务器下发的控制命令。

总结

ESP8266 的 wifi 功能能够让我们实现远程控制,也可以通过wifi 上传工作状态与数据,好好利用这些功能,能够做出非常棒的功能。这篇文章介绍了远程控制功能,我们实现了相互通信,利用相同原理,我们可以进行扩展,控制多个灯,或者其它功能。