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_temperature 和 outside_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,因为显示屏没有暴露该引脚。
请注意,您的 address 和 model 可能不同,请使用扫描选项查找显示屏的地址。
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_RIGHT或BASELINE_LEFT,这些都定义在 API Reference: display_buffer.h 中。 -
传感器的
has_state()属性很有用,因为从 Home Assistant 获取数据可能需要几秒钟,您可能不想显示NaN。 -
有关更多功能,请参阅渲染引擎 显示渲染引擎(它也可以画线和圆!)
添加基于文本的传感器
Section titled “添加基于文本的传感器”下面是一个示例,将顶部的”时间和温度”替换为 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());