Hướng dẫn sử dụng ESP8266 trong các ứng dụng Internet Of Things (Phần 11)

Phần 11: Cập nhật firmware từ xa (OTA) với ESP8266

Print

Các bài viết trước đã thảo luận cách lập trình ứng dụng IoT với ESP8266. Khi triển khai dự án thực tế, việc cập nhật firmware mới cho các module ESP8266 sẽ rất khó khăn nếu chúng ta dùng phương pháp nạp truyền thống thông qua mạch USB-UART trên Arduino vì phải kết nối trực tiếp đến từng module ESP8266. Do đó trong bài viết này, chúng ta sẽ thảo luận phương pháp cập nhật firmware từ xa (Over-The-Air Update) mà không cần kết nối trực tiếp với module ESP8266 và có thể sử dụng ngay smartphone hoặc tablet để thực hiện việc cập nhật firmware này.

1/ Giới thiệu các phương pháp cập nhật firmware từ xa cho ESP8266

Có thể nói, hiện tại chúng ta có thể có 3 cách để thực hiện việc OTA cho module ESP8266:

Trong 3 cách trên thì phương pháp sử dụng thư viện ArduinoOTA không thuận tiện nhất vì vẫn phải sử dụng Arduino IDE. Phương pháp dùng MQTT thì có vẻ thuận tiện nhất vì nó vừa có thể cập nhật từ xa, vừa có thể cập nhật cho nhiều thiết bị ESP8266 cùng 1 lúc. Và phương pháp dùng WebServer thì chỉ hỗ trợ cập nhật từ xa cho từng thiết bị trong cùng network mà thôi nhưng cách thực hiện đơn giản hơn MQTT.

Trong bài viết này, chúng ta sẽ thực hiện việc OTA thông qua WebServer vì nó đơn giản nhưng đáp ứng được yêu cầu cập nhật firmware từ xa mà không cần sử dụng Arduino IDE. Các bạn nếu muốn thử giải pháp MQTT thì có thể tham khảo link bên trên và cập nhật kết quả trong phần comment để mọi người tham khảo nha ?

2/ Thực hiện OTA firmware mới cho ESP8266 sử dụng  ESP8266HTTPUpdateServer

Với phương pháp này, chúng ta sẽ tạo 1 sketch trong Arduino IDE tạo 1 WebServer và gọi hàm thư viện của ESP8266HttpUpdateServer để nhận file firwmare mới từ WebServer và ghi vào Flash memory của module ESP8266

Kết nối phần cứng

Chúng ta sẽ sử dụng module ESP-01 cho demo này. Kết nối với module FT232 để nạp code từ Arduino IDE như sau (dĩ nhiên chúng ta cần nạp code có chức năng OTA để có thể chạy OTA sau này ? )

load_fw

Arduino Sketch cho chức năng OTA

Cấu trúc sketch mẫu như sau:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>

const char* ssid = “<tên_network>”;
const char* password = “<password>”;

const char* ap_ssid = “<tên_accesspoint>”;
const char* ap_password = “<accesspoint_password”;

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

void handleRoot() {
    buidWebSever();
}
void beginSTA() {
    WiFi.mode(WIFI_AP_STA);
    WiFi.begin(ssid, password);
    while(WiFi.waitForConnectResult() != WL_CONNECTED){
         WiFi.begin(ssid, password); Serial.println(“WiFi failed, retrying.”);
     }
     Serial.println(“Ready – OTA Success!!!”); Serial.print(“IP address: “); Serial.println(WiFi.localIP());
}
void beginAP() {
     WiFi.softAP(ap_ssid, ap_password);
}
uint8_t Use_Wifi = 0;
void setup(void){
   Serial.begin(115200);
   Serial.println();
   Serial.println(“Booting Sketch…”);
   if(Use_Wifi) {
        beginSTA();
   } else {
        beginAP();
   }
   httpUpdater.setup(&httpServer);
   httpServer.begin();
   if(Use_Wifi) {
       Serial.print(“Device IP address: “);
       Serial.println(WiFi.localIP());
    }
}
void loop(void){
     httpServer.handleClient();  
}

Trong sketch này chúng ta thực hiện các việc chính sau:

  • Khởi động ESP8266 là 1 thiết bị Wifi hoặc là 1 Access Point tuỳ yêu cầu ứng dụng
    Hàm setup() có thể gọi beginSTA() để kết nối vào 1 mạng Wifi có sẵn hoặc gọi hàm beginAP() để tạo 1 mạng Wifi riêng của module ESP8266
  • Khởi động httpUpdater và kết nối với WebServer để nhận file firmware từ WebServer
    Hàm setup() sẽ gọi hàm httpUpdater.setup(&httpServer) để thực hiện bước này
  • Khởi động WebServer trên module ESP8266
    Hàm setup() sẽ gọi hàm httpServer.begin()
  • Trong hàm loop(), gọi hàm httpServer.handleClient() để xử lý các sự kiện của WebServer

Setup nạp trong Arduino như hình sau:

Arduino_Setting

Ấn CTRL+U để bắt đầu compile và nạp xuống module ESP-01

Sau khi nạp thành công, chúng ta reset module ESP-01 và nhớ kết nối GPIO0 lên VCC (không kết nối xuống GND như khi nạp). Mở Serial Monitor trong Arduino (Ctrl+Shift+M) để xem print log từ sketch chương trình

Nếu ESP8266 kết nối vào 1 mạng Wifi có sẵn, trong print log chúng ta sẽ có thấy địa chỉ IP của module giống như “192.168.1.100”. Ngược lại nếu ESP8266 làm 1 Access Point thì địa chỉ mặc định là “192.168.4.1”

Chúng ta sẽ demo với trường hợp ESP8266 làm 1 Access Point như sau:

  • Scan mạng Wifi và kết nối laptop vào mạng Wifi của ESP8266 với cái tên <tên_accesspoint>” được định nghĩa trong sketch
  • Điền địa chỉ sau vào Chrome hoặc Firefox: “192.168.4.1/update” để load trang web sau từ WebServer của ESP8266
    AP_OTA
  • Ấn “Choose File” để chọn file *.bin của firmware mới cần cập nhật cho ESP8266. Để tìm được vị trí của file *.bin sau khi compile trong Arduino, các bạn cần set “Compilation” cho “Show verbose output during” trong File -> Preferences. Sau khi compile, chúng ta có thể thấy đường dẫn thư mục output file *.bin từ Arduino như “C:\Users\admin\AppData\Local\Temp\arduino_build_289666”
  • Ấn “Update” để bắt đầu quá trình cập nhật firmware
    Chrome hoặc Firefox sẽ loading đến khi quá trình cập nhật hoàn tất, và cuối cùng sẽ hiện thị như sau nếu quá trình cập nhật thành công
    OTA_Success
    Và COM log trong Arduino sau khi OTA thành công như sau:
    COM_Log

Thế là xong!

Nếu ESP8266 là thiết bị Wifi kết nối vào 1 mạng Wifi có sẵn, chúng ta cũng thực hiện tương tự, chỉ thay thế địa chỉ IP “192.168.4.1” là địa chỉ IP của thiết bị được print trong COM log khi chạy chương trình

Các bạn có thể dụng sketch mẫu trên để phát triển ứng dụng và có luôn chức năng OTA từ xa sử dụng WebServer. Với phương pháp này, các bạn có thể sử dụng cả smartphone, tablet để cập nhật firmware cho module ESP8266 bằng cách lấy file *.bin được compile sẵn từ email hoặc cloud rồi cập nhật cho module ESP8266