ESP8266 OTA

ESP8266的OTA升级有两种方式,一种是利用ArduinoOTA库,另一种是通过ESP8266HTTPUpdateServer库。

ArduinoOTA库

使用ArduinoOTA库可以在Arduino IDE内直接进行远程更新。优势的代码简洁,操作方便。

1
2
3
4
5
6
7
8
9
10
#include <ArduinoOTA.h>   //头文件

//setup:
ArduinoOTA.setHostname("ESP8266");
//设置上传名称
ArduinoOTA.setPassword("12345678"); //设置上传密码,这两项可以不写。
ArduinoOTA.begin(); //启动OTA

//loop:
ArduinoOTA.handle(); //持续查看是否有更新请求

在IDE中选择:工具->端口->网络端口

ESP8266HTTPUpdateServer库

该方法较为麻烦,通过服务器和网页进行上传。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <ESP8266WiFi.h> 
//头文件
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>

ESP8266WebServer httpServer(80);
//定义服务器
ESP8266HTTPUpdateServer httpUpdater;

//setup:
//需要先连接WiFi
httpUpdater.setup(&httpServer);
httpServer.begin(); //开启跟新服务

Serial.print("HTTPUpdateServer ready! Open http://");
//打印网页地址
Serial.print(WiFi.localIP());
Serial.println("/update in your browser");

//loop:
httpServer.handleClient(); //持续查看是否有更新请求

ESP8266会通过串口打印OTA更新的地址

访问该网站,随后可以看到下述内容

然后选择对应的文件,Firmware是更新程序,FileSystem是更新文件。

示例

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
#include <ESP8266WiFi.h> 
#include <ArduinoOTA.h> // OTA库
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>

const char *ssid = "ssid";
const char *password = "password";

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

int l=0,t=0;

void setup(void)
{
pinMode(LED_BUILTIN, OUTPUT);

Serial.begin(115200);
Serial.println();
Serial.println("web OAT:blick v1.0"); // 显示版本
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

Serial.print("Connecting...");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}

Serial.println();

httpUpdater.setup(&httpServer); // 网页更新固件
httpServer.begin();

Serial.print("HTTPUpdateServer ready! Open http://");
Serial.print(WiFi.localIP());
Serial.println("/update in your browser");

// ArduinoOTA.setHostname("ESP8266");
// ArduinoOTA.setPassword("12345678");
ArduinoOTA.begin();
}

void loop(void)
{
int now = millis();
if (now - l >2000)
{
l=now;
if (t==0) digitalWrite(LED_BUILTIN,HIGH),t=1;
else digitalWrite(LED_BUILTIN,LOW),t=0;
}
httpServer.handleClient();
ArduinoOTA.handle();

}