一. Ticker 定時庫
Ticker 是ESP32自帶庫
注意: 不建議使用Ticker回調函數來阻塞IO操作(網絡、串口、文件);可以在Ticker回調函數中設置一個標記,在loop函數中檢測這個標記;
對于arg,必須是 char, short, int, float, void, char 之一;
1. 定時狀態獲取 .active();
/**
* Ticker是否激活狀態
* @return bool true表示ticker啟用
*/
bool active();
2. 終止定時器 .detach()
/**
* 停止Ticker
*/
void detach();
3. once() —— xx秒后只執行一次
/**
* xx秒后只執行一次
* @param seconds 秒數
* @param callback 回調函數
*/
void once(float seconds, callback_function_t callback);
/**
* xx秒后只執行一次
* @param seconds 秒數
* @param callback 回調函數
* @param arg 回調函數的參數
*/
void once(float seconds, void (*callback)(TArg), TArg arg)
示例: 一個傳參,一個不傳參
#include "Arduino.h"
#include "Ticker.h"
Ticker t1;
Ticker t2;
void func1()
{
Serial.println("我是t1的回調,我沒參數");
}
void func1(int a)
{
Serial.print("我是t2的回調,我的參數是:");
Serial.println(a);
}
void setup()
{
Serial.begin(115200);
if (1)
{
t1.once(10, func1);
t2.once(20, func1, 8);
//t1 t2 方法名都叫func1, 但其實是不同的方法, 這涉及到一個方法重載的概念
}
}
void loop()
{
Serial.println("我來證明我沒被阻塞,也沒法阻塞Ticker");
delay(2700);
}
4. once_ms() —— xx毫秒后只執行一次
用法同上
/**
* xx毫秒后只執行一次
* @param seconds 秒數
* @param callback 回調函數
*/
void once_ms(float seconds, callback_function_t callback)
/**
* xx毫秒后只執行一次
* @param seconds 秒數
* @param callback 回調函數
* @param arg 回調函數的參數
*/
void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg);
5. attach() —— 每隔xx秒周期性執行
和上面一樣,只是周期性執行, 需要.detach()結束運行
/**
* 每隔xx秒周期性執行
* @param seconds 秒數
* @param callback 回調函數
*/
void attach(float seconds, callback_function_t callback);
/**
* 每隔xx秒周期性執行
* @param seconds 秒數
* @param callback 回調函數
* @param arg 回調函數的參數
*/
void attach(float seconds, void (*callback)(TArg), TArg arg)
6. attach_ms() —— 每隔xx毫秒周期性執行
/**
* 每隔xx毫秒周期性執行
* @param seconds 秒數
* @param callback 回調函數
*/
void attach_ms(float seconds, callback_function_t callback);
/**
* 每隔xx毫秒周期性執行
* @param seconds 秒數
* @param callback 回調函數
* @param arg 回調函數的參數
*/
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
二. 轉換為base64
1. 什么是base64
Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數據的方法。
標準的Base64并不適合直接放在URL里傳輸,因為URL編碼器會把標準Base64中的“/”和“+”字符變為形如“%XX”的形式,而這些“%”號在存入數據庫時還需要再進行轉換,因為ANSI SQL中已將“%”號用作通配符。
為解決此問題,可采用一種用于URL的改進Base64編碼,它在末尾填充'='號,并將標準Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,并統一了數據庫、表單等處對象標識符的格式。
ESP32就是采用這種編碼方式來將數據轉換未base64的
2. ESP32轉換base64碼
base64 是ESP32自帶庫
用法非常簡單. 只有一個靜態方法:
static String base64::encode(const String &text)
還有 1 個重載
convert input data to base64
參數:
text – const String&
返回:
String
因為是靜態方法, 所以我們訪問此方法要用如下方法:
base64::encode(testBase64);
完整的舉例:
#include <Arduino.h>
#include "base64.h"
String testBase64 = "this is a test to base64!";
String revBase64Reslut;
void setup()
{
Serial.begin(115200);
delay(5000);
Serial.println("begin encode the string!");
revBase64Reslut = base64::encode(testBase64);
Serial.println(revBase64Reslut);
}
void loop() {}
我們使用https://base64.us/來驗證一下:
三. OTA空中升級
OTA(空中)更新是使用 WiFi 連接而不是串行端口將固件加載到 ESP 模塊的過程。
- Arduino IDE:主要用于軟件開發階段,實現不接線固件燒寫
- Web Browser:通過 Web 瀏覽器手動提供應用程序更新模塊
- HTTP Server:自動使用http服務器 - 針對產品應用
在三種升級情況下,必須通過串行端口完成第一個固件上傳。
OTA 進程沒有強加的安全性,需要確保開發人員只能從合法/受信任的來源獲得更新。更新完成后,模塊將重新啟動,并執行新的代碼。開發人員應確保在模塊上運行的應用程序以安全的方式關閉并重新啟動。
1. ESP32 OTA升級原理
ESP32 連接 HTTP 服務器(可以使本地也可以是云,OTA demo使用本地服務器),發送請求 Get 升級固件;每次讀取1KB固件數據,寫入Flash。
ESP32 SPI Flash 內有與升級相關的(至少)四個分區:
OTA data區:決定運行哪個區的App
Factory App區:有出廠時的默認App
OTA_0區:OTA_0 App
OTA_1區:OTA_1 App
首次進行 OTA 升級時,OTA Demo 向 OTA_0 分區燒錄目標App,并在燒錄完成后,更新 OTA data 分區數據并重啟。
系統重啟時獲取 OTA data 分區數據進行計算,決定此后加載 OTA_0 分區的App執行(而不是默認的 Factory App 分區內的App),從而實現升級。
同理,若某次升級后 ESP32 已經在執行 OTA_0 內的App,此時再升級時,OTA Demo 就會向 OTA_1 分區寫入目標App。再次啟動后,執行 OTA_1 分區實現升級。以此類推,升級的目標App始終在 OTA_0、OTA_1 兩個分區之間交互燒錄,不會影響到出廠時的 Factory App 固件,如下圖狀態。
2. OTA升級的安全性
模塊必須以無線方式聯網獲取新的固件, 這使得模塊被強行入侵并加載了其他代碼。 為了減少被黑客入侵的可能性,請考慮使用密碼保護您的上傳,選擇某些OTA端口,也可以給bin文件加密等。
3. ESP32 OTA升級流程和說明(服務器是本地PC)
升級流程
- 電腦連上路由器(AP)
- 電腦運行HTTP服務器(本地)
- 下載OTA Demo到ESP32開發板
- ESP32連上路由器(AP)后就會訪問HTTP下載新的APP到OTA區
升級邏輯
這里要補一個 局域網OTA升級的程序
4. ESP32 OTA升級(真正網絡環境,真正云服務器)
這里要補充一個真正的OTA升級程序
4. ESP32無線代碼上傳(ESP32搭建服務器進行OTA升級)
流程:
- ESP32通過STA模式連接至WIFI
- ESP32建立局域網WEB服務器, 提供WEB更新界面, 需要使用庫 ESP32HTTPUpdateServer
- 用IDE編譯好 .bin文件
- 通過mDNS功能在瀏覽器中訪問ESP32的服務器頁面 ,服務器默認地址: http://esp32.local
- 通過web界面將本地編譯好的程序使用HTTP的POST方法上傳到ESP32中
- 上傳完成后, ESP32將固件寫入flash
這里要補充一個esp32作為局域網服務器的 OTA程序
四. SSD1306顯示二維碼
這里我們要用到一個庫 : ESP8266 QRcode
這個庫依賴于庫: ESP8266_SSD1306
這個SSD1306驅動庫非常好用,可以了解一下
#include <Arduino.h>
#include "SSD1306.h"
#include "qrcode.h"
SSD1306 display(0x3c, 21, 22);
QRcode qrcode(&display);
void setup()
{
Serial.begin(115200);
delay(5000);
Serial.println("");
Serial.println("Starting...");
display.init();
display.clear();
display.display();
qrcode.init();
// create qrcode
qrcode.create("helloworld!.");
}
void loop()
{
}