核心上的韌體啟動¶
本頁你建立一個韌體項目,將ESP32帶到門戶上的線上狀態,並驗證網路部分工作。感應器和加熱邏輯將在後續步驟中新增。
該方法基於iDryer::Link外觀。你用一個iDryer::Config結構描述設備,呼叫link.begin()和link.loop()——核心會自動處理所有網路連接。
1. 準備工具¶
你需要:
- VS Code with PlatformIO extension;
- USB cable;
2.4 GHzWi-Fi network (ESP32不支援僅5 GHz的網路)。
什麼是控制器韌體以及它如何進入板——控制器韌體。
2. 建立項目¶
在PlatformIO中,項目是具有固定結構的資料夾。建立項目資料夾(例如my-cabinet)並在VS Code中打開。內部應該有這些檔案:
my-cabinet/
├── platformio.ini # 構建設定(步驟4填寫)
├── include/
│ └── secrets.h # Wi-Fi登入和密碼(步驟3)
├── lib/
│ └── idryer-core/ # 核心函式庫(符號連結或複本)
└── src/
└── main.cpp # 設備程式碼:Config + setup() + loop()
下面代碼片段的所有片段都放在這些檔案中——每個步驟都指定放在哪裡。如果include/、lib/和src/資料夾不存在,請手動建立。
將idryer-core函式庫放在lib/中——PlatformIO會自動在那裡找到函式庫。最簡單的方法是為下載的函式庫建立符號連結:
菜單生成也需要這個(第6章)——hook在lib/idryer-core/內尋找生成器。
3. 建立secrets.h¶
從函式庫複製示例secrets.h.example到你的項目include/secrets.h並指定你的網路資料:
將include/secrets.h新增到.gitignore,以防止密碼進入儲存庫。
4. 配置platformio.ini¶
在項目根目錄填寫platformio.ini:
[env:cabinet]
platform = espressif32
framework = arduino
board = esp32-c3-devkitm-1
lib_deps =
bblanchon/ArduinoJson @ ^6.21.0
knolleary/PubSubClient
densaugeo/base64 @ ^1.4.0
links2004/WebSockets @ ^2.4.0
https://github.com/jnthas/Improv-WiFi-Library.git
build_flags =
-DIDRYER_API_BASE='"https://portal.idryer.org/api"'
-DMQTT_BROKER='"mqtt.idryer.org"'
-DMQTT_PORT=8883
-DMQTT_USE_TLS=1
將board替換為你的板(例如esp32-s3-devkitc-1)。idryer-core本身不需要在lib_deps中指定——它位於lib/(步驟2)。
為什麼需要所有這些依賴項
ArduinoJson、PubSubClient、base64、WebSockets和Improv-WiFi-Library由idryer-core函式庫本身需要(MQTT、LAN上的WebSocket存取、Wi-Fi佈建)。沒有其中任何一個,構建都會失敗並顯示錯誤消息,如... .h: No such file。MQTT_BROKER和MQTT_PORT標誌也是必需的——沒有它們,核心無法編譯('MQTT_BROKER' was not declared)。
5. 在Config中描述設備¶
接下來的一切都在一個檔案中進行——src/main.cpp。打開它並記錄此步驟和後續步驟的程式碼。
iDryer::Config是設備的護照。has*標誌告訴門戶設備有什麼,並確定發佈哪些遙測欄位。
對於加熱的櫃子,在src/main.cpp的開頭
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Dryer,
.unitsCount = 1,
// 外設:
.hasHeater = true, // 可控加熱器
.hasFan = true, // 風扇
.hasAirTemp = true, // 空氣溫度(SHT31)
.hasAirHumidity = true, // 空氣濕度(SHT31)
.hasHeaterTemp = true, // 加熱器溫度(溫敏電阻)
// 自動發佈週期:
.telemetryPeriodMs = 5000,
.statusPeriodMs = 10000,
// 門戶上的識別:
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "DIY Storage Cabinet",
};
static iDryer::Link s_link(CFG);
has*標誌——這是與門戶的契約
對應has*標誌為false的遙測欄位不會發佈。例如,沒有hasAirHumidity = true,濕度將不會進入雲端,即使你在程式碼中寫入它。只啟用設備中實際存在的內容。
元件清單和標誌——系統組成。
6. 最小主函式¶
在相同檔案的Config塊之後,新增setup()和loop()函式。對於首次啟動,足以啟動連結並在loop()中執行它:
這足以讓設備連接到Wi-Fi並進入門戶。感應器將在感應器步驟中新增。
本章後的完整src/main.cpp¶
將上述兩個塊放入一個檔案——這是此步驟的整個src/main.cpp:
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Dryer,
.unitsCount = 1,
.hasHeater = true,
.hasFan = true,
.hasAirTemp = true,
.hasAirHumidity = true,
.hasHeaterTemp = true,
.telemetryPeriodMs = 5000,
.statusPeriodMs = 10000,
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "DIY Storage Cabinet",
};
static iDryer::Link s_link(CFG);
void setup() {
Serial.begin(115200);
s_link.begin();
}
void loop() {
s_link.loop();
}
前面的章節展示了**要新增什麼**和**變更後的完整src/main.cpp**,所以你始終看到整體情況,而不是零散的片段。
7. 刷新¶
8. 打開Serial Monitor¶
日誌中的預期序列:
[CLOUD] Connecting to WiFi...
[CLOUD] WiFi connected, IP: 192.168.1.42
[CLOUD] Provisioning device...
[CLOUD] PIN: 1234567 (expires in 600s)
如果設備停在PIN: ...行——這是正常的。繼續綁定。
9. 將設備綁定到門戶¶
- 打開portal.idryer.org。
- 轉到**Add device**部分。
- 輸入Serial Monitor中的PIN。
綁定後,設備轉為線上狀態。在日誌中出現:
驗證結果¶
在此步驟,設備應在門戶上線。感應器資料還沒有——這是預期的。如果設備無法連接:
下一步¶
網路部分工作。轉到感應器:連接SHT31和溫敏電阻,並在門戶中看到它們的資料。