哈喽~大家好 今天小编发现了一个特别有意思的操作.esp8266在线更新固件 废话不多说 下面开整!
本文所有程序皆开源 下载地址在文章尾部
在线升级固件的应用范围
不知道你有没有遇到过下面的两种情况 :
程序烧写完毕 调试阶段没有任何bug 但是正式使用一段时间后因为某种原因出现了不可容忍的BUG(对于处女座的人来说任何bug都是不可容忍的)
程序烧写完毕 使用正常 但是某天你突然想到了一个非常炸天的功能 或者你想再度优化程序
那么问题来了 无论你是解决bug 还是要优化程序 都需要设备断电 拆卸 烧写 这三步 是不是很烦?
这里推荐一个好方法 esp8266在线更新固件 OTA (Over-the-Air的简写,空中下载技术的意思)
esp8266 for arduino 的开发者给出了两种更新方法都是在线更新!
一种是esp8266自建一个 web server 当你通过网页访问8266时 通过上传bin文件升级 如下
第二种是 在指定的网页位置查找bin文件 并下载更新
因为第二种对小编实际应用比较大 所以第一种并未研究....(因为手里正好有瘦主机 建好站 把升级文件往里一扔就可以了)
这里单独讲解第二种哦.
先看下效果~
正式开始前的准备
硬件esp8266一个 不推荐01版本(有过对比你就知道差一元钱的差距)
然后把arduino ide 附加开发版设置好 这样就可以用arduino的ide开发esp8266了
具体设置 请看我之前发布的一个视频和一个文章 都有讲
视频:玩转esp8266物联网模块 简简单单点亮LED灯
文章:物联网重要组成部分esp8266的开发 用Arduino的IDE开发ESP8266
我他喵的也不想这样的 头条的内部文章链接抽风了..不能直接引用

-注意!-
因为spiffs的原因 开发板必须选generic esp8266 module(必须是要这个哦~因为别的开发板貌似都没有flahsize选项)
并且把flah size 设置成 no spiffs
原因是一个程序文件200+KB esp8266空间分配会出问题
在菜单 首选项 里设置如下
这样的话 ide编译的二进制文件 你就能根据他的输出提示进而找到了
完毕!
让我们一起来写程序吧!
先写好一份程序 点亮led灯之类的 用作测试 并且编译
编译成功后
在 "Linking everything together.." 的下第二行 红框标识的那一行向后拉
这个地址就是你编译的bin文件地址 找到他
找一个直链网盘 存进去 获得到一个下载地址 格式 http://xxx.xxx.xxx/dw/csR.bin
必须要直链!必须要直链!必须要直链! 百度云是不可以的!
以.bin结尾才可以
把这个地址放在浏览器地址栏里敲下回车 弹出下载框 就ok
我们现在把这个程序定义为你升级后的程序 并把这个bin命名为 csR.bin 其实不改这个傻乎乎的名字也可以的
我是为了方便下面的程序.. 那里写的是csR.bin
ok 结束 现在写在线更新的程序
全局定义和setup部分
有点基础的应该看得懂.没有基础的应该也能看得懂.........基本都是一行一注释
这部分需要的注意的是 把WIFI账号和密码改成你自己的. 因为你想在线更新你必须把它挂在网络上!
loop部分↓
35行 延时函数 一秒 让查询一秒查一次
36行 判断8266是否链接到路由器 如果没有 直接跳转到62行 开始输出13脚的高或低电平(这种检测取反值的方法是我搬运时候学到的..之前都不知道还有这种骚操作..一直以为管脚定义为输入模式才能检测)
38行 在链接路由的条件下才能执行 查找csR.bin文件 并将返回结果赋给ret
39行 判断ret
41-43行 如果ret是HTTP_UPDATE_FAILED 则打印输出升级失败信息
57行 如果都不是上述结果 那就打印出 未知错误
ok检测部分执行完毕 然后跳转到62行执行13脚高低电平输出
loop函数结束
烧写进你的8266 这个开发版要手动拉低引脚并重启才能烧写进去 如果选nodemcu1.0 的话自动烧写,但是程序不能正常执行 因为没有flah选项....
烧写成功后看串口输出 正常的话 链接路由器后 不到2秒就会下载新的程序 然后自动更新 (下载更新是没有提示的!)
然后会输出一大堆参数 .反正我是看不懂 好像是什么烧写位置之类的
之后观察你的板子看看有没有执行你放在网盘里的程序
题外话:
但是有些地方出现的问题小编到发帖时也没有解决
讲道理他应该会判断下载到的bin文件特性是否与正在运行的程序一致 如果一致的话就不更新 提示出无需更新的信息
但是实际并没有这样做 8266在更新一次后(更新后的程序里我写的还是查找csR.bin) 自动重启之后再次查找时候还会再次更新 一直循环
玩过8266的同学有知道什么原因的话......求指点
不过正式应用时到不会妨碍 ,因为这次更新文件里我会预先写好下次更新的文件名叫csR02.bin 这样他更新完csR.bin之后 找csR02.bin 就会提示失败 因为csR02.bin你还没有编写出来 csR02.bin是你为下次更新预留的文件名.也可以叫留的后手...
源码下载
我写了两个源码 一个是csR 一个是csG 分别对应 RGB灯的 红和绿 烧写其中的csR之后 他会亮红灯然后去自己下载更新新的固件csG csG运行后 点绿灯 然后去更新csR ...一直这么循环 .
两个代码我都打包在一起 如你不想像我这么二的话 用其中之一就好啦`~
链接:http://pan.baidu.com/s/1o7YCez4
提取码:mt0q
最后一句! 求关注啊亲 手打一个小时.....