跳转到内容

可寻址灯光

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

该显示要求定义一个 API 参考:AddressableLight 组件,例如 Fastled 或 Neopixelbus。

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: 中绘制的一切都将 根据此选项进行旋转。可选值为 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) ),最后一个配置的效果将被 恢复。

在显示启用期间,仍然可以在一定程度上控制父可寻址灯光组件。更改亮度仍然有效,但更改颜色将不起作用。显示启用期间 不建议启用任何效果(例如彩虹、颜色擦除等),因为这将在效果与显示争夺渲染时造成大量闪烁。

可寻址 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_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