Pular para o conteúdo principal

Cookbook ESPHome: TRMNL 7.5" (OG) Kit DIY

Leia primeiro o guia principal do ESPHome

Esta página é o cookbook ESPHome específico para o Kit DIY TRMNL. O boilerplate compartilhado — escolher um método de gravação, o esqueleto YAML genérico, conexão ao Home Assistant — está em Work with ESPHome. Dê uma olhada nele primeiro se você é novo em ESPHome no ePaper da Seeed. Procurando em vez disso pelo fluxo de trabalho do dashboard em nuvem TRMNL (sem YAML, baseado em plug-ins)? Veja Work with TRMNL.


Introdução ao Home Assistant​

Home Assistant é uma poderosa plataforma de automação residencial de código aberto que permite controlar e monitorar seus dispositivos de casa inteligente a partir de uma interface única e unificada. Ele atua como o hub central da sua casa inteligente, permitindo automatizar rotinas, monitorar sensores e criar um ambiente mais inteligente.

Por que Home Assistant?​

  • Controle local: Diferente de muitas soluções baseadas em nuvem, o Home Assistant roda localmente na sua rede, garantindo que seus dados permaneçam privados e que suas automações funcionem mesmo sem acesso à internet.

  • Amplo suporte a dispositivos: Home Assistant integra-se com milhares de diferentes dispositivos e serviços de casa inteligente, tornando-o altamente versátil e preparado para o futuro.

  • Automação poderosa: Crie regras de automação sofisticadas que podem responder a vários gatilhos, como horário, estados de dispositivos, leituras de sensores e muito mais.

  • Dashboard personalizável: Projete sua própria interface de usuário para exibir as informações que mais importam para você.

Por que o Kit DIY TRMNL 7.5inch(OG) com Home Assistant?​

O Kit DIY TRMNL 7.5inch(OG) é um excelente companheiro para o Home Assistant por vários motivos:

  1. Eficiência energética: O display de e-paper só consome energia ao atualizar o conteúdo, tornando-o perfeito para exibir informações persistentes como previsões do tempo, eventos de calendário ou status do sistema.

  2. Visibilidade clara: Diferente das telas LCD, os displays de e-paper são facilmente legíveis em qualquer condição de iluminação, incluindo luz solar direta, tornando-os ideais para painéis de controle de parede.

  3. Longa duração de bateria: Combinado com o modo de sono profundo, o display pode operar por meses com uma única carga de bateria, ainda fornecendo informações valiosas de relance.

  4. Integração flexível: Através do ESPHome, o display se integra perfeitamente ao Home Assistant, permitindo que você exiba qualquer dado do seu sistema de casa inteligente em um formato elegante e sempre visível.

Essas vantagens tornam o Kit DIY TRMNL 7.5inch(OG) uma escolha ideal para criar um display de informações sempre ligado e energeticamente eficiente para sua configuração de Home Assistant.

Integração com ESPHome​

ESPHome é uma ferramenta de criação de firmware de código aberto projetada especificamente para dispositivos ESP8266/ESP32. Ela permite criar firmware personalizado usando arquivos de configuração YAML simples, que podem então ser gravados no seu dispositivo. Para o Kit DIY TRMNL 7.5inch(OG), o ESPHome atua como o middleware essencial que possibilita a comunicação entre o dispositivo e o Home Assistant.

O sistema funciona convertendo sua configuração YAML em um firmware completo que roda no seu dispositivo ESP. Esse firmware lida com todas as tarefas complexas de conexão à sua rede, comunicação com o Home Assistant e controle do display ePaper. Quando combinado com o Home Assistant, o ESPHome fornece uma plataforma robusta para criar displays e controles sofisticados de automação residencial.

Vamos explorar como configurá-lo e tirar o máximo proveito desse display versátil.

Primeiros Passos​

Antes de o conteúdo do tutorial deste artigo começar, você pode precisar ter o seguinte hardware preparado.

Materiais Necessários​

TRMNL 7.5inch(OG) DIY KitHome Assistant Green

Home Assistant Green é a maneira mais fácil e com maior foco em privacidade de automatizar sua casa. Ele oferece uma configuração simples e permite controlar todos os dispositivos inteligentes com apenas um sistema, onde todos os dados são armazenados localmente por padrão. Esta placa se beneficia do próspero ecossistema do Home Assistant e será aprimorada todos os meses pelo código aberto.

Recomendamos usar o Home Assistant Green como o host do Home Assistant para este tutorial, ou você pode usar qualquer host de Home Assistant com Supervisor.

instalar Home Assistant

Também escrevemos como instalar o Home Assistant para alguns produtos da Seeed Studio, consulte-os.

Se você não estiver usando um produto da Seeed Studio, também pode verificar e aprender como instalar o Home Assistant para outros produtos no site oficial do Home Assistant.

Instalação do Equipamento​

Passo 1. Conectar o Display à Placa Controladora
Alinhe o cabo FPC com o conector na XIAO ePaper Display Board e, em seguida, prenda a trava para garantir uma conexão firme.

dica

O lado metálico do cabo FPC deve ficar voltado para cima, caso contrário, nenhum conteúdo será exibido.

Siga o tutorial de instalação abaixo, muitas pessoas fazem isso de forma incorreta.

Passo 2. Conectar a Bateria
Conecte o cabo da bateria ao conector JST na placa controladora, garantindo a polaridade correta (fio vermelho no +, preto no -).

Passo 3. Montagem do Gabinete (Opcional)

dica

Observe que o cabo flexível da tela é muito frágil. Tenha cuidado ao manuseá-lo. Se ele for danificado, toda a tela deixará de funcionar.

Imprima as peças de gabinete open-source a partir da Resource part e monte os componentes dentro.

Primeiro, monte a placa controladora e a bateria.

Teste o kit TRMNL para ver se está funcionando bem.

Coloque a tela no gabinete e deixe o FPC para fora.

Conecte o cabo de extensão FPC e monte todo o gabinete.

O gabinete em formato de L é muito semelhante.

dica

Se o seu kit TRMNL estiver longe do roteador, você pode mover a antena para fora do gabinete. Isso trará um desempenho melhor.

Passo 1. Instalar ESPHome​

Se você já instalou o ESPHome, pode pular esta etapa.

Vá para Settings -> Add-ons -> ADD-ON STORE

Pesquise por ESPHome e clique nele. Clique em INSTALL e START.

dica

Se você não encontrar o ESPHome na loja de complementos, certifique-se de que está usando uma instalação do Home Assistant que ofereça suporte a complementos (como Home Assistant OS ou instalações supervisionadas). Para outros tipos de instalação (como Home Assistant Container), talvez seja necessário executar o ESPHome Device Builder de forma independente usando Docker. Consulte a documentação oficial do ESPHome para mais detalhes.

Em seguida, o ESPHome Builder aparecerá na barra lateral.

Etapa 2. Adicionar um novo dispositivo​

Vá para o ESPHome e clique em NEW DEVICE.

Dê ao dispositivo um nome de sua preferência e selecione ESP32-S3 para o tipo de chip, depois clique em SKIP.

Depois de criar um novo dispositivo, clique em EDIT.

No código padrão gerado, o framework do esp32 pode ser esp-idf, que precisamos alterar para arduino.

Etapa 3. Instalar o firmware​

Este é um exemplo bem básico e mostrará "Hello World!" no display.

O principal objetivo é mostrar diferentes maneiras de instalar o firmware no dispositivo.

Agora você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

# define font to display words
font:
- file: "gfonts://Inter@700"
id: font1
size: 24

# define SPI interface
spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
it.print(0, 0, id(font1), "Hello World!");

Clique em INSTALL para instalar o código no dispositivo e você verá a imagem a seguir.

dica

Se o seu Home Assistant Host (Raspberry PI/Green/Yellow etc.) estiver longe de você, recomendamos usar este método. Você pode instalar usando o computador que tiver em mãos.

Primeiro, você precisa clicar em Manual download para baixar o firmware compilado.

Abra este site onde faremos o upload do firmware para o painel ePaper.

Volte para o ESPHome para baixar o firmware.

Selecione o formato Factory.

Use um cabo USB para conectar o painel ePaper ao seu computador e clique em CONNECT.

Selecione usbmodemxxx (no Windows é COMxxx) e clique em connect. Encontrou um problema? Clique aqui.

Clique em INSTALL e selecione o firmware que você acabou de baixar.

Aguarde um momento e você verá “Hello world!” no display ~

Usos básicos​

1. Exibir forma​

Este exemplo mostrará uma forma no display.

Você pode copiar o código abaixo e colá-lo na parte de captive_portal, como na imagem a seguir.

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 5min
lambda: |-
it.rectangle(10, 10, 100, 50);
it.rectangle(150, 10, 50, 50);
it.circle(250, 35, 25);

it.filled_rectangle(10, 80, 100, 50);
it.filled_rectangle(150, 80, 50, 50);
it.filled_circle(250, 105, 25);

Quando você vir o retorno como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

Você também pode clicar aqui para ver mais usos.

2. Exibir informações no HA​

Este exemplo mostrará no display as informações do HA.

Antes de tudo, você precisa adicionar este dispositivo ao HA. Caso contrário, você não conseguirá obter as informações do HA.

Se o HA não mostrar o dispositivo, você deve executar primeiro o demo acima. Depois de executar o demo acima, você poderá ver o dispositivo no HA.

Em seguida, clique em SUBMIT e FINISH.

Depois de instalar o ESPHome e adicionar um novo dispositivo, você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

# Define font to show info
font:
- file: "gfonts://Inter@700"
id: myFont
size: 24

# Get info from HA, as string format
text_sensor:
- platform: homeassistant
entity_id: weather.forecast_home
id: myWeather
internal: true
- platform: homeassistant
entity_id: weather.forecast_home
id: myTemperature
attribute: "temperature"
internal: true

# Get info from HA, as float format
sensor:
- platform: homeassistant
entity_id: weather.forecast_home
id: myPressure
attribute: "pressure"
internal: true

# Display info via SPI
spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
//print info in log
ESP_LOGD("epaper", "weather: %s", id(myWeather).state.c_str());
ESP_LOGD("epaper", "temperature: %s", id(myTemperature).state.c_str());
ESP_LOGD("epaper", "pressure: %.1f", id(myPressure).state);
//display info in epaper screen
it.printf(100, 100, id(myFont), "%s", id(myWeather).state.c_str());
it.printf(100, 150, id(myFont), "%s", id(myTemperature).state.c_str());
it.printf(100, 200, id(myFont), "%.1f", id(myPressure).state);

Instale esse código no seu dispositivo.

A função do código é obter clima, temperatura e pressão do HA e exibi-los no display.

dica

Se você perceber que o seu Home Assistant não tem um componente relacionado ao clima, você pode baixar uma integração chamada Open-Meteo dentro das integrações.

Quando você vir um retorno como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

3. Exibir ícone​

Este exemplo irá mostrar um ícone no display.

Primeiro, precisamos instalar um complemento de Editor de Arquivos. Pesquise por Studio Code Server e clique nele. Clique em INSTALL e START.

E então, crie uma nova pasta chamada fonts e baixe este arquivo e coloque-o na pasta fonts.

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

font:
- file: 'fonts/materialdesignicons-webfont.ttf' #here is the directory to save ttf file
id: font_mdi_large
size: 200 # big size icon
glyphs: &mdi-weather-glyphs
- "\U000F0595" # weather cloudy
- "\U000F0592" # weather hail
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_mdi_medium # small size icon
size: 40
glyphs: *mdi-weather-glyphs

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
it.printf(100, 200, id(font_mdi_medium), TextAlign::CENTER, "\U000F0595");
it.printf(400, 200, id(font_mdi_large), TextAlign::CENTER, "\U000F0592");

Quando você vir um retorno como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

Se você quiser usar outros ícones, pode clicar no botão abaixo para explorar mais.

Selecione o ícone que você quiser.

Copie o código e cole-o na parte do captive_portal, como na imagem a seguir.

4. Exibir imagem​

Este exemplo irá mostrar quaisquer imagens que você quiser no display.

Como no exemplo anterior, precisamos instalar o Studio Code Server e criar uma nova pasta chamada image para salvar a imagem.

Em seguida, coloque uma imagem dentro da pasta image. Você pode clicar no botão abaixo para baixar uma imagem e fazer um teste.

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

image:
- file: /config/esphome/image/wifi.jpg # the path where you save the image, png or jpg format
id: myImage
type: BINARY
resize: 800x480 # how big you want to show, the biggest size should be as same as ePaper Penal pixel(800x480)
invert_alpha: true # invert color

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
it.image(0, 0, id(myImage));

Quando você vir um retorno como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

Demo 1. Tirar uma captura de tela do painel do Home Assistant​

Este exemplo irá mostrar a captura de tela do HA no display.

Primeiro, você precisa instalar um complemento de captura de tela, o Puppet, clique aqui para instalar.

Observe que a versão deve ser maior ou igual a 1.11.4. Após a instalação, vá para a página Configuration. Precisamos criar um access_token para este complemento.

Veja o próximo passo para criar um token e colá-lo aqui.

Vá até o final da página Security e crie um token, depois copie e cole-o no add-on Puppet.

Lembre-se de reiniciar o add-on Puppet.

Ao iniciar o add-on, um novo servidor será lançado na porta 10000. Qualquer caminho que você solicitar retornará uma captura de tela dessa página. Você precisará especificar o tamanho da viewport desejado.

Por exemplo, para obter uma captura de tela de 1000px x 1000px do seu dashboard padrão, busque:

# http://192.168.1.191:10000/lovelace/0?viewport=1000x1000(My address)

http://homeassistant.local:10000/lovelace/0?viewport=1000x1000

Para reduzir a paleta de cores para telas E Ink®, você pode adicionar o parâmetro eink. O valor representa o número de cores (incluindo preto) a serem usadas. Por exemplo, para uma tela E Ink® de 2 cores:

http://homeassistant.local:10000/lovelace/0?viewport=1000x1000&eink=2

Se você estiver usando eink=2, também poderá inverter as cores adicionando o parâmetro invert:

http://homeassistant.local:10000/lovelace/0?viewport=1000x1000&eink=2&invert

Além disso, você também pode tirar captura de tela de outra página, por exemplo a página de To-do lists no HA:

http://192.168.1.191:10000/todo?viewport=800x480&eink=2&invert

Você pode ver o efeito da captura de tela inserindo este link no seu navegador.

Copie o código abaixo e cole-o após esp32:

# Enable PSRAM support since online_image requires more than the available RAM capacity
psram:
mode: octal
speed: 80MHz

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

http_request:
verify_ssl: false
timeout: 10s
watchdog_timeout: 15s

online_image:
- id: dashboard_image
format: PNG
type: BINARY
buffer_size: 30000
url: http://192.168.1.191:10000/todo?viewport=800x480&eink=2&invert #change this link to your screenshot link
update_interval: 30s
on_download_finished:
- delay: 0ms
- component.update: main_display

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
id: main_display
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: never
lambda: |-
it.image(0, 0, id(dashboard_image));

Quando você vir um retorno como na imagem a seguir, significa que o código está sendo executado com sucesso.

Demo2. Modo de deep sleep​

dica

Durante o modo de deep sleep, você não pode enviar código para o dispositivo diretamente. Você precisa entrar no modo de download. Clique aqui para pular para Q3.

Este exemplo mostrará como usar o modo de deep sleep para economizar energia. Atualize as informações a cada 6 horas.

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

globals:
- id: sleep_counter
type: int
restore_value: yes # key parameter, to use RTC storage
initial_value: '0'

# Here is deep sleep part
deep_sleep:
id: deep_sleep_1
run_duration: 30s # Device wake up and run 30s (enough to display)
sleep_duration: 3min # deep sleep for 3min

interval:
- interval: 29s # run this command before the end of run_duration
then:
- logger.log: "Entering deep sleep now..."

font:
- file: "gfonts://Inter@700"
id: font1
size: 24

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 3min
lambda: |-
id(sleep_counter) += 1;
ESP_LOGD("main", "Wakeup count: %d", id(sleep_counter));
it.printf(100, 100, id(font1), "Wakeup count: %d", id(sleep_counter));

Você verá um contador. Ele será incrementado em um a cada vez que o dispositivo acordar.

Demo 3. Exemplo abrangente​

dica

Para que você entenda melhor, recomendamos fortemente que execute primeiro os usos básicos acima.

Este exemplo demonstra uma configuração abrangente do ESPHome para o kit DIY de e-paper TRMNL de 7,5 polegadas. O código YAML integra vários recursos para criar um painel de exibição inteligente e interativo que funciona perfeitamente com o Home Assistant.

Objetivo e funcionalidades:

  • A configuração permite que o dispositivo se conecte ao Wi-Fi e ao Home Assistant, oferecendo suporte a atualizações via API e OTA para facilitar o gerenciamento.

  • Ela configura a tela de e-paper para mostrar diferentes tipos de informações em duas páginas comutáveis, controladas por botões físicos.

  • O dispositivo lê a tensão da bateria, calcula a porcentagem da bateria e exibe um ícone e um valor de bateria correspondentes.

  • As condições climáticas e a temperatura são obtidas do Home Assistant e exibidas com ícones e unidades apropriados.

  • A hora e a data atuais também são exibidas, sincronizadas com o Home Assistant.

Este exemplo mostra como combinar leituras de sensores, dados do Home Assistant e entrada do usuário para construir um display inteligente sempre ligado e rico em recursos usando ESPHome e o kit de e-paper TRMNL de 7,5 polegadas.

Clique aqui para visualizar o código completo
esphome:
name: obdy
friendly_name: obdy
on_boot:
priority: 600
then:
- output.turn_on: bsp_battery_enable
- delay: 200ms
- component.update: battery_voltage
- component.update: battery_level

esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino

# Enable PSRAM support since online_image requires more than the available RAM capacity
psram:
mode: octal
speed: 80MHz

# Enable logging
logger:

# Enable Home Assistant API
api:
encryption:
key: "j0V30kuJ6Zdij9SU6Ee+7ruwid+7SQOxtinjld2PRc0="

ota:
- platform: esphome
password: "db786195ae6f9748f5b57ea9bd1d4161"

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Obdy Fallback Hotspot"
password: "IOfapF7hXq55"

captive_portal:

# Deep-sleep, wake by GPIO4
# deep_sleep:
# id: deep_sleep_1
# run_duration: 1min
# sleep_duration: 60min
# wakeup_pin: GPIO4
# wakeup_pin_mode: INVERT_WAKEUP

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

# Fonts
font:
- file: "gfonts://Inter@700"
id: small_font
size: 24
- file: "gfonts://Inter@700"
id: mid_font
size: 36
- file: "gfonts://Inter@700"
id: big_font
size: 180
- file: "gfonts://Inter@700"
id: time_font
size: 96 # for the big time display
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_bat_icon
size: 24
glyphs:
- "\U000F007A" # mdi-battery-10
- "\U000F007B" # mdi-battery-20
- "\U000F007C" # mdi-battery-30
- "\U000F007D" # mdi-battery-40
- "\U000F007E" # mdi-battery-50
- "\U000F007F" # mdi-battery-60
- "\U000F0080" # mdi-battery-70
- "\U000F0081" # mdi-battery-80
- "\U000F0082" # mdi-battery-90
- "\U000F0079" # mdi-battery
- file: "fonts/materialdesignicons-webfont.ttf" # <-- 替换成你的字体文件路径
id: weather_icon_font
size: 100
glyphs:
- "\U000F0599" # weather-sunny
- "\U000F0595" # weather-partly-cloudy
- "\U000F0F2F" # weather-cloudy
- "\U000F0597" # weather-rainy
- "\U000F0598" # weather-snowy
- "\U000F059B" # weather-windy
- "\U000F0594" # weather-fog
- "\U000F0596" # weather-lightning

globals:
- id: page_index
type: int
restore_value: true
initial_value: '0'
- id: battery_glyph
type: std::string
restore_value: no
initial_value: "\"\\U000F0079\"" # default full battery

sensor:
- platform: adc
pin: GPIO1
name: "Battery Voltage"
id: battery_voltage
update_interval: 60s
attenuation: 12db
filters:
- multiply: 2.0
- platform: template
name: "Battery Level"
id: battery_level
unit_of_measurement: "%"
icon: "mdi:battery"
device_class: battery
state_class: measurement
lambda: 'return id(battery_voltage).state;'
update_interval: 60s
on_value:
then:
- lambda: |-
int pct = int(x);
if (pct <= 10) id(battery_glyph) = "\U000F007A";
else if (pct <= 20) id(battery_glyph) = "\U000F007B";
else if (pct <= 30) id(battery_glyph) = "\U000F007C";
else if (pct <= 40) id(battery_glyph) = "\U000F007D";
else if (pct <= 50) id(battery_glyph) = "\U000F007E";
else if (pct <= 60) id(battery_glyph) = "\U000F007F";
else if (pct <= 70) id(battery_glyph) = "\U000F0080";
else if (pct <= 80) id(battery_glyph) = "\U000F0081";
else if (pct <= 90) id(battery_glyph) = "\U000F0082";
else id(battery_glyph) = "\U000F0079";
filters:
- calibrate_linear:
- 4.15 -> 100.0
- 3.96 -> 90.0
- 3.91 -> 80.0
- 3.85 -> 70.0
- 3.80 -> 60.0
- 3.75 -> 50.0
- 3.68 -> 40.0
- 3.58 -> 30.0
- 3.49 -> 20.0
- 3.41 -> 10.0
- 3.30 -> 5.0
- 3.27 -> 0.0
- clamp:
min_value: 0
max_value: 100

output:
- platform: gpio
pin: GPIO6
id: bsp_battery_enable

binary_sensor:
- platform: gpio # Next page KEY1
pin:
number: GPIO2
mode: INPUT_PULLUP
inverted: true
id: key1
name: "Key1"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) + 1) % 2;
id(epaper_display).update();

- platform: gpio # Prev page KEY2
pin:
number: GPIO3
mode: INPUT_PULLUP
inverted: true
id: key2
name: "Key2"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) - 1 + 2) % 2;
id(epaper_display).update();

# - platform: gpio
# pin:
# number: GPIO5 # KEY3
# mode: INPUT_PULLUP
# inverted: true
# id: key2
# name: "Key2"
# on_press:
# then:

# Home Assistant time
time:
- platform: homeassistant
id: ha_time

text_sensor:
- platform: homeassistant
entity_id: weather.home
id: myWeather
- platform: homeassistant
entity_id: weather.home
id: temp
attribute: "temperature"

display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: never
lambda: |-
// ---------- PAGE 0 ----------
if (id(page_index) == 0) {
// Screen dimension constants for easy adjustment
const int scr_w = 800;
const int scr_h = 480;
const int center_x = scr_w / 2; // Center X-coordinate of the screen (400)

// --- Top-right: Battery Info ---
// Display the battery icon using an icon font
it.printf(scr_w - 130, 13, id(font_bat_icon), "%s", id(battery_glyph).c_str());
// Display the battery percentage text
it.printf(scr_w - 100, 10, id(small_font), "%.0f%%", id(battery_level).state);

// --- Draw the vertical separator line ---
// Draw a vertical line in the middle to separate left and right areas
it.filled_rectangle(center_x, 100, 2, 280);

// ==================================================
// LEFT AREA: WEATHER INFO
// ==================================================
// Calculate the center X-coordinate of the left area for alignment
const int left_center_x = center_x / 2; // 200

// 1. Display the title "Weather" at the top of the left area
it.printf(left_center_x, 110, id(mid_font), TextAlign::TOP_CENTER, "Weather");

// 2. Get the weather condition and select the corresponding icon
std::string weather_condition = id(myWeather).state;
std::string weather_icon = "\U000F0599"; // Default icon (sunny), as a fallback for unknown states

if (weather_condition == "partlycloudy") {
weather_icon = "\U000F0595"; // weather-partly-cloudy
} else if (weather_condition == "cloudy") {
weather_icon = "\U000F0F2F"; // weather-cloudy
} else if (weather_condition == "rainy") {
weather_icon = "\U000F0597"; // weather-rainy
} else if (weather_condition == "snowy") {
weather_icon = "\U000F0598"; // weather-snowy
} else if (weather_condition == "windy") {
weather_icon = "\U000F059B"; // weather-windy
} else if (weather_condition == "fog") {
weather_icon = "\U000F0594"; // weather-fog
} else if (weather_condition == "lightning") {
weather_icon = "\U000F0596"; // weather-lightning
}
// Display the weather icon in the center of the left area
it.printf(left_center_x, 240, id(weather_icon_font), TextAlign::CENTER, "%s", weather_icon.c_str());

// 3. Display the weather condition text below the icon
it.printf(left_center_x, 400, id(mid_font), TextAlign::BOTTOM_CENTER, "%s", weather_condition.c_str());


// ==================================================
// RIGHT AREA: TEMPERATURE INFO
// ==================================================
// Calculate the center X-coordinate of the right area for alignment
const int right_center_x = center_x + (center_x / 2); // 600

// 1. Display the title "Temperature" at the top of the right area
it.printf(right_center_x, 110, id(mid_font), TextAlign::TOP_CENTER, "Temperature");

// 3. Display the temperature reading below the icon, with one decimal place
float temp_c = stof(id(temp).state);
double temp_f = temp_c * 9.0 / 5.0 + 32.0;
it.printf(right_center_x, 250, id(mid_font), TextAlign::CENTER, "%.0f°F", temp_f);
it.printf(right_center_x, 380, id(mid_font), TextAlign::CENTER, "%.1f°C", temp_c);
}
// ---------- PAGE 1 ----------
else{
// Battery top-right
it.printf(670, 13, id(font_bat_icon), "%s", id(battery_glyph).c_str());
it.printf(700, 10, id(small_font), "%.0f%%", id(battery_level).state);

auto now = id(ha_time).now();
struct tm timeinfo = now.to_c_tm();

// centering time HH:MM
char timeStr[6];
strftime(timeStr, sizeof(timeStr), "%H:%M", &timeinfo);
it.printf(400, 180, id(time_font), TextAlign::CENTER, timeStr);

// Date: Day of week
const char *weekday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
const char *wday = weekday[timeinfo.tm_wday];

// Date: month - day
char dateStr[12];
strftime(dateStr, sizeof(dateStr), "%b %d", &timeinfo); // e.g. Jun 15

// Day of the week + date below the time
it.printf(400, 280, id(mid_font), TextAlign::CENTER, "%s, %s", wday, dateStr);
}

Quando você vir o feedback como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

FAQ​

P1: Por que não há dados?​

Nesse caso, você deve ir em Settings -> Devices & Services -> Integrations para RECONGFIGURE o dispositivo. Não encontrou seu ePaper Penal? Tente reiniciar o HA.

P2: Por que não consigo obter esses dados no Home Assistant?​

Nesse caso, você deve ir em Settings -> Devices & Services -> Integrations para ADD seu dispositivo ao HA.

P3: Como posso enviar um novo programa quando o dispositivo está em modo de sono profundo?​

Quando o dispositivo está em modo de sono profundo, você não pode enviar um novo programa diretamente.

  1. Primeiro, certifique-se de que o dispositivo está ligado. Em seguida, pressione e segure o botão Boot localizado ao lado da porta USB-C no XIAO ESP32-S3 Plus.

  2. Enquanto mantém pressionado o botão Boot, pressione o botão Reset uma vez e depois solte o botão Boot.

  3. Depois disso, desligue o interruptor da bateria e desconecte o cabo de alimentação.

  4. Por fim, conecte o cabo novamente e envie um novo programa.

P4: O kit TRMNL 7.5inch(OG) DIY não consegue se conectar ao seu computador?​

Tente desconectar e reconectar várias vezes, ou simplesmente instalar o driver de acordo com as instruções.

P5: Falha ao enviar o programa via Wi-Fi?​

Nesse caso, seu ePaper penal está offline ou em modo de sono profundo. Coloque-o online ou acorde-o.

Suporte Técnico & Discussão de Produtos​

Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...