ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP32 Arduino Matter 窗帘控制端点 MatterWindowCovering 完全指南:Lift/Tilt 控制、电机校准与回调机制

ESP32 Arduino Matter 窗帘控制端点 MatterWindowCovering 完全指南:Lift/Tilt 控制、电机校准与回调机制 ESP32 Arduino Matter 窗帘控制端点 MatterWindowCovering 完全指南Lift/Tilt 控制、电机校准与回调机制【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32导读MatterWindowCovering是 Arduino ESP32 Matter 库本仓库 libraries/Matter提供的一个窗口覆盖Window Covering端点类用于在 Matter 网络中构建电动窗帘、百叶窗、投影幕布等具有升降Lift与翻转Tilt控制能力的设备。本文以官方文档 docs/en/matter/ep_window_covering.rst 为骨架结合 MatterWindowCovering.cpp 源码与 MatterWindowCovering.ino 完整示例系统讲解该端点的 API 全貌、百分比语义、本地电机校准、命令回调流程以及如何接入 Apple HomeKit、Amazon Alexa 与 Google Home。阅读完本文后你将能够独立编写并配网一个符合 Matter 标准、可被主流智能家居平台直接识别的窗帘设备固件。MatterWindowCovering 端点概述MatterWindowCovering类为 Matter 网络提供一个窗口覆盖端点实现了 Matter 标准中针对电动百叶窗、遮阳帘及其他具备升降/翻转控制能力的窗口覆盖设备的协议规范。从源码看它直接继承自MatterEndPoint基类见 MatterWindowCovering.h并在底层通过esp_matter::endpoint::window_covering创建真实端点见 MatterWindowCovering.cpp功能仅在CONFIG_ESP_MATTER_ENABLE_DATA_MODEL宏开启时编译生效。核心特性Lift 位置与百分比控制0-100%Matter 语义0 全开100 全闭Lift 与 Tilt 百分之一精度percent100ths0-10000控制直接映射 Matter 集群属性本地电机校准用于物理单位与百分比之间的换算支持多种窗口覆盖类型开、关、升降、翻转、停止命令的回调支持与 Apple HomeKit、Amazon Alexa、Google Home 集成完全遵循 Matter 标准支持的窗口覆盖类型以下枚举值定义于 MatterWindowCovering.h直接对应 Matter 规范中的WindowCovering::Type枚举值说明支持的能力ROLLERSHADE卷帘LiftROLLERSHADE_2_MOTOR双电机卷帘LiftROLLERSHADE_EXTERIOR户外卷帘LiftROLLERSHADE_EXTERIOR_2_MOTOR户外双电机卷帘LiftDRAPERY窗帘LiftAWNING遮阳篷LiftSHUTTER百叶窗板TiltBLIND_TILT_ONLY仅翻转百叶TiltBLIND_LIFT_AND_TILT升降翻转百叶Lift 和 TiltPROJECTOR_SCREEN投影幕布Lift源码中begin()内通过supportsTilt判断是否为SHUTTER、BLIND_TILT_ONLY或BLIND_LIFT_AND_TILT仅这三种类型会启用 Tilt 相关特性tilt::get_id() | position_aware_tilt::get_id()其余类型仅注册 Lift 能力见 MatterWindowCovering.cpp。因此覆盖类型必须在初始化时指定以确保正确的特性被启用。典型应用场景电动窗帘 / 电动百叶窗自动化遮阳帘智能窗口覆盖设备投影幕布遮阳篷与幕帘关键设计语义理解 Matter 百分比与百分之一精度使用本 API 前必须掌握两个相互配合的数值体系它们贯穿全部位置控制方法百分比Percent0-100面向应用层的简化数值。0 完全打开open100 完全关闭closed这是 Matter 在窗口覆盖领域的特殊语义与常规100 表示打开的直觉相反。百分之一精度Percent100ths0-10000Matter 集群属性的原生精度1对应0.01%。setCurrentLiftPercent100ths(10000)即代表完全关闭。在示例代码中两者换算通过liftPercent * 100完成见 MatterWindowCovering.ino而源码的attributeChangeCB()中反向换算为liftPercent100ths / 100见 MatterWindowCovering.cpp。重要提示本文档整个 API 均采用 Matter 百分比语义——0 表示全开100 表示全闭。例如begin()的默认参数liftPercent 0意味着初始化即完全打开。初始化与生命周期构造函数MatterWindowCovering();创建一个新的 Matter 窗口覆盖端点对象。通常在全局作用域声明例如示例中的MatterWindowCovering WindowBlinds;见 MatterWindowCovering.ino。begin()bool begin( uint8_t liftPercent 0, uint8_t tiltPercent 0, WindowCoveringType_t coveringType ROLLERSHADE, const PositionCalibration *liftCalibration nullptr, const PositionCalibration *tiltCalibration nullptr );初始化 Matter 窗口覆盖端点可指定初始位置、覆盖类型和本地电机校准。参数说明liftPercent初始升降百分比0-100默认 0 完全打开tiltPercent初始翻转百分比0-100默认 0 完全打开coveringType窗口覆盖类型默认ROLLERSHADE决定启用 Lift、Tilt 还是两者liftCalibration可选的本地升降电机范围open/closed 物理单位。在 ESP-Matter 1.5 中不作为 Matter 属性暴露tiltCalibration可选的本地翻转电机范围。在 ESP-Matter 1.5 中不作为 Matter 属性暴露函数成功返回true失败返回false。从源码实现看MatterWindowCovering.cppbegin()依次完成调用ArduinoMatter::_init()初始化 Matter 栈校验重复创建同一端点 id 只能创建一次与百分比取值范围超过 100 会记录log_e并返回false应用传入的校准liftCalibration-open/closed写入installedOpenLimitLift/installedClosedLimitLifttilt 同理按覆盖类型组装 feature flagsLift 必选Tilt 视类型而定通过wc_endpoint::create()创建端点并写入初始CurrentPosition*Percent100ths属性。PositionCalibration 结构体本地电机范围用于在物理电机单位与 Matter 百分比之间换算。仅存储在固件中在 ESP-Matter 1.5 中不发布为 Matter 集群属性。struct PositionCalibration { uint16_t open 0; uint16_t closed 65534; };默认值open 0、closed 65534对应源码中的安装限位默认值见 MatterWindowCovering.cpp。示例中为实际窗帘定义了物理单位厘米校准见 MatterWindowCovering.ino// Lift limits in centimeters (physical position at open/closed ends) // Matter percent: 0 open at open limit, 100 closed at closed limit const MatterWindowCovering::PositionCalibration LIFT_CALIBRATION {.open 0, .closed 200}; // Tilt limits (absolute values for conversion, not physical units) // Tilt is a rotation, not a linear measurement const MatterWindowCovering::PositionCalibration TILT_CALIBRATION {.open 0, .closed 90};end()void end();停止处理 Matter 窗口覆盖事件。源码实现仅将started标志置为false见 MatterWindowCovering.cpp析构函数也会自动调用它。Lift 位置控制 APIsetLiftPosition / getLiftPositionbool setLiftPosition(uint16_t liftPosition); uint16_t getLiftPosition();setLiftPosition以本地电机单位如厘米设置升降位置并利用本地电机校准范围换算为 Matter percent100ths。源码中的换算逻辑MatterWindowCovering.cpp与 ESP-Matter 的LiftToPercent100ths一致正常安装open closedliftPosition openLimit映射为 0全开 closedLimit映射为 10000全闭中间值线性插值((liftPosition - openLimit) * 10000) / (closedLimit - openLimit)反向安装open closed换算公式相应反转。setLiftPercentage / getLiftPercentagebool setLiftPercentage(uint8_t liftPercent); uint8_t getLiftPercentage();setLiftPercentage以百分比设置升降位置0-1000 全开、100 全闭。该方法更新CurrentPositionLiftPercent100ths属性反映设备实际位置而TargetPositionLiftPercent100ths属性由 Matter 命令/应用在请求新目标时设置。源码中它只是setCurrentLiftPercent100ths(liftPercent * 100)的封装见 MatterWindowCovering.cpp。注意当设备到达目标位置时应调用setOperationalState(LIFT, STALL)指示运动完成。需要亚百分比精度时优先使用setCurrentLiftPercent100ths()。setCurrentLiftPercent100ths / getCurrentLiftPercent100thsbool setCurrentLiftPercent100ths(uint16_t liftPercent100ths); uint16_t getCurrentLiftPercent100ths();以 Matter percent100ths0-100000 打开10000 关闭设置当前升降位置。这是向配网方commissioner报告实际位置的主要 API。源码实现在写入属性前会校验范围10000 返回false、跳过相同值并先尝试updateAttributeVal再回退setAttributeVal见 MatterWindowCovering.cpp。Tilt 位置控制 APIbool setTiltPosition(uint16_t tiltPosition); uint16_t getTiltPosition(); bool setTiltPercentage(uint8_t tiltPercent); uint8_t getTiltPercentage(); bool setCurrentTiltPercent100ths(uint16_t tiltPercent100ths); uint16_t getCurrentTiltPercent100ths();Tilt 系列 API 与 Lift 一一对应但需特别注意Tilt 是旋转量而非线性量其位置使用用于换算的绝对值而不是物理单位。文档与源码反复强调这一点见 MatterWindowCovering.cpp 中TiltToPercent100ths的换算。百分比语义同样为 0 全开、100 全闭setTiltPercentage更新CurrentPositionTiltPercent100ths运动完成后应调用setOperationalState(TILT, STALL)。窗口覆盖类型控制bool setCoveringType(WindowCoveringType_t coveringType); WindowCoveringType_t getCoveringType();setCoveringType设置窗口覆盖类型。从源码看MatterWindowCovering.cpp它会写入 Matter 集群的Type属性并同步内部状态getCoveringType则从集群属性读取并缓存。安装限位控制本地电机校准以下方法配置本地电机校准用于在物理电机单位与 Matter 百分比之间换算。它们在 ESP-Matter 1.5 中不暴露为 Matter 集群属性官方文档建议优先使用setLiftCalibration()/setTiltCalibration()或在begin()中传入PositionCalibration。整组校准bool setLiftCalibration(const PositionCalibration calibration); PositionCalibration getLiftCalibration(); bool setTiltCalibration(const PositionCalibration calibration); PositionCalibration getTiltCalibration();setLiftCalibration设置本地升降电机校准范围getLiftCalibration返回当前范围。实现直接读写内部的installedOpenLimitLift/installedClosedLimitLift见 MatterWindowCovering.cpp。示例中正是用WindowBlinds.getLiftCalibration()读取校准值来完成百分比 → 厘米的线性换算函数liftPercentToCm()见 MatterWindowCovering.ino。单项限位bool setInstalledOpenLimitLift(uint16_t openLimit); uint16_t getInstalledOpenLimitLift(); bool setInstalledClosedLimitLift(uint16_t closedLimit); uint16_t getInstalledClosedLimitLift(); bool setInstalledOpenLimitTilt(uint16_t openLimit); uint16_t getInstalledOpenLimitTilt(); bool setInstalledClosedLimitTilt(uint16_t closedLimit); uint16_t getInstalledClosedLimitTilt();setInstalledOpenLimitLift(openLimit)设置完全打开时的本地升降限位物理单位如厘米setInstalledClosedLimitLift(closedLimit)设置完全关闭时的本地升降限位物理单位如厘米setInstalledOpenLimitTilt(openLimit)/setInstalledClosedLimitTilt(closedLimit)设置本地翻转电机限位注意Tilt 是旋转量而非线性测量这些限位仅用于本地位置换算。所有 setter 在started false时会返回false。目标位置控制bool setTargetLiftPercent100ths(uint16_t liftPercent100ths); uint16_t getTargetLiftPercent100ths(); bool setTargetTiltPercent100ths(uint16_t tiltPercent100ths); uint16_t getTargetTiltPercent100ths();以 percent100ths0-100000 全开、10000 全闭设置目标位置。这设置的是设备应向之移动的目标位置实际位置应在物理移动后用setLiftPercentage()/setTiltPercentage()更新。从源码看setter 会写入TargetPositionLiftPercent100ths/TargetPositionTiltPercent100ths属性见 MatterWindowCovering.cpp写入后立即触发对应的目标位置回调见下节。在示例的loop()中用户短按按钮即以 20% 步进循环目标升降位置核心一行正是WindowBlinds.setTargetLiftPercent100ths(targetLiftPercent * 100)见 MatterWindowCovering.ino。运行状态Operational Status控制完整位图操作bool setOperationalStatus(uint8_t operationalStatus); uint8_t getOperationalStatus();setOperationalStatus设置完整的运行状态位图。文档建议优先使用setOperationalState()设置单个字段而不是直接操作完整位图。OperationalStatus属性的位分布定义于 MatterWindowCovering.h为GLOBAL占 bits 0-1掩码 0x03、LIFT占 bits 2-3掩码 0x0C、TILT占 bits 4-5掩码 0x30。单字段状态设置bool setOperationalState(OperationalStatusField_t field, OperationalState_t state); OperationalState_t getOperationalState(OperationalStatusField_t field);setOperationalState为特定字段LIFT或TILT设置运行状态。GLOBAL字段不能直接设置它按优先级LIFT TILT自动更新。field要设置的字段LIFT或TILTGLOBAL不可直接设置state运行状态STALL、MOVING_UP_OR_OPEN或MOVING_DOWN_OR_CLOSE源码揭示了GLOBAL的自动推导逻辑MatterWindowCovering.cpp拒绝直接设置GLOBAL仅当该字段状态确实变化时才更新位图currentStatus (currentStatus ~fieldMask) | (((uint8_t)state fieldShift) fieldMask)重算GLOBALglobalState (liftState ! STALL) ? liftState : tiltState——即 Lift 优先Lift 处于STALL时才采用 Tilt 状态。getOperationalState按字段掩码与移位提取对应 2-bit 状态GLOBAL移 0 位、LIFT移 2 位、TILT移 4 位。在示例回调中goToLiftPercentage()根据目标与当前值的比较先设置MOVING_UP_OR_OPEN目标更小即趋向打开或MOVING_DOWN_OR_CLOSE目标更大即趋向关闭运动模拟完成后立即设置STALL见 MatterWindowCovering.inostopMotor()则同时将 Lift 与 Tilt 都置为STALL。事件处理与回调机制MatterWindowCovering会自动检测 Matter 命令并在注册了回调时调用相应函数。所有回调类型均为std::function见 MatterWindowCovering.h注册方法在头文件中以内联方式实现。回调分两大类目标位置回调TargetPosition属性变化时触发回调触发条件onOpen()收到UpOrOpen命令目标置为 0% 全开onClose()收到DownOrClose命令目标置为 100% 全闭onStop()收到StopMotion命令目标置为当前位置即停止运动onGoToLiftPercentage()TargetPositionLiftPercent100ths变化任何命令、setTargetLiftPercent100ths()或直接属性写入onGoToTiltPercentage()TargetPositionTiltPercent100ths变化任何命令、setTargetTiltPercent100ths()或直接属性写入当前位置回调回调触发条件onChange()CurrentPositionLiftPercent100ths或CurrentPositionTiltPercent100ths变化调用setLiftPercentage()/setTiltPercentage()之后或 Matter 控制器直接更新这些属性时重要onChange()不会在 Matter 命令执行时被自动调用。命令修改的是TargetPosition而非CurrentPosition。要触发onChange()必须在物理设备实际移动后由你的onGoToLiftPercentage()或onGoToTiltPercentage()回调调用setLiftPercentage()/setTiltPercentage()来更新CurrentPosition属性。注意所有回调都是可选的。如果某个特定回调未注册则只会调用通用回调onGoToLiftPercentage()或onGoToTiltPercentage()若已注册。onOpenvoid onOpen(EndPointOpenCB onChangeCB);设置收到UpOrOpen命令目标位置置为 0%全开时的回调。回调签名为bool onChangeCallback();onClosevoid onClose(EndPointCloseCB onChangeCB);设置收到DownOrClose命令目标位置置为 100%全闭时的回调签名同上bool onChangeCallback();。onGoToLiftPercentagevoid onGoToLiftPercentage(EndPointLiftCB onChangeCB);设置TargetPositionLiftPercent100ths变化时的回调。触发来源包括Matter 命令UpOrOpen、DownOrClose、StopMotion、GoToLiftPercentage调用setTargetLiftPercent100ths()直接写入TargetPositionLiftPercent100ths属性只要目标升降位置变化无论通过何种命令或方法触发该回调都会被调用。回调签名为bool onChangeCallback(uint8_t liftPercent);其中liftPercent为目标升降百分比0-1000 全开、100 全闭。注意该回调收到的是目标位置。要在物理设备实际移动后更新当前位置进而触发onChange()请调用setLiftPercentage()。onGoToTiltPercentagevoid onGoToTiltPercentage(EndPointTiltCB onChangeCB);TargetPositionTiltPercent100ths变化时的回调触发来源与onGoToLiftPercentage完全对应GoToTiltPercentage命令等。回调签名为bool onChangeCallback(uint8_t tiltPercent);onStopvoid onStop(EndPointStopCB onChangeCB);设置收到StopMotion命令目标位置置为当前位置即停止运动时的回调。签名bool onChangeCallback();。onChangevoid onChange(EndPointCB onChangeCB);设置CurrentPositionLiftPercent100ths或CurrentPositionTiltPercent100ths变化时的回调。这与onGoToLiftPercentage()/onGoToTiltPercentage()针对TargetPosition属性不同。onChange()被调用的时机CurrentPositionLiftPercent100ths变化时调用setLiftPercentage()之后或 Matter 控制器直接更新该属性CurrentPositionTiltPercent100ths变化时调用setTiltPercentage()之后或 Matter 控制器直接更新该属性回调签名为bool onChangeCallback(uint8_t liftPercent, uint8_t tiltPercent);参数为当前升降与翻转百分比均 0-100。命令检测的源码实现细节源码attributeChangeCB()MatterWindowCovering.cpp揭示了命令 → 回调的映射规则。以 Lift 目标位置变化为例targetLiftPercent100ths 0→ 判定为UpOrOpen命令调用_onOpenCB全开targetLiftPercent100ths 10000→ 判定为DownOrClose命令调用_onCloseCB全闭目标值等于当前值且当前值不在 0/10000 限位 → 判定为StopMotion命令调用_onStopCB无论何种情况最后总会调用通用回调_onGoToLiftPercentageCB以兼容所有目标位置变化场景。Tilt 目标位置变化则直接调用_onGoToTiltPercentageCB。所有回调的返回值通过ret 聚合回调返回false时会被记录。updateAccessoryvoid updateAccessory();使用当前 Matter 内部状态更新窗口覆盖状态即以缓存的currentLiftPercent/currentTiltPercent调用已注册回调见 MatterWindowCovering.cpp。适用于需要在事件循环中主动同步状态到应用层的场景。完整实战示例电动百叶窗固件仓库提供了可直接编译运行的完整示例 MatterWindowCovering.ino配套说明见 README.md。该示例以BLIND_LIFT_AND_TILT类型演示升降 翻转双控制并具备状态持久化、物理按键手动控制、RGB LED 可视化等完整工程要素。整体流程命令 → 回调 → 状态回写示例的完整回调链路清晰展示了本文所述 API 的协作方式Matter 控制器下发命令 →TargetPosition属性变化触发onGoToLiftPercentage()/onGoToTiltPercentage()以及针对开/关/停的onOpen/onClose/onStop应用回调驱动电机并在运动完成后调用setLiftPercentage()/setTiltPercentage()或直接setCurrentLiftPercent100ths()CurrentPosition属性更新 → 触发onChange()回调示例中用于刷新 RGB LED 可视化。示例关键代码// Initialize window covering with BLIND_LIFT_AND_TILT type and local motor calibration WindowBlinds.begin(lastLiftPercent, lastTiltPercent, MatterWindowCovering::BLIND_LIFT_AND_TILT, LIFT_CALIBRATION, TILT_CALIBRATION); // Set callback functions WindowBlinds.onOpen(fullOpen); WindowBlinds.onClose(fullClose); WindowBlinds.onGoToLiftPercentage(goToLiftPercentage); WindowBlinds.onGoToTiltPercentage(goToTiltPercentage); WindowBlinds.onStop(stopMotor); // Generic callback for Lift or Tilt change WindowBlinds.onChange([](uint8_t liftPercent, uint8_t tiltPercent) { Serial.printf(Window Covering changed: Lift%u%%, Tilt%u%%\r\n, liftPercent, tiltPercent); visualizeWindowBlinds(liftPercent, tiltPercent); return true; }); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin();而goToLiftPercentage()内部展示了状态上报 运动完成的完整范式模拟运动中省略了真实电机驱动代码bool goToLiftPercentage(uint8_t liftPercent) { // update Lift operational state if (liftPercent currentLiftPercent) { WindowBlinds.setOperationalState(MatterWindowCovering::LIFT, MatterWindowCovering::MOVING_DOWN_OR_CLOSE); } else if (liftPercent currentLiftPercent) { WindowBlinds.setOperationalState(MatterWindowCovering::LIFT, MatterWindowCovering::MOVING_UP_OR_OPEN); } // ... 此处应插入真实电机驱动代码 ... currentLift liftPercentToCm(liftPercent); currentLiftPercent liftPercent; // Update CurrentPosition to reflect actual position WindowBlinds.setCurrentLiftPercent100ths(liftPercent * 100); // Set operational status to STALL when movement is complete WindowBlinds.setOperationalState(MatterWindowCovering::LIFT, MatterWindowCovering::STALL); // Store state matterPref.putUChar(liftPercentPrefKey, currentLiftPercent); return true; }硬件与引脚配置RGB LED优先使用RGB_BUILTIN未定义时回退到引脚 2亮度反映升降位置0% 熄灭100% 全亮颜色反映翻转角度红色 0%蓝色 100%按键默认使用BOOT_PIN启动按键短按以 20% 步进循环升降目标0% → 20% → … → 100% → 0%长按超过 5 秒执行解除配网decommission构建与烧录要点根据 README 与 ci.yml其中fqbn_append: PartitionSchemehuge_app且要求CONFIG_ESP_MATTER_ENABLE_DATA_MODELy在 Arduino IDE 中打开MatterWindowCovering.ino选择目标 ESP32 开发板分区方案选择Huge APP (3MB No OTA/1MB SPIFFS)上传前启用Erase All Flash Before Sketch Upload连接开发板后点击 Upload。若CONFIG_ENABLE_CHIPOBLE未启用即不使用 BLE 配网则必须在代码中填写 Wi-Fi 凭据const char *ssid your-ssid; // Change this to your WiFi SSID const char *password your-password; // Change this to your WiFi password支持的芯片目标SoCWi-FiThreadBLE 配网状态ESP32✅❌❌完全支持ESP32-S2✅❌❌完全支持ESP32-S3✅❌✅完全支持ESP32-C3✅❌✅完全支持ESP32-C5❌✅✅支持仅 ThreadESP32-C6✅❌✅完全支持ESP32-H2❌✅✅支持仅 Thread配网说明ESP32 与 ESP32-S2 不支持 BLE 配网必须在代码中直接提供 Wi-Fi 凭据其余目标使用 Matter CHIPoBLE 自动建立 IP 网络。串口日志波特率 115200会打印手动配对码与二维码 URL供配网使用。状态持久化示例使用Preferences库保存最后一次的 Lift/Tilt 百分比键为LiftPercent/TiltPercent。断电重启后恢复上次状态无历史状态时默认为 100% 升降全开与 0% 翻转并将恢复后的状态同步给 Matter 控制器。与真实电机对接的改造建议示例目前以模拟方式瞬间完成运动接入真实电机时需关注电机控制在fullOpen()、fullClose()、goToLiftPercentage()、goToTiltPercentage()、stopMotor()中接入实际电机驱动位置反馈使用编码器或限位开关提供位置反馈——Lift 更新currentLift厘米Tilt 更新currentTiltPercent旋转百分比运动完成到达目标后调用setOperationalState(LIFT, STALL)或setOperationalState(TILT, STALL)限位配置使用setInstalledOpenLimitLift()/setInstalledClosedLimitLift()/setInstalledOpenLimitTilt()/setInstalledClosedLimitTilt()定义物理行程范围。串口预期输出配网并控制后串口输出形如Matter Node is not commissioned yet. Initiate the device discovery in your Matter environment. Commission it to your Matter hub with the manual pairing code or QR code Manual pairing code: 34970112332 QR code URL: https://project-chip.github.io/connectedhomeip/qrcode.html?dataMT%3A6FCJ142C00KA0648G00 ... Initial state: Lift100%, Tilt0% Matter Node is commissioned and connected to the network. Ready for use. Window Covering changed: Lift100%, Tilt0% Moving lift to 50% (position: 100 cm) Window Covering changed: Lift50%, Tilt0%智能家居平台接入使用 Matter 兼容的 Hub如 Apple HomePod、Google Nest Hub 或 Amazon Echo即可配网设备配网二维码或手动配对码由串口输出。Apple Home在 iOS 家庭 App 中点 添加配件扫描串口二维码或手动输入配对码。设备会以窗口覆盖/百叶窗形式出现可通过滑块控制升降与翻转Amazon Alexa在 Alexa App 中通过 More Add Device Matter 扫描二维码或输入代码完成设置支持 Alexa, set blinds to 50 percent 等语音指令Google Home在 Google Home App 中通过 设置设备 新设备 Matter 设备完成添加支持滑块与语音控制。常见问题排查配网时设备不可见确认 Wi-Fi 或 Thread 连接配置正确窗帘无响应检查回调函数是否实现正确、电机控制是否工作位置不更新检查是否用正确数值调用了setLiftPercentage()/setTiltPercentage()状态未持久化确认Preferences库已正确初始化且 Flash 未损坏RGB LED 不工作RGB 板需引脚支持 RGB LED 控制非 RGB 板需引脚支持 PWManalogWriteTilt 不工作确认覆盖类型支持 Tilt如BLIND_LIFT_AND_TILT、SHUTTER或BLIND_TILT_ONLY且已在begin()中指定配网失败长按按键恢复出厂设置或在 Arduino IDE 的 Tools 菜单启用 Erase All Flash Before Sketch Upload或使用esptool.py --port PORT erase_flash擦除 Flash无串口输出检查波特率115200与 USB 连接。相关文档与源码索引本文档来源docs/en/matter/ep_window_covering.rst类声明与枚举定义libraries/Matter/src/MatterEndpoints/MatterWindowCovering.h完整实现含属性变化分发与换算逻辑libraries/Matter/src/MatterEndpoints/MatterWindowCovering.cpp可运行示例libraries/Matter/examples/MatterWindowCovering/MatterWindowCovering.ino示例说明与智能家居接入libraries/Matter/examples/MatterWindowCovering/README.mdMatter 总体介绍docs/en/matter/matter.rstMatter 端点基类docs/en/matter/matter_ep.rst其他 Matter 端点文档目录docs/en/matter【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表