ESP8266 最简单的OTA升级模式

news2024/12/31 5:22:58

最近在做一个项目时有OTA的需求,之前是通过arduino自带的ota模式,虽说也可以用,但操作比较麻烦,昨晚在网上搜索相关教程,发现了使用巴法云来实现ota的功能,现分享如下

1、首先要让你的设备联网

2、注册巴法云,并添加设备

3、将固件发送到巴法云,会得到一个链接,

4、将此链接放入你的源码中,更新上传到巴法云的固件

5、在需要升级的时候,调用updateBin();

共用部分如下,可做简单移植使用,

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

// 固件链接,在巴法云控制台复制、粘贴到这里即可
String upUrl = "http://bin.bemfa.com/b/3BcNGM5NTZiMDcxM2QwNDdjY2IyYTQ0YWIyNzQzOTgxZWU=test.bin";

// 当升级开始时,打印日志
void update_started()
{
    Serial.println("CALLBACK:  HTTP update process started");
}

// 当升级结束时,打印日志
void update_finished()
{
    Serial.println("CALLBACK:  HTTP update process finished");
    u8g2.clearBuffer();
    u8g2.drawStr(u8g2.getWidth() / 2, u8g2.getHeight() / 2, "Restart");
    u8g2.sendBuffer();
}

// 当升级中,打印日志
void update_progress(int cur, int total)
{
    Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...%d%% \n", cur, total, cur / (total / 100));
    ota_OLED_onProgress(4, 32, 120, 8, cur / (total / 100) );
}

// 当升级失败时,打印日志
void update_error(int err)
{
    Serial.printf("CALLBACK:  HTTP update fatal error code %d\n", err);
}

/**
 * 固件升级函数
 * 在需要升级的地方,加上这个函数即可,例如setup中加的updateBin();
 * 原理:通过http请求获取远程固件,实现升级
 */
void updateBin()
{
    WiFiClient UpdateClient;
    ESPhttpUpdate.onStart(update_started);     // 当升级开始时
    ESPhttpUpdate.onEnd(update_finished);      // 当升级结束时
    ESPhttpUpdate.onProgress(update_progress); // 当升级中
    ESPhttpUpdate.onError(update_error);       // 当升级失败时

    t_httpUpdate_return ret = ESPhttpUpdate.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;
    }
}

代码中有添加两行屏幕显示的部分,如有使用屏幕也可直接拿来使用:

void ota_OLED_onProgress(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress)
{
    u8g2.clearBuffer();
    uint16_t radius = height / 2;
    uint16_t xRadius = x + radius;
    uint16_t yRadius = y + radius;
    uint16_t doubleRadius = 2 * radius;
    uint16_t innerRadius = radius - 2;
    drawCircleQuads(xRadius, yRadius, radius, 0b00000110);
    u8g2.drawHLine(xRadius, y, width - doubleRadius + 1);
    u8g2.drawHLine(xRadius, y + height, width - doubleRadius + 1);
    drawCircleQuads(x + width - radius, yRadius, radius, 0b00001001);
    uint16_t maxProgressWidth = (width - doubleRadius + 1) * progress / 100;
    fillCircle(xRadius, yRadius, innerRadius);
    fillRect(xRadius + 1, y + 2, maxProgressWidth, height - 3);
    fillCircle(xRadius + maxProgressWidth, yRadius, innerRadius);

    u8g2.setCursor(10, 20);
    u8g2.drawStr(10, u8g2.getHeight() / 2 - 10, "OTA update..."); // 返回错误值
    u8g2.setCursor(55, u8g2.getHeight() / 2 + 30);
    u8g2.print(progress);
    u8g2.print("%");
    u8g2.sendBuffer();
}
void fillRect(int16_t xMove, int16_t yMove, int16_t width, int16_t height)
{
    for (int16_t x = xMove; x < xMove + width; x++)
    {
        u8g2.drawVLine(x, yMove, height);
    }
}
void fillCircle(int16_t x0, int16_t y0, int16_t radius)
{
    int16_t x = 0, y = radius;
    int16_t dp = 1 - radius;
    do
    {
        if (dp < 0)
            dp = dp + (x++) * 2 + 3;
        else
            dp = dp + (x++) * 2 - (y--) * 2 + 5;

        u8g2.drawHLine(x0 - x, y0 - y, 2 * x);
        u8g2.drawHLine(x0 - x, y0 + y, 2 * x);
        u8g2.drawHLine(x0 - y, y0 - x, 2 * y);
        u8g2.drawHLine(x0 - y, y0 + x, 2 * y);
    } while (x < y);
    u8g2.drawHLine(x0 - radius, y0, 2 * radius);
}
void drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads)
{
    int16_t x = 0, y = radius;
    int16_t dp = 1 - radius;
    while (x < y)
    {
        if (dp < 0)
            dp = dp + (x++) * 2 + 3;
        else
            dp = dp + (x++) * 2 - (y--) * 2 + 5;
        if (quads & 0x1)
        {
            u8g2.drawPixel(x0 + x, y0 - y);
            u8g2.drawPixel(x0 + y, y0 - x);
        }
        if (quads & 0x2)
        {
            u8g2.drawPixel(x0 - y, y0 - x);
            u8g2.drawPixel(x0 - x, y0 - y);
        }
        if (quads & 0x4)
        {
            u8g2.drawPixel(x0 - y, y0 + x);
            u8g2.drawPixel(x0 - x, y0 + y);
        }
        if (quads & 0x8)
        {
            u8g2.drawPixel(x0 + x, y0 + y);
            u8g2.drawPixel(x0 + y, y0 + x);
        }
    }
    if (quads & 0x1 && quads & 0x8)
    {
        u8g2.drawPixel(x0 + radius, y0);
    }
    if (quads & 0x4 && quads & 0x8)
    {
        u8g2.drawPixel(x0, y0 + radius);
    }
    if (quads & 0x2 && quads & 0x4)
    {
        u8g2.drawPixel(x0 - radius, y0);
    }
    if (quads & 0x1 && quads & 0x2)
    {
        u8g2.drawPixel(x0, y0 - radius);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jsp基础语法

前提 安装jdk参考 下载tomcat解压&#xff0c;运行tomcat不报错即可 第一个jsp程序 切换到webapps下ROOT文件夹下&#xff0c;将除了WEB-INF文件外的全部内容删除&#xff0c;新建index.jsp index.jsp内容如下 <!DOCTYPE html> <html lang"zh-CN"&g…

React Proxy 详细流程与配置方式(webpack、setupProxy.js、package.json)

一、 package.json 配置方式 全部以 GET 请求为例&#xff0c;每次修改配置后&#xff0c;重启项目&#xff0c;否则不生效。 访问 http://127.0.0.1:6000/api/user/list 接口为例检查自己脚手架版本 $ create-react-app -V若脚手架版本在 2.0 以下&#xff0c;可以使用对象类型…

【C++】deque的实现原理简单介绍

前言 deque被称为双端队列&#xff0c;它的出现主要是为了结合vector和list的优点并减小它们的缺点&#xff0c;实际上deque确实结合了vector和list的优点减小了它们的缺点&#xff0c;但是它的结合也让它自己的优点没有原始的vector和list那么极致&#xff0c;导致deque变得很…

C++好难(1):C++的入门

目录 前言&#xff1a; C的历史&#xff1a; c的领域 1.C的关键字&#xff1a; 2.命名空间 2.1命名空间的定义&#xff1a; 1&#xff09;命名空间的普通定义&#xff1a; 2&#xff09;命名空间的嵌套定义&#xff1a; 3&#xff09;命名空间相同的处理&#xff1a; …

没有公网IP,自建网站如何让外网访问?

受创业潮影响&#xff0c;身边很多朋友都自己开公司创业了&#xff0c;作为一个IT行业从业者&#xff0c;我就莫名的开始忙起来了&#xff0c;因为掌握编程技术&#xff0c;朋友们经常找到我&#xff0c;让我帮他们做公司网站。但是存在一个无法回避的问题&#xff0c;就是我的…

0/1背包问题——从LeetCode题海中总结常见套路

目录 问题讨论 01背包问题公式 为什么状态压缩到一维时候需要逆序&#xff1f; 怎样求次数&#xff1f; 转化成最大和sum/2的01背包&#xff1a;LeetCode.416.分割等和子集 转化成最大和sum/2的01背包&#xff1a;LeetCode1049.最后一块石头的重量II LeetCode.494.目标和…

微软文字转语音不能试用了,分享三个方法给大家!

最近很多小伙伴告诉我&#xff0c;微软文字转语音不能在线试用了&#xff0c;这是因为微软关闭了官方的使用页面&#xff0c;所以现在不能直接使用微软的网页版进行文字转语音了。 那么我们还有没有更好的方法去“白嫖”微软的文字转语音呢&#xff1f; 答案是肯定的&#xf…

初识NoSQL(一文读懂)

最近参加了Oracle的数据库培训&#xff0c;对NoSQL非常好奇&#xff0c;总结一下关于NoSQL的认识。 NoSQL是Not Only SQL&#xff0c;并不是去除掉SQL&#xff0c;泛指非关系型的数据库。关系&#xff0c;指关系模型&#xff0c;具体指同一个对象在不同属性上的值 以及 不同对…

一个AK/SK泄露检测的实现思路

01、简介 在企业上云的过程中&#xff0c;AK/SK泄露导致的数据泄露事件屡见不鲜。在企业混合云架构下&#xff0c;公有云和私有云都存在大量的AccessKey&#xff0c;如何有效地检测可能的AK/SK泄露事件&#xff0c;一直困扰着企业的安全人员。 本文提供了一种比较容易实现的思路…

UART协议学习——异步全双工串行通信方式

文章目录 前言一、简介1、优点2、缺点 二、数据格式三、波特率1、定义2、波特率和采样频率 四、常见接口电平1、TTL电平2、RS232&#xff08;负逻辑&#xff09;3、RS485 前言 2023.4.22 世界地球日 一、简介 UART&#xff1a;Universal Asynchronous Receiver/Transmitter&a…

Albert-Z-Guo/Deep-Reinforcement-Stock-Trading

深加固股票交易 该项目打算在投资组合管理中利用深度强化学习。框架结构的灵感来自Q-Trader。代理人的奖励是在每个行动步骤评估的未实现净利润&#xff08;意味着股票仍在投资组合中且尚未兑现&#xff09;。对于每一步的不作为&#xff0c;投资组合中都会增加负惩罚&#xf…

USMART 函数错误解决方法

身为电子工程师&#xff0c;看了马斯克的星舰飞船&#xff0c;真是太帅了&#xff1b; 深知一个良好的测试环境对产品性能的影响&#xff0c;对工作效率的提升。 小资源MCU调试代码的工具USMART 使用起来。 移植的文章网上有很多&#xff0c;但是对移植过程中使用错误的文章…

mybatisPlus拦截器使用demo

概述 顾名思义&#xff0c;就是一个拦截器&#xff0c;和springmvc的拦截器&#xff0c;servlet的过滤器差不多&#xff0c;就是在执行前拦了一道&#xff0c;里面可以做一些自己的事情。 平时用的mybatisPlus较多&#xff0c;直接以com.baomidou.mybatisplus.extension.plug…

VUE中使用element-china-area-data

使用element-china-area-data的中国省市区级联数据编写城市选择器。以下为解决效果图&#xff1a; &#xff08;1&#xff09;安装 npm install element-china-area-data -S &#xff08;2&#xff09;引入 import { regionData, CodeToText, TextToCode } from ‘element-ch…

LDO系列--LDO并联扩容

1、不能简单并联&#xff08;无法电流均衡&#xff09; 两个LDO的内部的带隙基准源(参考电压)&#xff0c;FET的特性&#xff0c;以及误差放大器的噪声不同(如失调电压)&#xff0c;实际LDO输出的目标电压依旧是有差异的。 这就导致了&#xff0c;LDO-High的目标输出电压高一些…

STM32F103基于标准库+I2C SSD1306仿数码管RTC时钟显示

STM32F103基于标准库I2C SSD1306仿数码管RTC时钟显示 ✨申明&#xff1a;本文章仅发表在CSDN网站&#xff0c;任何其他网站&#xff0c;未注明来源&#xff0c;见此内容均为盗链和爬取。 &#x1f341;对于文中所提供的相关资源链接将作不定期更换。 &#x1f4fa;显示效果&a…

UWB芯片DW300之CRC模式介绍及代码实现

SPI CRC模式 当启用SPI CRC模式时,可以为SPI传输提供循环冗余校验序列的额外保护。这种操作模式在默认情况下是禁用的,但可以通过SYS_CFG寄存器中的SPI_CRCEN位启用(和禁用)。 虽然SPI CRC检查在主机微处理器必须为每个SPI写入和读取事务计算CRC的附加软件开销方面有缺点,但…

SOFA Weekly|SOFARPC 5.10.0 版本发布、SOFA 五周年回顾、Layotto 社区会议回顾与预告...

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展 欢迎留言互动&#xff5e; SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&am…

【Mysql】分库分表

【Mysql】分库分表 文章目录 【Mysql】分库分表1. 介绍2. 拆分策略2.1 垂直拆分2.1.1 垂直分库2.1.2 垂直分表 2.2 水平拆分2.2.1 水平分库2.2.2 水平分表 3. MyCat3.1 概述 1. 介绍 采用单数据库进行数据存储存在以下瓶颈&#xff1a; IO瓶颈&#xff1a;热点数据太多&#x…

项目管理必备!20个实用技巧全掌握!

即使在最完美的条件下&#xff0c;管理一个项目也是很困难的。 ​项目管理的成败好坏与优秀项目团队密不可分的,建设一个好的团队将会更团结、更坚强、更具有竞争力, 更能适应无限变化的环境。 ​不幸的是&#xff0c;还是有很多项目经理实质上没有没有总结出自己思维方法和运…