返回

esp01s如何实现OTA升级?可成功实现的方法

成功OTA升级esp01s

今天开始再次学习esp01s,学习ota升级,了解到了以下知识

  • arduino的"工具"里面的配置项需要和esp01s配置好,不能'超过'esp01s的配置
  • esp01s的flash是1m的空间,用来存放运行代码;在烧录和OTA升级的时候,选择的flash size要设置妥当;fs和OTA的空间要设置好;fs相当于存放运行代码,而OTA相当于OTA的大小(.bin文件)
  • flash是可以更换的,可以取掉原装的,换上4m或者其他的flash(我没做过)
  • arduino开发板建议选择: 工具->开发板->esp8266->Generic ESP8266 Module

以下是OTA升级过程

Arduino - 工具

按照以上配置 flash size看情况,有多种选择,一定要权衡好运行代码和ota文件这两个大小,否则烧录和ota升级都会出问题

下面是OTA升级示例代码:

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
  
#ifndef APSSID
#define APSSID ""  //换成您自己的SSID
#define APPSK  ""//换成您的密码
#endif
  
ESP8266WiFiMulti WiFiMulti; //多组WIFI模式不是本文重点
  
//初始化开始
void setup() {
   Serial.begin(115200);
  // Serial.setDebugOutput(true); 
  Serial.println();
  // 这一步做不做都无所谓
  for (uint8_t t = 4; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    Serial.flush();//清缓存
    delay(1000);
  }
 //设置网络连接模式 WIFI_AP /WIFI_STA /WIFI_AP_STA
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(APSSID, APPSK);//账号密码
}
//初始化OTA升级用到的几个函数
void update_started() {
  Serial.println("CALLBACK:  HTTP update process started");
}
  
void update_finished() {
  Serial.println("CALLBACK:  HTTP update process finished");
}
  
void update_progress(int cur, int total) {
  Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...\n", cur, total);
}
  
void update_error(int err) {
  Serial.printf("CALLBACK:  HTTP update fatal error code %d\n", err);
}
void updateBin() {
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) 
  {
     WiFiClient client;//wifi连接实例
    ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);//指示灯作为升级提示,01S默认IO2
    //我接的有继电器,升级过程会出现 反复断合 嗒嗒嗒....
    // Add optional callback notifiers
    ESPhttpUpdate.onStart(update_started);
    ESPhttpUpdate.onEnd(update_finished);
    ESPhttpUpdate.onProgress(update_progress);
    ESPhttpUpdate.onError(update_error);
  
    //两种联网方式
    t_httpUpdate_return ret = ESPhttpUpdate.update(client, "http://你的域名或IP/路径名称/文件名.bin");//此固件仅供测试,每秒输出一句话带序号
    // Or:你的域名要修改
    //t_httpUpdate_return ret = ESPhttpUpdate.update(client, "www..com", 81, "/路径/文件名.bin");//
   //升级过程中状态变化
    switch (ret) {
      case HTTP_UPDATE_FAILED:
        Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
        break; 
      case HTTP_UPDATE_NO_UPDATES:
        Serial.println("HTTP_UPDATE_NO_UPDATES");
        break; 
      case HTTP_UPDATE_OK:
        Serial.println("HTTP_UPDATE_OK");
        break;
    }
    digitalWrite(LED_BUILTIN, HIGH); //将闪灯关掉 不知道有没有这个必要
  }
}

我的esp01s也是连接了继电器,为了避免升级过程可能会出现继电器反复断合,我在update_started和update_progress回调中禁用了GPIO0的输出

pinMode(Ray_Pin, INPUT); // Ray_Pin = 0

主要升级函数就是以上代码,什么情况需要升级,调用updateBin()函数即可

提示

ESP01s模块在升级固件(刷写新固件)的过程中,整个系统会被重置,并且进入固件升级模式。在这个过程中,所有的用户代码,包括setup()和loop()函数,都不会执行。升级过程中,ESP8266芯片会被置于一个特殊的状态,此时它只会处理与固件升级相关的任务。 固件升级通常通过以下几种方式进行: 通过串行接口(如UART):使用特定的工具(如esptool.py)通过串行接口向ESP8266发送新的固件文件。 通过OTA(Over-The-Air):通过Wi-Fi网络远程升级固件。 在固件升级期间,ESP8266会停止执行用户代码,并且不会响应任何用户代码的调用。一旦固件升级完成,系统会重新启动,此时setup()函数会被调用,而loop()函数会在setup()执行完毕后开始循环执行。 因此,如果你正在升级ESP01s的固件,不必担心loop()函数会在这个过程中执行。升级完成后,系统会重新初始化,并从setup()开始执行新的用户代码。

如果OTA(Over-The-Air)升级失败,ESP8266通常会重新启动。在升级过程中,如果检测到固件下载或验证过程中出现错误,系统会尝试恢复到之前的固件版本并重新启动。 这种机制是为了确保设备在升级失败后能够继续正常运行,而不会因为错误的固件导致系统崩溃或无法启动。具体实现可能会有所不同,但通常会包含以下几个步骤: 固件下载和校验:设备从远程服务器下载新的固件文件,并对其进行校验(例如通过校验和或签名验证)以确保文件完整无误。 固件写入:如果校验通过,设备将新的固件写入闪存中。 验证写入:再次验证写入的固件,以确保写入过程没有错误。 重新启动:如果一切顺利,设备将重启并运行新的固件。如果在任何步骤中检测到错误,设备通常会放弃升级并重新启动。

参考

[1]https://www.52pojie.cn/thread-1174988-1-1.html

评论