From 60309a0d893a7645c5a28ed4a130f59846a56d80 Mon Sep 17 00:00:00 2001 From: WolfSpirit Date: Wed, 1 Oct 2025 08:49:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0OTA=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 14 +++++ platformio.ini | 4 +- src/Switch/Switch.cpp | 4 ++ src/Switch/Switch.h | 1 + src/WiFiConfig/Config.cpp | 110 +++++++++++++++++++++++++++++++------- src/WiFiConfig/Config.h | 15 ++++-- src/main.cpp | 21 ++++---- 7 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fd333f8 --- /dev/null +++ b/.vscode/settings.json @@ -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" + } +} \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index d5ab27a..7a84479 100644 --- a/platformio.ini +++ b/platformio.ini @@ -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 diff --git a/src/Switch/Switch.cpp b/src/Switch/Switch.cpp index 6f54343..f8233f4 100644 --- a/src/Switch/Switch.cpp +++ b/src/Switch/Switch.cpp @@ -41,6 +41,10 @@ { digitalWrite(输出引脚,状态); } + void Switch::设置输出PWM(byte value) + { + analogWrite(输出引脚,value); + } boolean Switch::获取状态() { 如果(反馈引脚!=0) diff --git a/src/Switch/Switch.h b/src/Switch/Switch.h index d002cbc..c3d6be8 100644 --- a/src/Switch/Switch.h +++ b/src/Switch/Switch.h @@ -17,6 +17,7 @@ class Switch void 关闭(); //关闭继电器 void 切换状态(); //切换继电器的状态 void 设置状态(boolean state); //设置继电器的状态 + void 设置输出PWM(byte value); //设置输出PWM boolean 获取状态(); //获取继电器的状态 diff --git a/src/WiFiConfig/Config.cpp b/src/WiFiConfig/Config.cpp index a0c03a7..96fda09 100644 --- a/src/WiFiConfig/Config.cpp +++ b/src/WiFiConfig/Config.cpp @@ -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 = ""; + html += ""; + // 添加一些简单的样式让按钮更美观 + html += ""; + html += ""; + html += "

您好! 这是 狼魂 OTA升级。

"; + // 添加跳转按钮,链接到当前IP的/update页面 + html += "点击进行固件升级"; + 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更新过程中出现错误!"); + } } \ No newline at end of file diff --git a/src/WiFiConfig/Config.h b/src/WiFiConfig/Config.h index 0a5f509..e34a819 100644 --- a/src/WiFiConfig/Config.h +++ b/src/WiFiConfig/Config.h @@ -1,20 +1,27 @@ #ifndef _CONFIG_H__ #define _CONFIG_H__ #include -#include - +#include // ESP8266的WiFi库 +#include // WiFi客户端库 +#include // ESP8266的Web服务器库 +#include // 引入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 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index d093030..5cd4775 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,38 +2,35 @@ #include #include -#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); } 数据内容 = "";