小TIPS.
- 在用platformIO IDE实现OTA之前,要在ArduinoIDE里给ESP32CAM的分区,注意要用带有OTA的分区,如下图。可以直接用示例中的ArduinoOTA-->BasicOTA,在烧录的同时也分区了。很多上传失败就是因为没有注意分区里忘记选择OTA了
- 第一次使用PlatformIO IDE烧录时,要先注释掉这两行代码。成功上传后,后面再取消注释。
cpp
upload_protocol = espota
upload_port = ESP32CAM-OTA
- 在setup()函数里,用如下代码给你的设备起个名字,这样就不用在platformio.ini里每次手动输入IP了。
c
ArduinoOTA.setHostname("ESP32CAM-OTA"); // 设置OTA主机名
如果没有使用setHostname方法,那upload_port的后面跟的就应该是你的ESP32CAM的IP地址了。例如:upload_port = 192.168.1.20
源代码如下:
- 首先,把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++; // 增加尝试次数
}
}
- 把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
- 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