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