跳转到内容

TM1637 7 段显示

tm1637 显示平台允许你在 ESPHome 中使用流行的 TM1637 7 段显示驱动。

TM1637 7 段显示。

模块可以使用 5V 或 3.3V 供电。要显示冒号标点,请在冒号位置使用 .。(参见下面的时钟示例)

# 示例配置条目
display:
platform: tm1637
id: tm1637_display
clk_pin: D6
dio_pin: D5
inverted: true
length: 4
lambda: |-
it.print("0123");
  • clk_pin (必需, Pin Schema): 你连接 CLK 线的引脚。

  • dio_pin (必需, Pin Schema): 你连接 DIO 线的引脚。

  • intensity (可选, int): TM1637 驱动输出的强度。范围从 0(最弱)到 7(默认值)。

  • inverted (可选, bool): 反转字符渲染到 TM1637,以便你可以物理翻转显示。

  • length (可选, int): 你的 TM1637 驱动的位数。仅在 inverted: true 时使用。 范围从 1 到 6(默认值)。

  • lambda (可选, lambda): 用于在 TM1637 上渲染内容的 lambda。 更多信息请参见 渲染 Lambda。

  • update_interval (可选, Time): 重新绘制屏幕的间隔。默认为 1s。

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

TM1637 LED 显示控制器还包括一个具有键盘扫描接口和增强识别电路(带防干扰按键)的特殊电路。 此电路使用也驱动 LED 显示的 8 段线。但结合 K1 和 K2 引脚,我们可以添加 16 个按键,可在 ESPHome 中用作二进制传感器。

TM1637 显示键盘连接
binary_sensor:
- platform: tm1637
id: key0
name: key1-00
tm1637_id: tm1637_display
key: 0
  • id (可选, ID): 设置此传感器的 ID。

  • name (可选, string): 二进制传感器的名称。

  • tm1637_id (可选, ID): tm1637 的 id,在使用多个设备时用于扫描按键。

  • key (必需, integer): 已连接按键的按键码(Seg0 = 0、Seg1 = 1 等)。范围从 0 到 15。

  • 所有其他选项参见 二进制传感器。

TM1637 与功能齐全的 显示渲染引擎 有类似的 API,但它只是子集,因为 TM1637 7 段显示没有单个像素的概念。在 lambda 中,你收到一个名为 it 的变量, 与其他所有显示一样。不过在这种情况下,it 是 TM1637 实例(参见 API 参考)。

对 TM1637 最基本的操作是将简单的数字写入屏幕,如本页面顶部的配置示例所示。但即使你传入的是一个字符串(这里是 "0123" ),ESPHome 也会将其 转换为 TM1637 能理解的表示:应该打开的确切像素。当然, 并非所有字符都可以表示。你可以在 MAX7219 文档 中看到字符完整列表。

三个方法(print、printf 和 strftime )都在开头 可选地接受一个位置参数,可用于在特定位置打印文本。此参数默认为 0, 意味着第一个 TM1637 的第一个字符。例如,要在 TM1637 末尾 开始文本的第一个字符,你会写 it.print(3, "0");。

还要注意 .(点)字符是特殊的,因为当 ESPHome 在字符串中遇到它时,前一个位置的 点段将被启用。

display:
- platform: tm1637
# ...
lambda: |-
// 在位置 0(左侧)打印 0
it.print("0");
// 结果:"0 "
// 在位置 1(第二个字符)打印 1
it.print(1, "1");
// 结果:"01 "
// 写一个传感器值(假设它是 42.1)
it.printf(0, "%.1f", id(my_sensor).state);
// 结果:"42.1 "(点将出现在"2"段位上)
// 用空白覆盖先前的内容
it.print(" ");
// 打印右填充的传感器值,小数点后 0 位
it.printf("S%3.0f", id(my_sensor).state);
// 结果:"S 42"
// 打印当前时间
it.strftime("%H.%M", id(homeassistant_time).now());
// 10:06:42 的结果 -> 带 : 的显示上为 "10:06",带 . 的显示上为 "10.06"

请参见 格式化文本 了解 printf 格式化规则的介绍,以及 显示时间 了解 strftime 时间格式化的介绍。

以下示例创建了一个典型的数字时钟,冒号 : 每秒闪烁。

time:
- platform: homeassistant
id: homeassistant_time
display:
platform: tm1637
clk_pin: D6
dio_pin: D5
update_interval: 500ms
lambda: |-
static int i = 0;
i++;
if ((i % 2) == 0)
it.strftime("%H.%M", id(homeassistant_time).now());
else
it.strftime("%H%M", id(homeassistant_time).now());

如果你已经有段位掩码,可以使用 set_buffer 将原始字节直接写入显示缓冲区。这 绕过字符转换,适用于自定义字形或动画。

void set_buffer(const uint8_t *data, uint8_t length);
  • data: 指向段字节数组的指针,每位数字一个字节。
  • length: 要写入的字节数(不应超过位数)。

TM1637 每位数字使用一个字节,其中每位映射到一个段位(a–g)。小数点是第 7 位(0x80)。

display:
- platform: tm1637
# ...
lambda: |-
// "0123" 的原始段位,第 3 位有点
static const uint8_t buf[] = {0x3f, 0x06, 0x5b, 0x4f | 0x80};
it.set_buffer(buf, sizeof(buf));

要连接多个 TM1636 显示,你需要与显示数量一样多的控制线。这是通过在显示之间共享 clk 和 dio 的控制线来实现的。

仅 2 条控制线上连接两个 TM1637 显示

当多次使用引脚时,配置必须反映这一点:

display:
- platform: tm1637
id: lcd1
clk_pin:
number: GPIO3
allow_other_uses: true
dio_pin:
number: GPIO4
allow_other_uses: true
- platform: tm1637
id: lcd2
clk_pin:
number: GPIO4
allow_other_uses: true
dio_pin:
number: GPIO3
allow_other_uses: true

当使用超过 2 个设备(如 3 个或更多)时,为 Dio 引脚添加一条控制线,并与下一个显示的 Clk 引脚共享。 最后一个显示的 Dio 引脚与第一个显示的 Clk 引脚共享。

3 条控制线上连接三个 TM1637 显示