上周,由 小助手 重新编辑
第一步、编译生成.bin升级固件
本教程需要用到 arduino IDE的esp32开发环境,关于arduino IDE 的ESP32环境配置可参考:环境配置: 点击跳转
如果已安装好esp32 开发环境,继续:
使用arduino IDE软件,打开随便一个需要升级的程序,点击「项目」-「导出已编译的二进制文件」即可生成.bin固件,如下图。
生成的固件在程序所在文件夹中如下图所示:
第二步、上传.bin固件到巴法云
在巴法云控制台 ,点击跳转 ,随便新建个主题,例如 主题 light002,如下图所示:
然后点击OTA,如下图所示:
进去后,点击上传固件,找到刚刚生成的固件上传即可,上传后复制固件链接,如下图:
第三步、远程升级
唯一的要求:等待升级的esp32有网就行。
示例一:
最简单测试版本:
程序流程讲解:开机-->等待联网-->成功联网-->升级。
如下:
#include <WiFi.h> #include <HTTPUpdate.h> /******需要修改的地方****************/ #define wifi_name "newhtc" //WIFI名称,区分大小写,不要写错 #define wifi_password "qq123456" //WIFI密码 //固件链接,在巴法云控制台复制、粘贴到这里即可 String upUrl = "http://bin.bemfa.com/b/3BcN2Q1NGY4NWFmNDI5NzZlZTNjMjY5M2U2OTJhNmJiNTk=esp32bin.bin"; /**********************************/ /** * 主函数 */ void setup() { Serial.begin(115200); //波特率115200 WiFi.begin(wifi_name, wifi_password); //连接wifi while (WiFi.status() != WL_CONNECTED) { //等待连接wifi delay(500); Serial.print("."); } updateBin(); //开始升级 } /** * 循环函数 */ void loop() { } //当升级开始时,打印日志 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); } /** * 固件升级函数 * 在需要升级的地方,加上这个函数即可,例如setup中加的updateBin(); * 原理:通过http请求获取远程固件,实现升级 */ void updateBin(){ Serial.println("start update"); WiFiClient UpdateClient; httpUpdate.onStart(update_started);//当升级开始时 httpUpdate.onEnd(update_finished);//当升级结束时 httpUpdate.onProgress(update_progress);//当升级中 httpUpdate.onError(update_error);//当升级失败时 t_httpUpdate_return ret = httpUpdate.update(UpdateClient, upUrl); switch(ret) { case HTTP_UPDATE_FAILED: //当升级失败 Serial.println("[update] Update failed."); break; case HTTP_UPDATE_NO_UPDATES: //当无升级 Serial.println("[update] Update no Update."); break; case HTTP_UPDATE_OK: //当升级成功 Serial.println("[update] Update ok."); break; } }
示例二:
采用远程指令控制是否升级,可先了解远程控制灯的程序,
例如通过app控制esp32开关灯:点击跳转
app采用发送on、off的指令,当esp32收到on,执行开灯,当esp32收到off,执行关灯。如果开关灯没问题,我们当然也可以发生其他指令,我们可以随便假设个指令,让esp32收到该指令,执行固件升级即可。
例如收到指令update,执行升级函数
if(getMsg == "on"){ //如果收到指令on==打开灯 turnOnLed(); }else if(getMsg == "off"){ //如果收到指令off==关闭灯 turnOffLed(); }else if(getMsg == "update"){ //如果收到指令update updateBin();//执行升级函数 }
示例二完整程序下载:点击下载
由于固件链接地址是不变的,所以就算重新上传了固件,也可以一直持续向上升级。