概述
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
|
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h>
#ifndef APSSID #define APSSID "ESP8266_TEST" #define APPSK "esp8266_test" #endif
const char *ssid = APSSID; const char *password = APPSK;
ESP8266WebServer server(80);
void handleRoot() { 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>"); }
void handleOn() { digitalWrite(LED_BUILTIN, LOW); server.send(200, "text/html", "<h1>Turn on</h1>"); }
void handleOff() { digitalWrite(LED_BUILTIN, HIGH); server.send(200, "text/html", "<h1>Turn off</h1>"); }
void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); delay(1000); Serial.begin(115200); Serial.println(); Serial.print("Esp8266 wifi is starting...");
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP);
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" #define STAPSK "31415926" #endif
const char* ssid = STASSID; const char* password = STAPSK;
ESP8266WebServer server(80);
void handleRoot() { 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>"); }
void handleOn() { digitalWrite(LED_BUILTIN, LOW); server.send(200, "text/html", "<h1>Turn on</h1>"); }
void handleOff() { digitalWrite(LED_BUILTIN, HIGH); server.send(200, "text/html", "<h1>Turn off</h1>"); }
void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); delay(1000); Serial.begin(115200); Serial.println("Esp8266 is starting..."); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP());
server.on("/", handleRoot); server.on("/on",handleOn); server.on("/off",handleOff); server.begin(); 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 上传工作状态与数据,好好利用这些功能,能够做出非常棒的功能。这篇文章介绍了远程控制功能,我们实现了相互通信,利用相同原理,我们可以进行扩展,控制多个灯,或者其它功能。