可寻址灯光显示屏
addressable_light 显示平台允许在排列成显示点阵的可寻址灯光上显示文本和图形。
该显示屏需要定义一个 API Reference: 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 (可选, 时间):调用 lambda 更新显示屏的间隔。默认为
16ms。 -
pixel_mapper (可选, lambda):一个 lambda,根据提供的
x和y像素坐标返回 LED 的整数地址。默认使用从左到右的直接像素映射器。 -
lambda (可选, lambda):用于在显示屏上渲染内容的 lambda。
it将是 API Reference: 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_32x8_display addressable_light_id: led_matrix_32x8 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