可以给你的 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 库(推荐)
- 在代码里加入 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 请求
// … 在这里放你原有的读取传感器、控制继电器逻辑 …
}
- 上传一次(有线) 把上面这段 OTA 代码合入你当前的程序,用 USB 数据线上传到 ESP8266 上,之后它就能接受网络刷机了。
- 后续无线刷机
- 打开 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();
}
✅ 特点
-
中文网页不会乱码(
charset=utf-8+ HTML meta)。 -
deviceName统一控制 hostname + mDNS。 -
支持局域网 OTA 上传
.bin固件。 -
上传完成自动重启。
-
Web 页面简洁,直接显示上传表单和中文按钮。
你可以直接用 Arduino IDE 烧录到 ESP32-C3,然后浏览器访问:
http://esp32-ota-yys.local
或通过 IP 地址访问 http://<ESP32-IP>/update 上传固件。
评论区(0 条)
发表评论⏳ 加载编辑器…