基於 ESP32S3-R8N16 開發板的 HomeKit 亮燈

2025 年 6 月 2 日
文章摘要
FakeGPT
加載中...
此內容由人工不智慧生成。

platformio.ini 的配置

配置如下:

[env:4d_systems_esp32s3_gen4_r8n16]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.20/platform-espressif32.zip
board = 4d_systems_esp32s3_gen4_r8n16
framework = arduino
monitor_speed = 115200
build_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 的接腳和一個用於控制燈泡開關的特徵。這個結構體封裝了燈泡的狀態和控制邏輯,是一個可重用的組件。

includes/Dev_SingleLED.h
#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 中。

src/main.cpp
#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 之間串聯一個 1kΩ1k\Omega 的電阻。接線圖如圖所示:

ESP32S3-R8N16 LED 接線圖

連結 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 語音控制它。

基於 ESP32S3-R8N16 開發板的 HomeKit 亮燈
https://blog.kynix.tw/posts/1748868336680/
作者
Adrian Chen
建檔時間
2025 年 6 月 2 日
協議
BY-NC-SA 4.0
姓名標示-非商業性-相同方式分享 4.0 國際