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

ArduinoOTA库

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

#include <ArduinoOTA.h>   //头文件

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

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

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

ESP8266HTTPUpdateServer库

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

#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是更新文件。

示例

#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();
    
}

循之际,如星夜般的幻想。