跳转到内容

基于字符的 LCD 显示

lcd_pcf8574 和 lcd_gpio 显示组件允许你在 ESPHome 中使用与 HD44780 兼容的基于字符的 LCD。此组件仅适用于在屏幕上显示单个字符的 LCD (通常是 8-40 列和 2-4 行),而不适用于可以单独控制每个像素的 LCD。

NOTE

显示器存在多个版本,支持不同的字符集:

  • HD44780UA00 英文-日文,包括片假名字符、一些希腊字母和数学符号
  • HD44780UA02 英文-欧洲文,包括希腊文、西里尔文和西欧字符(带一些变音符号)
  • HD44780UBxx 自定义、制造商特定的字符集

也可以添加八个用户定义的字符。

lcd_pcf8574 适用于带有 PCF8574 GPIO 扩展模块连接到所有数据引脚的 LCD 显示器。这样的好处是 你只需要连接到 ESP 两根数据线,而不是像 lcd_gpio 组件 那样的六根或十根。 通信通过 I²C 总线 进行,你需要在配置中有一个 i2c: 部分。

背面附有 PCF8574 板的 LCD 显示
# 示例配置条目
i2c:
sda: D0
scl: D1
display:
- platform: lcd_pcf8574
dimensions: 20x4
address: 0x27
lambda: |-
it.print("Hello World!");
  • dimensions (必需, string): 以 COLUMNSxROWS 格式指定的显示尺寸。如果你不确定, 给显示器上电并数一数即可。

  • address (可选, int): PCF8574 芯片的 I²C 地址,默认为 0x3F。

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

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

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

NOTE

如果你在显示器上什么也看不到,尝试调整 PCF8574 板上的对比度电位器。

此组件的 lcd_gpio 版本直接寻址屏幕,不使用 GPIO 扩展模块。 LCD 的每个数据引脚需要在 ESP 上有专用的 GPIO 引脚。以这种方式连接屏幕提供 更快的刷新,尤其是结合 LCD 菜单 使用时。

LCD 显示 GPIO 引脚定义
# 示例配置条目
display:
- platform: lcd_gpio
dimensions: 20x4
data_pins:
- GPIOXX
- GPIOXX
- GPIOXX
- GPIOXX
enable_pin: GPIOXX
rs_pin: GPIOXX
lambda: |-
it.print("Hello World!");
  • dimensions (必需, string): 以 COLUMNSxROWS 格式指定的显示尺寸。如果你不确定, 给显示器上电,将对比度调到最高,然后数一数。

  • data_pins (必需, pins 列表): 你 连接到 LCD 的数据引脚列表。列表可以有 4 项(以 4 位模式运行, 连接前 4 个或后 4 个数据引脚),或 8 项(连接所有 8 个数据引脚)。

  • enable_pin (必需, pin): 你连接 E(06 )的引脚。

  • rs_pin (必需, pin): 你连接 RS(04 )的引脚。

  • rw_pin (可选, pin): 可选设置你连接 R/W(05 )的引脚。你也可以将该引脚永久连接到 GND。

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

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

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

NOTE

如果你在显示器上什么也看不到,请确保向板的 VEE(03 )对比度控制 引脚施加 3.3V。你可以使用电位器使其可调。

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

对 LCD 显示最基本的操作是将静态文本写入屏幕,如本页面顶部的配置示例所示。

三个方法(print、printf 和 strftime )都在开头 可选地接受列和行参数,可用于在特定位置打印文本。这些参数默认为 0(列)和 0(行),意味着左上角的字符。

display:
- platform: lcd_gpio # 或 lcd_pcf8574
# ...
lambda: |-
// 在左上角打印 0
it.print("0");
// 在第二行第二列打印 1。
it.print(1, 1, "1");
// 写一个传感器值(假设它是 42.1)
it.printf("%.1f", id(my_sensor).state);
// 结果:"42.1"(点将出现在显示"2"的段位上)
// 打印右填充的传感器值,小数点后 0 位
it.printf("Sensor value: %8.0f", id(my_sensor).state);
// 结果:"Sensor value: 42"
// 打印当前时间
it.strftime("It is %H:%M on %d.%m.%Y", id(my_time).now());
// 2018 年 8 月 21 日 10:06 的结果 -> "It is 10:06 on 21.08.2018"
#(可选)用于显示时间:
time:
- platform: homeassistant
id: my_time

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

LCD 显示可以定义最多八个用户定义字符,占用字符 0 到 7,并在 8 到 15 处镜像(即 \x08 可以代替字符串中 可能有问题的 \0)。每个字符有八行五位,第一行在顶部 且最高有效位在左侧,这意味着 0b10000 后面跟六个零和一个 0b00001 定义字符左上角和右下角的点。

display:
- platform: lcd_pcf8574
id: mydisplay
# ...
user_characters:
- position: 0
data:
- 0b00000
- 0b01010
- 0b00000
- 0b00100
- 0b00100
- 0b10001
- 0b01110
- 0b00000
- position: 7
data:
- 0b00000
- 0b01010
- 0b00000
- 0b00100
- 0b00100
- 0b00000
- 0b01110
- 0b10001
lambda: |-
it.print("Hello, world \x08 \x07!");

试试这个 自定义字符生成器 设计你自己的符号。

使用 lcd_pcf8574 时,可以在显示 lambda 定义中通过 it.backlight() 打开背光,通过 it.no_backlight() 关闭背光。 PCF8574 板上的跳线需要闭合才能使背光控制工作。 请记住显示 lambda 在每个 update_interval 都运行,因此如果在那里打开/关闭背光, 则无法从其他部分覆盖。

对于 lcd_gpio,背光通过将 Vcc 施加到 BLA(15 )引脚并将 BLK(16 ) 引脚连接到 GND 来点亮。背光消耗的功率可能超过微控制器输出引脚能提供的功率,因此建议 使用晶体管作为开关来控制背光引脚的电源。

下面是一个典型用例的示例,其中背光在运动传感器触发时打开,并在传感器最后一次触发后 90 秒关闭。

display:
- platform: lcd_pcf8574
id: mydisplay
# ...
binary_sensor:
- platform: gpio
# ...
on_press:
then:
- binary_sensor.template.publish:
id: backlight
state: ON
- binary_sensor.template.publish:
id: backlight
state: OFF
- platform: template
id: backlight
filters:
- delayed_off: 90s
on_press:
then:
- lambda: |-
id(mydisplay).backlight();
on_release:
then:
- lambda: |-
id(mydisplay).no_backlight();