ESP32-CAM在PlatformIO IDE里实现OTA的几个小TIPS

小TIPS.

  1. 在用platformIO IDE实现OTA之前,要在ArduinoIDE里给ESP32CAM的分区,注意要用带有OTA的分区,如下图。可以直接用示例中的ArduinoOTA-->BasicOTA,在烧录的同时也分区了。很多上传失败就是因为没有注意分区里忘记选择OTA了
  2. 第一次使用PlatformIO IDE烧录时,要先注释掉这两行代码。成功上传后,后面再取消注释。
cpp 复制代码
upload_protocol = espota
upload_port = ESP32CAM-OTA
  1. 在setup()函数里,用如下代码给你的设备起个名字,这样就不用在platformio.ini里每次手动输入IP了。
c 复制代码
ArduinoOTA.setHostname("ESP32CAM-OTA"); // 设置OTA主机名

如果没有使用setHostname方法,那upload_port的后面跟的就应该是你的ESP32CAM的IP地址了。例如:upload_port = 192.168.1.20

源代码如下:

  1. 首先,把main.cpp的源码提供如下:
cpp 复制代码
#include <Arduino.h>
#include <WiFi.h>
#include <ArduinoOTA.h> // 添加ArduinoOTA库
#include <WiFiUdp.h>
#include <ESPmDNS.h>
#include "config.h"

void reconnectWiFi();

void setup()
{
  Serial.begin(115200);

  // 连接 WiFi
  WiFi.begin(ssid, password);
  int connectAttempts = 0;    // 初始化连接尝试次数
  const int maxAttempts = 10; // 最大尝试次数

  // 循环直到连接成功或达到最大尝试次数
  while (WiFi.status() != WL_CONNECTED && connectAttempts < maxAttempts)
  {
    delay(1000);
    Serial.println("Connecting to WiFi...");
    connectAttempts++; // 增加尝试次数
  } 
  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("Connected to WiFi");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());

    // 初始化 mDNS
    if (MDNS.begin("esp32cam"))
    {
      Serial.println("mDNS responder started");
    }
    else
    {
      Serial.println("Error setting up mDNS responder!");
    }

    // 初始化 ArduinoOTA
    ArduinoOTA.setHostname("ESP32CAM-OTA"); // 设置OTA主机名
    ArduinoOTA.begin();
    Serial.println("Ready for OTA updates");
  }
  else
  {
    Serial.println("Failed to connect to WiFi");
  }
}

void loop()
{
  // 检查WiFi连接状态
  if (WiFi.status() != WL_CONNECTED)
  {
    reconnectWiFi();
  }

  // 处理OTA更新请求
  ArduinoOTA.handle();
}

void reconnectWiFi()
{
  Serial.println("WiFi disconnected, attempting to reconnect...");
  WiFi.begin(ssid, password);
  int connectAttempts = 0;    // 初始化连接尝试次数
  const int maxAttempts = 10; // 最大尝试次数

  // 循环直到连接成功或达到最大尝试次数
  while (WiFi.status() != WL_CONNECTED && connectAttempts < maxAttempts)
  {
    delay(1000);
    Serial.println("Connecting to WiFi...");
    connectAttempts++; // 增加尝试次数
  }
}
  1. 把wifi的用户名密码放到单独的config.cpp里。当然,你也可以直接把用户名密码放到main.cpp里。
c 复制代码
#include "config.h"

//wifi
const char *ssid = "yourwifi";
const char *password = "password";

头文件:

c 复制代码
#include <arduino.h>
//config.h
#ifndef CONFIG_H
#define CONFIG_H

// Wi-Fi credentials
extern const char *ssid;
extern const char *password;

#endif
  1. platformio.ini文件内容:
c 复制代码
[env:esp32cam]
platform = espressif32
board = esp32cam
framework = arduino
monitor_speed = 115200
upload_protocol = espota
upload_port = ESP32CAM-OTA

[platformio]
description = ESP32 Camera Web Server
相关推荐
炸膛坦客5 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
GeekArch12 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my13 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯14 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
小李不困还能学15 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
萌动的小火苗16 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
振浩微433射频芯片16 小时前
工业遥控器总在关键时刻“掉链子”?——433MHz芯片方案如何破局
网络·单片机·嵌入式硬件·物联网·工业遥控
blevoice17 小时前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
三易串口屏18 小时前
三易串口屏开发教程:如何使用键盘控件输入参数并发送给单片机
单片机·嵌入式硬件·串口屏·三易串口屏·键盘控件
2CM_Embed19 小时前
F28379D 下载后 VOFA+ 无数据、Reset 后恢复:一次 TZ 中断误触发排查记录
笔记·单片机·sci·c2000·f28379d·vofa·tz