可以给你的 ESP8266 加入 “空中升级”(OTA,Over‑The‑Air)功能,这样以后用 Wi‑Fi 就能刷新固件,不再需要每次插数据线。下面给你两个常用方案:

ESP32 的远程 OTA(Web 或 Arduino OTA)和 ESP8266 的是否一样

1️⃣ 相同点

  • 都支持通过 Wi-Fi 上传固件,不用 USB。

  • 都可以通过 WebServer 上传文件ArduinoOTA 库实现。

  • 都可以设置 hostname / mDNS 名称,局域网里直接访问名字而不是 IP。

2️⃣ 不同点

功能 ESP8266 ESP32
ArduinoOTA <ArduinoOTA.h> 可直接用,API 基本相同 <ArduinoOTA.h> 可用,但 ESP32 是多核,部分例程需要注意 loop() 中 OTA 调用
Web OTA <ESP8266HTTPUpdateServer.h> 简化 OTA 更新 ESP32 没有这个库,要用 <WebServer.h> + <Update.h> 手动处理上传
Flash 分区 固定 / OTA 分区可选 ESP32 可自定义分区方案,影响 OTA 可用空间
mDNS <ESP8266mDNS.h> <ESPmDNS.h>,语法略有不同,但基本功能一致

一、esp8266、esp10s等

方案一:Arduino IDE + ArduinoOTA 库(推荐)

  1. 在代码里加入 OTA 支持
   #include <ESP8266WiFi.h>
   #include <ArduinoOTA.h>

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

   void setup() {
     Serial.begin(115200);
     WiFi.begin(ssid, password);
     while (WiFi.status() != WL_CONNECTED) {
       delay(500);
       Serial.print(".");
     }
     Serial.println("\nWi-Fi 已连接,IP:" + WiFi.localIP().toString());

     // ArduinoOTA 配置
     ArduinoOTA.setHostname("my_esp8266");       // 在网络上的设备名
     //ArduinoOTA.setPassword("ota_password");      // 上传密码(可选,若想加取消注释即可)

     ArduinoOTA.onStart([]() {
       Serial.println("开始 OTA 刷写");
     });
     ArduinoOTA.onEnd([]() {
       Serial.println("\nOTA 完成,重启中");
     });
     ArduinoOTA.onError([](ota_error_t err) {
       Serial.printf("OTA 错误[%u]\n", err);
     });
     ArduinoOTA.begin();
   }

   void loop() {
     ArduinoOTA.handle();    // 必须循环调用,监听 OTA 请求
     // … 在这里放你原有的读取传感器、控制继电器逻辑 …
   }
  1. 上传一次(有线) 把上面这段 OTA 代码合入你当前的程序,用 USB 数据线上传到 ESP8266 上,之后它就能接受网络刷机了。
  1. 后续无线刷机
  • 打开 Arduino IDE → 工具 → 端口,会出现一个 “网络端口” 名称(如 my_esp8266 at 192.168.1.50)。
  • 选中它,按普通方式点击“上传”,IDE 会通过 Wi‑Fi 把新固件发给设备。

方案二:基于 HTTP 的 Web OTA

如果你想更灵活(任何浏览器/POST 都能上传),可以在 ESP 上跑一个简单的网页上传接口:

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

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

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer updater;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  // 启动 HTTP 更新服务器
  updater.setup(&httpServer, "/update", "admin", "admin_pass");
  httpServer.begin();

  Serial.println("HTTP OTA 准备就绪,IP:" + WiFi.localIP().toString());
}

void loop() {
  httpServer.handleClient();
  // … 你的业务逻辑 …
}
  • 访问 http://<esp-ip>/update,输入用户名密码后上传 .bin 固件文件即可。

小结

  • ArduinoOTA 最简单,直接集成到现有项目,用 Arduino IDE 上传就行。
  • HTTPUpdateServer 更通用,浏览器/脚本都能推送固件。

二者都需要第一次有线烧录一次 OTA 代码;之后就能无线升级,不用再插数据线了。


如果你对安全(加密传输)、固件回滚等有更高要求,也可以再加 MD5 校验、HTTPS 支持、双分区固件等!

 

二、esp32

我的ESP32C3(esp-c3-13)

#include <WiFi.h>
#include <WebServer.h>
#include <Update.h>
#include <ESPmDNS.h>

// ---------------- Wi-Fi 配置 ----------------
const char* ssid = "yang1234";
const char* password = "y123456789";

// ---------------- 设备名 ----------------
const char* deviceName = "esp32-ota-yys"; // Hostname + mDNS

// ---------------- WebServer ----------------
WebServer server(80);

// ---------------- 页面 HTML ----------------
const char htmlPage[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>ESP32 OTA 上传</title>
<style>
body{font-family:sans-serif;text-align:center;background:#f5f5f5;margin:0;padding:0;}
h1{background:#4CAF50;color:white;padding:15px 0;margin:0;}
.card{background:white;max-width:350px;margin:40px auto;padding:20px;border-radius:10px;box-shadow:0 4px 8px rgba(0,0,0,0.1);}
button{font-size:1.2em;padding:12px 24px;border:none;border-radius:8px;cursor:pointer;color:white;background:#4CAF50;}
button:hover{opacity:0.85;}
</style>
</head>
<body>
<h1>ESP32 OTA 上传</h1>
<div class='card'>
<form method='POST' action='/update' enctype='multipart/form-data'>
<input type='file' name='update'>
<br><br>
<input type='submit' value='上传固件'>
</form>
</div>
</body>
</html>
)rawliteral";

// ---------------- 路由处理 ----------------
void handleRoot() {
  server.sendHeader("Connection", "close");
  server.send(200, "text/html; charset=utf-8", htmlPage);
}

void handleUpdateUpload() {
  HTTPUpload& upload = server.upload();
  if (upload.status == UPLOAD_FILE_START) {
    Serial.printf("开始更新: %s\n", upload.filename.c_str());
    if (!Update.begin(UPDATE_SIZE_UNKNOWN)) {
      Update.printError(Serial);
    }
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
      Update.printError(Serial);
    }
  } else if (upload.status == UPLOAD_FILE_END) {
    if (Update.end(true)) {
      Serial.printf("更新成功: %u 字节\n正在重启...\n", upload.totalSize);
    } else {
      Update.printError(Serial);
    }
  }
  yield();
}

// ---------------- Setup ----------------
void setup() {
  Serial.begin(115200);

  // 连接 Wi-Fi
  WiFi.begin(ssid, password);
  WiFi.setHostname(deviceName);
  Serial.print("连接 Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("已连接,IP:");
  Serial.println(WiFi.localIP());

  // 启动 mDNS
  if (MDNS.begin(deviceName)) {
    Serial.printf("mDNS 启动成功,可以访问 http://%s.local\n", deviceName);
  } else {
    Serial.println("mDNS 启动失败");
  }

  // ---------------- Web 路由 ----------------
  server.on("/", HTTP_GET, handleRoot);
  server.on("/update", HTTP_GET, handleRoot);
  server.on("/update", HTTP_POST,
            []() {
              server.sendHeader("Connection", "close");
              server.send(200, "text/plain; charset=utf-8",
                          (Update.hasError()) ? "更新失败" : "更新成功,正在重启...");
              ESP.restart();
            },
            handleUpdateUpload);

  server.begin();
  Serial.println("HTTP OTA 服务器已启动");
}

// ---------------- Loop ----------------
void loop() {
  server.handleClient();
}

 

✅ 特点

  1. 中文网页不会乱码(charset=utf-8 + HTML meta)。

  2. deviceName 统一控制 hostname + mDNS

  3. 支持局域网 OTA 上传 .bin 固件。

  4. 上传完成自动重启。

  5. Web 页面简洁,直接显示上传表单和中文按钮。

你可以直接用 Arduino IDE 烧录到 ESP32-C3,然后浏览器访问:

http://esp32-ota-yys.local

或通过 IP 地址访问 http://<ESP32-IP>/update 上传固件。