ESP32教程(基于Arduino IDE)10 - OTA ESP32无线升级,告别数据线

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连接部分进行单独封装,在新项目里引入即可。

欢迎大家关注我的微信公众号:+大钱硬件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值