增加OTA升级
This commit is contained in:
14
.vscode/settings.json
vendored
Normal file
14
.vscode/settings.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
{
|
||||
digitalWrite(输出引脚,状态);
|
||||
}
|
||||
void Switch::设置输出PWM(byte value)
|
||||
{
|
||||
analogWrite(输出引脚,value);
|
||||
}
|
||||
boolean Switch::获取状态()
|
||||
{
|
||||
如果(反馈引脚!=0)
|
||||
|
||||
@@ -17,6 +17,7 @@ class Switch
|
||||
void 关闭(); //关闭继电器
|
||||
void 切换状态(); //切换继电器的状态
|
||||
void 设置状态(boolean state); //设置继电器的状态
|
||||
void 设置输出PWM(byte value); //设置输出PWM
|
||||
boolean 获取状态(); //获取继电器的状态
|
||||
|
||||
|
||||
|
||||
@@ -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更新过程中出现错误!");
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
21
src/main.cpp
21
src/main.cpp
@@ -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);
|
||||
}
|
||||
数据内容 = "";
|
||||
|
||||
Reference in New Issue
Block a user