ESP32教程系列
1 - 认识ESP32
2 - Arduino IDE安装&配置
3 - 基本操作
4 - WiFi配网
5 - WebServer①
6 - Web Server②控制输出
7 - Web Server③ HTML&CSS基础
8 - Web Server④ 在Arduinio中添加HTML&CSS
9 - 异步网页服务器 Asynchronous Web Server(DHT11)
10 - OTA ESP32无线升级,告别数据线
ESP32实战系列
WiFi遥控小车
ESP32 Homekit系列
Homekit & Homespan介绍
点亮一颗LED
调节LED亮度
一、什么是OTA?
1.1 核心概念
- OTA(空中下载技术):通过无线网络远程更新设备固件,无需物理连接
- 应用场景:智能家居、工业物联网、穿戴设备等需要远程维护的场景
1.2 ESP32的OTA优势
- 双核处理器:在更新时保持网络连接稳定
- 大容量Flash:支持同时存储新旧两个固件版本
- Arduino兼容:通过简单代码即可实现OTA功能
二、OTA开发实战
2.1 准备工作
- 硬件:ESP32开发板、USB线
- 软件:Arduino IDE(已安装ESP32支持包)
- 网络:2.4GHz WiFi网络
2.2 首次通过USB上传OTA代码
将下述代码编译并上传到ESP32开发板。
上传成功后,打开串口监视器(波特率设为115200),记录ESP32的IP地址。
断开USB线,仅通过电源供电(确保ESP32处于同一WiFi网络)。
在Arduino IDE中,选择菜单栏的 工具 > 端口,此时会多出一个网络端口(如esp32-ota.local或显示的IP地址)。
选择该网络端口,修改代码后直接点击上传,即可通过WiFi更新程序。
/*
*Arduino IDE 2.3.4
*ESP32 Board 3.1.1
*Partition scheme Minimal SPIFFs(菜单栏的 工具>Partition Scheme)
*芯片:ESP32-C3
*作者:+大钱硬件
*/
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* ssid = "";//输入你的WIFI SSID
const char* password = "";//输入你的WIFI 密码
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("正在连接WiFi...");
}
Serial.println("WiFi已连接");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
// 初始化OTA
ArduinoOTA.setHostname("ESP32-OTA-Test"); // 设置设备名称(可选)
ArduinoOTA.setPassword("123456"); // 设置OTA密码(可选,但建议)
ArduinoOTA
.onStart([]() {
String type = ArduinoOTA.getCommand() == U_FLASH ? "程序" : "文件系统";
Serial.println("开始更新: " + type);
})
.onEnd([]() {
Serial.println("\n更新完成");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("进度: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
Serial.printf("错误[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("身份验证失败");
else if (error == OTA_BEGIN_ERROR) Serial.println("开始失败");
else if (error == OTA_CONNECT_ERROR) Serial.println("连接失败");
else if (error == OTA_RECEIVE_ERROR) Serial.println("接收失败");
else if (error == OTA_END_ERROR) Serial.println("结束失败");
});
ArduinoOTA.begin();
Serial.println("OTA已就绪");
}
void loop() {
ArduinoOTA.handle(); // 保持OTA服务运行
}
2.3 测试OTA功能
在上述代码基础之上,追加LED闪烁功能,确认OTA程序更新功能是否可以正常工作。
将下述代码编译,并在菜单栏的 工具 > 端口选择新出现的网络端口。
如有设置密码,则会弹出对话框要求输入密码。
确保 ESP32 和电脑处于同一局域网。
/*
*Arduino IDE 2.3.4
*ESP32 Board 3.1.1
*Partition scheme Minimal SPIFFs(菜单栏的 工具>Partition Scheme)
*芯片:ESP32-C3
*作者:+大钱硬件
*/
#include <WiFi.h>
#include <ArduinoOTA.h>
// 配置参数
const char* ssid = "";//输入你的WIFI SSID
const char* password = "";//输入你的WIFI 密码
const int ledPin = 8; // 注意:GPIO 8在某些ESP32开发板可能为SPI引脚,建议改用GPIO2、GPIO13等
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
// 连接WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi已连接");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
// 初始化OTA
ArduinoOTA.setHostname("ESP32-OTA-Test");
ArduinoOTA.setPassword("123456"); // 可选密码
ArduinoOTA
.onStart([]() {
Serial.println("OTA更新开始");
digitalWrite(ledPin, LOW); // 更新时关闭LED
})
.onEnd([]() {
Serial.println("\nOTA更新完成");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("进度: %u%%\r", (progress * 100) / total);
})
.onError([](ota_error_t error) {
Serial.printf("错误[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("身份验证失败");
else if (error == OTA_BEGIN_ERROR) Serial.println("开始更新失败");
else if (error == OTA_CONNECT_ERROR) Serial.println("连接失败");
else if (error == OTA_RECEIVE_ERROR) Serial.println("数据接收失败");
else if (error == OTA_END_ERROR) Serial.println("更新结束失败");
});
ArduinoOTA.begin();
Serial.println("OTA已就绪");
}
void loop() {
ArduinoOTA.handle(); // 处理OTA请求
// LED闪烁(1秒周期)
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
三、结束
以上就是简单的一个OTA教程。大家可以把OTA部分和WiFi连接部分进行单独封装,在新项目里引入即可。
欢迎大家关注我的微信公众号:+大钱硬件