跳转到内容

可寻址灯光显示屏

addressable_light 显示平台允许在排列成显示点阵的可寻址灯光上显示文本和图形。

该显示屏需要定义一个 API Reference: AddressableLight 组件,例如 FastledNeopixelbus

WS2812B 可寻址灯光显示屏
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: 中绘制的所有内容都将被此选项旋转。可选 (默认)、90°180°270°

  • update_interval (可选, 时间):调用 lambda 更新显示屏的间隔。默认为 16ms

  • pixel_mapper (可选, lambda):一个 lambda,根据提供的 xy 像素坐标返回 LED 的整数地址。默认使用从左到右的直接像素映射器。

  • lambda (可选, lambda):用于在显示屏上渲染内容的 lambda。 it 将是 API Reference: DisplayBuffer 的实例。 详见显示渲染引擎

  • id (可选, ID):手动指定用于代码生成的 ID。

NOTE

启用时(默认,也可通过 it.set_enabled(true) 启用),当前在可寻址灯光上运行的任何效果都将被禁用。禁用时(it.set_enabled(false)),将恢复最后配置的效果。

显示屏启用时,仍然可以在有限范围内控制父可寻址灯光组件。更改亮度仍然有效,但更改颜色将不起作用。不建议在显示屏启用时启用任何效果(如彩虹、色彩渐变等),因为这会导致大量闪烁,因为效果会与显示屏竞争渲染。

可寻址 LED 点阵只是以点阵形式排列的可寻址 LED 灯带——路径通常是蛇形上下、左右交替,或者制造商选择的任何方式。与可寻址 LED 灯带一样,点阵上的每个像素都被寻址为相对于第一个像素(0)的偏移量。像素映射器的工作是将逻辑 x-y 像素坐标转换为预期物理 LED 的地址。

确定点阵像素映射器的正确算法希望只需要一些方格纸和一点数学计算。

默认像素映射器假设 LED 点阵从左上角的 LED 开始寻址,向右移动,然后从下一行的最左边开始。

4x4 LED 点阵使用的默认 pixel_mapper

BTF-Lighting 8x32 WS2812B 柔性 LED 点阵

Section titled “BTF-Lighting 8x32 WS2812B 柔性 LED 点阵”

下图说明了常见的 BTF-Lighting 8x32 点阵中可寻址灯带的路径。

BTF-Lighting 8x32 WS2812B 柔性 LED 点阵的 LED 布局

以下是一个包含适用于这些 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:
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:
update_interval: 16ms