跳转到内容

OLED 显示屏显示时间和温度

在这个示例中,我使用了 SSD1306 OLED 显示屏(I²C) 来显示当前时间和来自 Home Assistant 的两个不同温度值。

ESPHome 支持多种不同类型的显示屏。这里使用的显示屏是 1.3 英寸,128x64 单色像素(SH1106 128x64)。

硬件很简单!只需要四根连接线:

  • VCC - 电源(我的显示屏可以使用 3.3V 或 5V)
  • GND - 地线
  • SDA - 串行数据
  • SCL - 串行时钟

WARNING

如果您使用 5V,请确保您的显示屏支持 5V。

从 Home Assistant 获取时间以同步板载实时时钟。

time:
- platform: homeassistant
id: esptime

接下来,我们想从 Home Assistant 导入一个温度传感器和天气预报

我将它们命名为 inside_temperatureoutside_temperature。稍后您将使用这些引用。

通过向传感器添加 internal: true,它们不会被发布回 Home Assistant。

sensor:
- platform: homeassistant
id: inside_temperature
entity_id: REPLACEME
internal: true
- platform: homeassistant
id: outside_temperature
entity_id: REPLACEME
internal: true
text_sensor:
- platform: homeassistant
id: outside_temperature_unit
entity_id: REPLACEME
attribute: temperature_unit
internal: true
  • 使用 TrueType 字体。如果您曾在微控制器上使用过字体,您会喜欢这个功能!
  • 将字体文件保存在 /config/esphome 文件夹中,即存储 ESPHome 配置的位置。
  • .ttf 后缀必须小写,当然要与您的文件名匹配。
  • 对于小尺寸字体,选择可能有点棘手才能看起来好看。请实验并在下方评论中分享您的发现!
font:
- file: 'slkscr.ttf'
id: small
size: 8
- file: 'BebasNeue-Regular.ttf'
id: medium
size: 48
- file: 'arial.ttf'
id: large
size: 14
  • (可选)您也可以使用 gfonts:// 方案使用 Google 字体,而不是包含字体文件。
  • 字体 文档中了解更多信息。
font:
- file: "gfonts://Silkscreen"
id: small
size: 10
- file: "gfonts://Roboto"
id: large
size: 24
- file: "gfonts://Silkscreen"
id: medium
size: 15

现在设置与显示屏的通信并开始在屏幕上显示实时数据!

我的硬件配置中没有使用 reset_pin,因为显示屏没有暴露该引脚。

请注意,您的 addressmodel 可能不同,请使用扫描选项查找显示屏的地址。

i2c:
sda: GPIOXX
scl: GPIOXX
scan: false
# 手动将频率设置为更高的速率可以避免组件更新时间过长
# frequency: 300kHz
display:
- platform: ssd1306_i2c
model: "SH1106 128x64"
reset_pin: GPIOXX
address: 0x3C
lambda: |-
it.printf(0, 0, id(small), TextAlign::TOP_LEFT, "时间和");
it.printf(0, 12, id(small), TextAlign::TOP_LEFT, "温度");
// 以 HH:MM 格式打印时间
it.strftime(0, 60, id(large), TextAlign::BASELINE_LEFT, "%H:%M", id(esptime).now());
// 打印室内温度(来自 homeassistant 传感器)
if (id(inside_temperature).has_state()) {
it.printf(127, 23, id(medium), TextAlign::TOP_RIGHT , "%.1f", id(inside_temperature).state);
}
// 打印室外温度(来自 homeassistant 天气)
if (id(outside_temperature).has_state()) {
it.printf(127, 60, id(medium), TextAlign::BASELINE_RIGHT , "%.1f%s",
id(outside_temperature).state, id(outside_temperature_unit).state.c_str());
}
  • 文本对齐可以使用不同的参考点,例如 TOP_RIGHTBASELINE_LEFT,这些都定义在 API Reference: display_buffer.h 中。

  • 传感器的 has_state() 属性很有用,因为从 Home Assistant 获取数据可能需要几秒钟,您可能不想显示 NaN

  • 有关更多功能,请参阅渲染引擎 显示渲染引擎(它也可以画线和圆!)

下面是一个示例,将顶部的”时间和温度”替换为 Home Assistant 报警组件的报警状态。

text_sensor:
- platform: homeassistant
entity_id: alarm_control_panel.my_alarm_system
name: "报警状态"
id: alarm_state
display:
- platform: ssd1306_i2c
model: "SH1106 128x64"
reset_pin: GPIOXX
address: 0x3C
lambda: |-
// 在顶部中央打印"报警状态: <状态>"
it.printf(64, 0, id(small), TextAlign::TOP_CENTER, "报警状态: %s", id(alarm_state).state.c_str());