当前位置:   article > 正文

ESP8266 最简单的OTA升级模式_巴法云 ota

巴法云 ota

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

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

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

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

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

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

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

  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266httpUpdate.h>
  3. // 固件链接,在巴法云控制台复制、粘贴到这里即可
  4. String upUrl = "http://bin.bemfa.com/b/3BcNGM5NTZiMDcxM2QwNDdjY2IyYTQ0YWIyNzQzOTgxZWU=test.bin";
  5. // 当升级开始时,打印日志
  6. void update_started()
  7. {
  8. Serial.println("CALLBACK: HTTP update process started");
  9. }
  10. // 当升级结束时,打印日志
  11. void update_finished()
  12. {
  13. Serial.println("CALLBACK: HTTP update process finished");
  14. u8g2.clearBuffer();
  15. u8g2.drawStr(u8g2.getWidth() / 2, u8g2.getHeight() / 2, "Restart");
  16. u8g2.sendBuffer();
  17. }
  18. // 当升级中,打印日志
  19. void update_progress(int cur, int total)
  20. {
  21. Serial.printf("CALLBACK: HTTP update process at %d of %d bytes...%d%% \n", cur, total, cur / (total / 100));
  22. ota_OLED_onProgress(4, 32, 120, 8, cur / (total / 100) );
  23. }
  24. // 当升级失败时,打印日志
  25. void update_error(int err)
  26. {
  27. Serial.printf("CALLBACK: HTTP update fatal error code %d\n", err);
  28. }
  29. /**
  30. * 固件升级函数
  31. * 在需要升级的地方,加上这个函数即可,例如setup中加的updateBin();
  32. * 原理:通过http请求获取远程固件,实现升级
  33. */
  34. void updateBin()
  35. {
  36. WiFiClient UpdateClient;
  37. ESPhttpUpdate.onStart(update_started); // 当升级开始时
  38. ESPhttpUpdate.onEnd(update_finished); // 当升级结束时
  39. ESPhttpUpdate.onProgress(update_progress); // 当升级中
  40. ESPhttpUpdate.onError(update_error); // 当升级失败时
  41. t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient, upUrl);
  42. switch (ret)
  43. {
  44. case HTTP_UPDATE_FAILED: // 当升级失败
  45. Serial.println("[update] Update failed.");
  46. break;
  47. case HTTP_UPDATE_NO_UPDATES: // 当无升级
  48. Serial.println("[update] Update no Update.");
  49. break;
  50. case HTTP_UPDATE_OK: // 当升级成功
  51. Serial.println("[update] Update ok.");
  52. break;
  53. }
  54. }

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

  1. void ota_OLED_onProgress(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress)
  2. {
  3. u8g2.clearBuffer();
  4. uint16_t radius = height / 2;
  5. uint16_t xRadius = x + radius;
  6. uint16_t yRadius = y + radius;
  7. uint16_t doubleRadius = 2 * radius;
  8. uint16_t innerRadius = radius - 2;
  9. drawCircleQuads(xRadius, yRadius, radius, 0b00000110);
  10. u8g2.drawHLine(xRadius, y, width - doubleRadius + 1);
  11. u8g2.drawHLine(xRadius, y + height, width - doubleRadius + 1);
  12. drawCircleQuads(x + width - radius, yRadius, radius, 0b00001001);
  13. uint16_t maxProgressWidth = (width - doubleRadius + 1) * progress / 100;
  14. fillCircle(xRadius, yRadius, innerRadius);
  15. fillRect(xRadius + 1, y + 2, maxProgressWidth, height - 3);
  16. fillCircle(xRadius + maxProgressWidth, yRadius, innerRadius);
  17. u8g2.setCursor(10, 20);
  18. u8g2.drawStr(10, u8g2.getHeight() / 2 - 10, "OTA update..."); // 返回错误值
  19. u8g2.setCursor(55, u8g2.getHeight() / 2 + 30);
  20. u8g2.print(progress);
  21. u8g2.print("%");
  22. u8g2.sendBuffer();
  23. }
  24. void fillRect(int16_t xMove, int16_t yMove, int16_t width, int16_t height)
  25. {
  26. for (int16_t x = xMove; x < xMove + width; x++)
  27. {
  28. u8g2.drawVLine(x, yMove, height);
  29. }
  30. }
  31. void fillCircle(int16_t x0, int16_t y0, int16_t radius)
  32. {
  33. int16_t x = 0, y = radius;
  34. int16_t dp = 1 - radius;
  35. do
  36. {
  37. if (dp < 0)
  38. dp = dp + (x++) * 2 + 3;
  39. else
  40. dp = dp + (x++) * 2 - (y--) * 2 + 5;
  41. u8g2.drawHLine(x0 - x, y0 - y, 2 * x);
  42. u8g2.drawHLine(x0 - x, y0 + y, 2 * x);
  43. u8g2.drawHLine(x0 - y, y0 - x, 2 * y);
  44. u8g2.drawHLine(x0 - y, y0 + x, 2 * y);
  45. } while (x < y);
  46. u8g2.drawHLine(x0 - radius, y0, 2 * radius);
  47. }
  48. void drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads)
  49. {
  50. int16_t x = 0, y = radius;
  51. int16_t dp = 1 - radius;
  52. while (x < y)
  53. {
  54. if (dp < 0)
  55. dp = dp + (x++) * 2 + 3;
  56. else
  57. dp = dp + (x++) * 2 - (y--) * 2 + 5;
  58. if (quads & 0x1)
  59. {
  60. u8g2.drawPixel(x0 + x, y0 - y);
  61. u8g2.drawPixel(x0 + y, y0 - x);
  62. }
  63. if (quads & 0x2)
  64. {
  65. u8g2.drawPixel(x0 - y, y0 - x);
  66. u8g2.drawPixel(x0 - x, y0 - y);
  67. }
  68. if (quads & 0x4)
  69. {
  70. u8g2.drawPixel(x0 - y, y0 + x);
  71. u8g2.drawPixel(x0 - x, y0 + y);
  72. }
  73. if (quads & 0x8)
  74. {
  75. u8g2.drawPixel(x0 + x, y0 + y);
  76. u8g2.drawPixel(x0 + y, y0 + x);
  77. }
  78. }
  79. if (quads & 0x1 && quads & 0x8)
  80. {
  81. u8g2.drawPixel(x0 + radius, y0);
  82. }
  83. if (quads & 0x4 && quads & 0x8)
  84. {
  85. u8g2.drawPixel(x0, y0 + radius);
  86. }
  87. if (quads & 0x2 && quads & 0x4)
  88. {
  89. u8g2.drawPixel(x0 - radius, y0);
  90. }
  91. if (quads & 0x1 && quads & 0x2)
  92. {
  93. u8g2.drawPixel(x0, y0 - radius);
  94. }
  95. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/600715
推荐阅读
相关标签
  

闽ICP备14008679号