可寻址灯光
addressable_light 显示平台允许在排列为显示矩阵的可寻址
灯光上显示文本和图形。
该显示要求定义一个 API 参考:AddressableLight 组件,例如 Fastled 或 Neopixelbus。

display: - platform: addressable_light id: led_matrix_display addressable_light_id: led_matrix_light width: 8 height: 8 rotation: 180° update_interval: 16ms lambda: |- // 绘制一个靶心图案 Color red = Color(0xFF0000); Color green = Color(0x00FF00); Color blue = Color(0x0000FF); it.rectangle(0, 0, 8, 8, red); it.rectangle(1, 1, 6, 6, green); it.rectangle(2, 2, 4, 4, blue); it.rectangle(3, 3, 2, 2, red);-
addressable_light_id (必需, ID): 用作显示的 可寻址灯光组件的 id。
-
width (必需, int): LED 矩阵的像素宽度。
-
height (必需, int): LED 矩阵的像素高度。
-
rotation (可选): 设置显示的旋转角度。你在
lambda:中绘制的一切都将 根据此选项进行旋转。可选值为0°(默认)、90°、180°、270°。 -
update_interval (可选, Time): 调用 lambda 来更新显示的间隔。 默认为
16ms。 -
pixel_mapper (可选, lambda): 一个返回整数地址的 lambda, 给定提供的
x和y像素坐标。默认使用从左到右的直接像素映射器。 -
lambda (可选, lambda): 用于在显示上渲染内容的 lambda。
it将是 API 参考:DisplayBuffer 的实例。 更多信息请参见 显示渲染引擎。 -
id (可选, ID): 手动指定用于代码生成的 ID。
NOTE
启用时(默认值,也可以通过 it.set_enabled(true) 启用),当前在
可寻址灯光上运行的任何效果都将被禁用。禁用时(it.set_enabled(false) ),最后一个配置的效果将被
恢复。
在显示启用期间,仍然可以在一定程度上控制父可寻址灯光组件。更改亮度仍然有效,但更改颜色将不起作用。显示启用期间 不建议启用任何效果(例如彩虹、颜色擦除等),因为这将在效果与显示争夺渲染时造成大量闪烁。
pixel_mapper
Section titled “pixel_mapper”可寻址 LED 矩阵就是将一条可寻址 LED 灯带排列成矩阵 —— 路径通常是上下上下、左右左右蛇形走位, 或者制造商选择的任何方式。与可寻址 LED 灯带一样, 矩阵上的每个像素都作为距第一个像素(0)的偏移量来寻址。像素映射器的任务是 将逻辑 x-y 像素坐标转换为预期物理 LED 的地址。
为你自己的矩阵确定像素映射器的正确算法,通常只需要一些坐标纸和一些数学计算。
默认像素映射器假设 LED 矩阵从左上角 LED 开始寻址,向右移动,然后 从下一行的最左侧行开始。

BTF-Lighting 8x32 WS2812B 柔性 LED 矩阵
Section titled “BTF-Lighting 8x32 WS2812B 柔性 LED 矩阵”以下图像说明了可寻址灯带在常见的 BTF-Lighting 8x32 矩阵中经过的路径。

下面是一个包含适用于这些 8x32 矩阵的 pixel_mapper 的定义。
display: - platform: addressable_light id: led_matrix_32x32_display addressable_light_id: led_matrix_32x16 width: 32 height: 8 pixel_mapper: |- if (x % 2 == 0) { return (x * 8) + y; } return (x * 8) + (7 - y); rotation: 0° update_interval: 16ms可以使用以下定义将两块 8x32 LED 矩阵以 16x32 的配置(一块叠在另一块上)使用:
display: - platform: addressable_light id: led_matrix_32x16_display addressable_light_id: led_matrix_32x16 width: 32 height: 16 pixel_mapper: |- int iMatrixOffset = y >= 8 ? 256 : 0; if (x % 2 == 0) { return (x * 8) + (y % 8) + iMatrixOffset; } return (x * 8) + iMatrixOffset + (7 - (y % 8)); rotation: 0° update_interval: 16ms