platformio.ini 的配置
配置如下:
[env:4d_systems_esp32s3_gen4_r8n16]platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.20/platform-espressif32.zipboard = 4d_systems_esp32s3_gen4_r8n16framework = arduinomonitor_speed = 115200build_flags = -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1
首先,platform
這一行沒有用預設的 espressif32 平台,而是直接使用了 platformio 的實現,這主要是為了避免後期編譯時,出現 THIS VERSION OF HOMESPAN REQUIRES VERSION 3.0.2 OR GREATER OF THE ARDUINO-ESP32 BOARD MANAGER
錯誤,具體情況請參閱 這個 Issue。
然後我們設定 monitor_speed
為 115200,與之後 Serial Monitor 的波特率一致。
最後的 build_flags
是為了讓 ESP32S3-R8N16 開發板支持 USB CDC 和 USB 模式,這樣我們就可以通過 USB 連接到電腦進行調試。
點燈程式
以下是完整的點燈程式碼。
首先,includes/Dev_SingleLED.h
檔案宣告了 Dev_SingleLED 結構體,繼承自 Service::LightBulb,表示這是一個 HomeKit 的燈泡服務。這個結構體包含了 LED 的接腳和一個用於控制燈泡開關的特徵。這個結構體封裝了燈泡的狀態和控制邏輯,是一個可重用的組件。
#ifndef DEV_SINGLELED_H#define DEV_SINGLELED_H#include "HomeSpan.h" // 需自行在 PlatformIO 中安裝 HomeSpan 庫
struct Dev_SingleLED: Service::LightBulb { int led_pin; // led 的接腳 SpanCharacteristic *is_on; // 判斷燈的狀態:打開/關閉
// 建構子 Dev_SingleLED(int led_pin): Service::LightBulb() { this->led_pin = led_pin; is_on = new Characteristic::On(); pinMode(led_pin, OUTPUT); }
// Update 函式 boolean update() override { digitalWrite(led_pin, is_on->getNewVal<int>()); // 從 HomeSpan 獲取狀態 return true; }};
#endif //DEV_SINGLELED_H
然後,在 src/main.cpp
中,我們需要啟動 Serial Monitor,因為之後我們要在 Serial Monitor 中執行連結 WiFi、查看狀態等重要操作。在這之後,分別是 HomeSpan 的初始化和燈泡服務的添加。這裡我們使用 Dev_SingleLED
結構體來創建一個燈泡服務,並將其添加到 HomeSpan 中。
#include "HomeSpan.h"#include "Dev_SingleLED.h"
void setup() { // 啟動 Serial Monitor // 這裡的波特率需要與 platformio.ini 中的 monitor_speed 相同 Serial.begin(115200);
// 啟動 homespan // Category::Lighting 是燈光類別 // "測試用 LED 燈" 是這個 HomeSpan 的名稱,會顯示在 Home App 中 homeSpan.begin(Category::Lighting, "測試用 LED 燈");
// HAP 附件資料庫 // 順序非常重要,一定是先 SpanAccessory,再 Service,最後 Characteristic。或許加上縮排會好理解一些。Service 是從屬於 SpanAccessory 的,Characteristic 又是從屬於 Service 的。一個 SpanAccessory 就代表一個 HomeKit 附件。 new SpanAccessory(); // AccessoryInformation 這個 Service 是必須的,主要是後面的 Characteristic::Identify() 特徵是必須的,這個特徵用來識別 HomeKit 附件。 new Service::AccessoryInformation(); new Characteristic::Identify(); // 新增燈泡服務 // Dev_SingleLED 是我們自定義的燈泡服務結構體 // 接腳號碼為 11,需提前連結好硬體電路,串連 LED 和 1k 歐電阻,並將一端接到 GPIO 11 接腳,另一腳接 GND。 new Dev_SingleLED(11);}
void loop() { // 啟動 HomeSpan homeSpan.poll();}
搞定,把上述專案編譯後上傳到開發板即可。
硬體連結
這裡的硬體連結非常簡單,只需要將 LED 的正極接到 ESP32S3-R8N16 開發板的 GPIO 11 接腳,負極接到 GND。為了保護 LED,建議在 LED 和 GPIO 之間串聯一個 的電阻。接線圖如圖所示:
連結 WiFi
你需要將你的 iPhone 和開發板連結到同一個 WiFi 網絡。我們主要講如何將開發板連結到 WiFi。
我們啟動 Serial Monitor,然後輸入大寫字母 W
,注意你的輸入可能不會有回顯,這是正常的。然後按下 Enter 鍵,開發板會開始搜尋 WiFi 網絡,並將可用的網路列印在 Serial Monitor 中。你可以看到類似以下的輸出:
*** WiFi Setup - Scanning for Networks...
1) S22 2) sddx3第三报告厅 3) OFFICE2.4 4) SDDX第二报告厅 5) eduroam 6) sdu_guest 7) sdu_ipv6 8) sdu_net 9) RuiTu 10) 山东优汇一楼 11) CMCC-9N99 12) xuexiu302_Wi-Fi5 13) DIRECT-BB-HP Laser 136w 14) xuexiu302 15) SDHS607 16) ɽ���Ż��¥ 17) Dajian.edu 18) gongan 19) 莎欧二楼 20) SDHS607-SMART 21) 山东鼎鑫 22) SDHS607-VIP 23) EZVIZ_G44674390 24) yuxuan 25) DaHua_Wireless_2497 26) ChinaSJ 27) 公寓之声编辑部 28) HUAWEI-YWT 29) 706
>>> WiFi SSID:
輸入你的 WiFi SSID 和密碼,按下 Enter,如果一切順利,開發板會重啟,並顯示一句:WiFi Connected! IP Address = xxx.xxx.xxx.xxx
,這表示開發板已經成功連接到 WiFi 網絡。
在 Home App 中添加裝置
現在,你可以在 iPhone 的 Home App 中添加這個裝置了。打開 Home App,點擊右上角的加號,選擇「添加配件」。然後按下 「更多選項」,在這裡你應該會看到一個新的配件,名稱是你在 homeSpan.begin
中設定的名稱「測試用 LED 燈」。點擊它,然後按照提示完成配對。
如果 HomeKit 要求輸入設定碼,我們可以用 4663-7726
這個預設值。如果一切順利,你就可以用 Home App 控制這個燈泡了。你可以打開或關閉燈泡,並且在 Home App 中看到燈泡的狀態,甚至可以用 Siri 語音控制它。