跳轉至

核心上的韌體啟動

本頁你建立一個韌體項目,將ESP32帶到門戶上的線上狀態,並驗證網路部分工作。感應器和加熱邏輯將在後續步驟中新增。

該方法基於iDryer::Link外觀。你用一個iDryer::Config結構描述設備,呼叫link.begin()link.loop()——核心會自動處理所有網路連接。

1. 準備工具

你需要:

  • VS Code with PlatformIO extension;
  • USB cable;
  • 2.4 GHz Wi-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會自動在那裡找到函式庫。最簡單的方法是為下載的函式庫建立符號連結:

ln -s /path/to/idryer-core lib/idryer-core

菜單生成也需要這個(第6章)——hook在lib/idryer-core/內尋找生成器。

3. 建立secrets.h

從函式庫複製示例secrets.h.example到你的項目include/secrets.h並指定你的網路資料:

#define WIFI_SSID      "your-ssid"
#define WIFI_PASSWORD  "your-password"

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)。

為什麼需要所有這些依賴項

ArduinoJsonPubSubClientbase64WebSocketsImprov-WiFi-Libraryidryer-core函式庫本身需要(MQTT、LAN上的WebSocket存取、Wi-Fi佈建)。沒有其中任何一個,構建都會失敗並顯示錯誤消息,如... .h: No such fileMQTT_BROKERMQTT_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()中執行它:

void setup() {
    Serial.begin(115200);
    s_link.begin();
}

void loop() {
    s_link.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. 刷新

pio run -e cabinet -t upload

8. 打開Serial Monitor

pio device monitor -b 115200

日誌中的預期序列:

[CLOUD] Connecting to WiFi...
[CLOUD] WiFi connected, IP: 192.168.1.42
[CLOUD] Provisioning device...
[CLOUD] PIN: 1234567 (expires in 600s)

如果設備停在PIN: ...行——這是正常的。繼續綁定。

9. 將設備綁定到門戶

  1. 打開portal.idryer.org
  2. 轉到**Add device**部分。
  3. 輸入Serial Monitor中的PIN。

綁定後,設備轉為線上狀態。在日誌中出現:

[CLOUD] Device claimed!
[CLOUD] MQTT connected!

驗證結果

在此步驟,設備應在門戶上線。感應器資料還沒有——這是預期的。如果設備無法連接:

  • 驗證網路是2.4 GHzsecrets.h中的密碼正確;
  • 檢查ESP32電源(Wi-Fi啟動時的壓降是常見的重啟原因);
  • 電源錯誤控制器錯誤

下一步

網路部分工作。轉到感應器:連接SHT31和溫敏電阻,並在門戶中看到它們的資料。