增加OTA升级

This commit is contained in:
2025-10-01 08:49:56 +08:00
parent 6db2cfb93e
commit 60309a0d89
7 changed files with 134 additions and 35 deletions

14
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,14 @@
{
"files.associations": {
"array": "cpp",
"deque": "cpp",
"list": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"string_view": "cpp",
"initializer_list": "cpp",
"ranges": "cpp",
"regex": "cpp"
}
}

View File

@@ -14,4 +14,6 @@ board = nodemcuv2
framework = arduino
upload_speed = 921600
monitor_speed = 115200
lib_deps = knolleary/PubSubClient@^2.8
lib_deps =
knolleary/PubSubClient@^2.8
ayushsharma82/ElegantOTA@^3.1.7

View File

@@ -41,6 +41,10 @@
{
digitalWrite(,);
}
void Switch::PWM(byte value)
{
analogWrite(,value);
}
boolean Switch::()
{
(!=0)

View File

@@ -17,6 +17,7 @@ class Switch
void (); //关闭继电器
void (); //切换继电器的状态
void (boolean state); //设置继电器的状态
void PWM(byte value); //设置输出PWM
boolean (); //获取继电器的状态

View File

@@ -5,6 +5,9 @@ Switch 状态指示灯_类(D4,0,LOW);
IPAddress staticIP(192, 168, 1, 22);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
ESP8266WebServer server(80); // 创建一个Web服务器对象监听端口为80
static unsigned long ota_progress_millis = 0;
WiFiConfig::WiFiConfig(int ):()
{
@@ -31,12 +34,13 @@ void WiFiConfig::智能配网()
_类.();
if (WiFi.smartConfigDone())
{
("\n配网完成!WiFi名称:[%s] WiFi密码:[%s]\n",WiFi.SSID().c_str(),WiFi.psk());
WiFi.setAutoConnect(true); // 设置自动连接
break;
("\n配网完成!WiFi名称:[%s] WiFi密码:[%s]\n",WiFi.SSID().c_str(),WiFi.psk().c_str());
WiFi.setAutoConnect(true); // 设置自动连接
break;
}
}
("\nWiFi连接成功,IP地址:[%s],Mac地址:[%s]\n",WiFi.localIP().toString().c_str(),WiFi.macAddress().c_str());
_类.();
}
boolean WiFiConfig::()
@@ -45,27 +49,97 @@ boolean WiFiConfig::自动联网()
//如果觉得时间太长可改
for (int i = 0; i < ; i++)
{
int = WiFi.status();
_类.();
if ( == WL_CONNECTED)
for (size_t j = 0; i < 255; j++)
{
//WiFi.config(staticIP,gateway,subnet);
_类.PWM(j++);
if (WiFi.status() == WL_CONNECTED)
{
//WiFi.config(staticIP,gateway,subnet);
("\nWiFi连接成功,WiFi名称:[%s] WiFi密码:[%s],IP地址:[%s],网关:[%s],Mac地址:[%s]\n",
WiFi.SSID().c_str(),
WiFi.psk(),
WiFi.localIP().toString().c_str(),
WiFi.gatewayIP().toString().c_str(),
WiFi.macAddress().c_str());
return true;
("\nWiFi连接成功,WiFi名称:[%s] WiFi密码:[%s],IP地址:[%s],网关:[%s],Mac地址:[%s]\n",
WiFi.SSID().c_str(),
WiFi.psk().c_str(),
WiFi.localIP().toString().c_str(),
WiFi.gatewayIP().toString().c_str(),
WiFi.macAddress().c_str());
return true;
}
}
else
for (size_t j = 255; i > 0; j--)
{
("\nWiFi自动配置,超时等待:[%d/%d]秒",i,);
delay(1000);
_类.PWM(j++);
if (WiFi.status() == WL_CONNECTED)
{
//WiFi.config(staticIP,gateway,subnet);
("\nWiFi连接成功,WiFi名称:[%s] WiFi密码:[%s],IP地址:[%s],网关:[%s],Mac地址:[%s]\n",
WiFi.SSID().c_str(),
WiFi.psk().c_str(),
WiFi.localIP().toString().c_str(),
WiFi.gatewayIP().toString().c_str(),
WiFi.macAddress().c_str());
return true;
}
}
("\nWiFi自动配置,超时等待:[%d/%d]",i,);
}
("WiFi自动配置失败!" );
return false;
}
void WiFiConfig::(){
// 定义根路径("/")的处理函数
server.on("/", []() {
// 使用text/html类型并在头部指定charset=utf-8
String html = "<!DOCTYPE html><html><head>";
html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">";
// 添加一些简单的样式让按钮更美观
html += "<style>";
html += "body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }";
html += ".update-btn { padding: 12px 24px; font-size: 18px; background-color: #4CAF50; color: white;";
html += " border: none; border-radius: 4px; cursor: pointer; text-decoration: none; }";
html += ".update-btn:hover { background-color: #45a049; }";
html += "</style>";
html += "</head><body>";
html += "<h1>您好! 这是 狼魂 OTA升级。</h1>";
// 添加跳转按钮链接到当前IP的/update页面
html += "<a href=\"/update\" class=\"update-btn\">点击进行固件升级</a>";
html += "</body></html>";
server.send(200, "text/html", html);
});
ElegantOTA.setAutoReboot(true);
ElegantOTA.begin(&server); // 初始化ElegantOTA传入WebServer实例
// 设置OTA回调函数
ElegantOTA.onStart(&WiFiConfig::onOTAStart);
ElegantOTA.onProgress(&WiFiConfig::onOTAProgress);
ElegantOTA.onEnd(&WiFiConfig::onOTAEnd); // 注册OTA结束时的回调
server.begin(); // 启动Web服务器
Serial.println("HTTP服务器已启动");
}
void WiFiConfig::(){
server.handleClient(); // 处理客户端请求
ElegantOTA.loop(); // 处理OTA相关任务
}
void WiFiConfig::onOTAStart() {
Serial.println("OTA更新开始!");
}
void WiFiConfig::onOTAProgress(size_t current, size_t final) {
if (millis() - ota_progress_millis > 1000) {
ota_progress_millis = millis();
Serial.printf("OTA进度 当前: %u 字节, 总大小: %u 字节\n", current, final);
}
}
void WiFiConfig::onOTAEnd(bool success) {
if (success) {
Serial.println("OTA更新成功完成!");
} else {
Serial.println("OTA更新过程中出现错误!");
}
}

View File

@@ -1,20 +1,27 @@
#ifndef _CONFIG_H__
#define _CONFIG_H__
#include <Global/Macro.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFi.h> // ESP8266的WiFi库
#include <WiFiClient.h> // WiFi客户端库
#include <ESP8266WebServer.h> // ESP8266的Web服务器库
#include <ElegantOTA.h> // 引入ElegantOTA库用于实现OTA更新功能
class WiFiConfig
{
private:
int = 20;
// 用于跟踪OTA进度的时间变量
public:
WiFiConfig(int = 20); //构造函数
~WiFiConfig(); //析构函数
void (); //智能配网
boolean ();
void ();
void ();
static void onOTAStart();
static void onOTAProgress(size_t current, size_t final);
static void onOTAEnd(bool success);
};
#endif

View File

@@ -2,38 +2,35 @@
#include <WiFiConfig/Config.h>
#include <Mqtt/MQTT.h>
#define 配置引脚 D8 //GPIO15
MQTT MQ;
Switch (D6,0,HIGH);
Switch (D2,0,HIGH);
Switch (D4,0,HIGH);
Switch 1(D7,0,HIGH);
Switch 2(D5,0,HIGH);
WiFiConfig 线(20);
boolean = false;
void setup() {
(115200);
(,);
.();
.();
.();
(!线.())
线.();
线.();
ESP.wdtDisable();
ESP.wdtEnable(10000);
ESP.wdtFeed();
MQ.();
//MQ.发布("on");
}
void loop() {
线.();
uint32_t = ();
(%500 == 0)
{
.();
( == ());
ESP.wdtFeed();
}
(MQ.()){
@@ -41,10 +38,10 @@ void loop() {
()
{
( == "on"){
//指示灯.设置状态(1);
.(1);
.(1);
}( == "off"){
//指示灯.设置状态(0);
.(0);
.(0);
}
= "";