Arduino-Esp8266 OTA升级

 

#include <ESP8266WiFi.h>
#include <ESP8266httpUpdate.h>
#include <Ticker.h>


/******需要修改的地方****************/

#define wifi_name       "GT-2G"     //WIFI名称,区分大小写,不要写错
#define wifi_password   "gt#@10000"   //WIFI密码
 
String upUrl = "http://192.168.0.138:6501/file/test.bin";

/**********************************/

Ticker wdtTicker;

void hardwareWatchdog() {
  ESP.wdtFeed(); // 喂狗
}

/**
 * 主函数
 */
void setup() {
  ESP.wdtEnable(8000); // 8秒看门狗
  wdtTicker.attach_ms(5000, hardwareWatchdog);
  Serial.begin(9600);                     
  Serial.println("");
  Serial.println("MCU RUN");  // 再输出信息
  WiFi.begin(wifi_name, wifi_password);     //连接wifi
  
  // 增加WiFi连接超时处理
  int wifiRetry = 0;
  while (WiFi.status() != WL_CONNECTED && wifiRetry < 15) {
    delay(500);
    Serial.print(".");
    wifiRetry++;
  }
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("\nWiFi连接失败");
    ESP.deepSleep(30e6); // 进入深度睡眠30秒后重试
    return;
  }
  
  // 增加版本号校验
  Serial.print("当前版本:");
  Serial.println(ESP.getSketchMD5());
  
  Serial.println("start update,version:1.3");    
  updateBin();                              //开始升级
}

/**
 * 循环函数
 */
void loop() {

}

/**
 * 固件升级函数 
 */
void updateBin(){
  // 增加升级前校验
  ESPhttpUpdate.rebootOnUpdate(false); // 禁用自动重启
  
  // 增加升级失败重试机制
  for(int i=0; i<3; i++){
    WiFiClient UpdateClient;
    t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient, upUrl);
    
    switch(ret) {
      case HTTP_UPDATE_FAILED:
        Serial.printf("升级失败原因: %s\n", ESPhttpUpdate.getLastErrorString().c_str());
        delay(5000);
        break;
      case HTTP_UPDATE_NO_UPDATES:
        Serial.println("无可用更新");
        return;
      case HTTP_UPDATE_OK:
        Serial.println("升级成功,即将重启");
        delay(1000);
        ESP.restart();
        return;
    }
  }
}

 

posted @ 2025-02-19 15:21  CHHC  阅读(47)  评论(0)    收藏  举报