Saltar al contenido principal

Recetario ESPHome: Botones, Zumbador, LED, Batería, Tacto y Bajo Consumo (reTerminal E Serie)

Requisitos previos

Esta página asume que ya has seguido el recetario de pantallas ESPHome para reTerminal E Serie (dispositivo en Wi‑Fi, integración con Home Assistant en línea, primer panel de control renderizado). Para el esqueleto de YAML a nivel de plataforma y los pasos de integración con Home Assistant, consulta Trabajar con ESPHome. Para la configuración de RTC, detección de tarjeta microSD y micrófono, consulta Recetario ESPHome: RTC, Tarjeta SD y Micrófono. El panel táctil capacitivo (GT911) se trata más adelante en esta página y se aplica solo a reTerminal E1003.

Generar YAML de ESPHome o flashear demos en el navegador

¿Quieres una configuración ESPHome lista para usar sin tener que montar cada pin a mano? Abre el reTerminal E-Series Firmware Hub, elige la tarjeta ESPHome, selecciona tu dispositivo (E1001 / E1002 / E1003 / E1004) y luego marca las funciones integradas que necesitas: pantalla, botones, batería, sensores, RTC, tarjeta SD, micrófono, tacto, deep sleep y más. El Hub genera un YAML de ESPHome correspondiente que puedes copiar o descargar en tu panel de ESPHome.

El mismo Hub también puede flashear firmware de demostración directamente desde el navegador (Chrome o Edge de escritorio). Para el flujo de trabajo compartido de ESPHome, consulta Trabajar con ESPHome.



Este artículo cubre las configuraciones de ESPHome relacionadas con E/S integradas y energía para tu dispositivo reTerminal E Serie con pantalla de tinta electrónica, basándose en los conceptos fundamentales tratados en nuestro recetario de pantallas ESPHome. Si eres nuevo en ESPHome o en la reTerminal E Serie, te recomendamos empezar con la guía de pantalla antes de usar estos ejemplos de hardware.

Capacidades de hardware

La reTerminal E Serie con pantalla de tinta electrónica incluye varios componentes de hardware que se pueden aprovechar en Home Assistant a través de ESPHome:

  • Tres botones programables (GPIO3, GPIO4, GPIO5)

  • Zumbador (GPIO45)

  • Monitorización del nivel de batería (GPIO1 para voltaje; el pin de habilitación difiere según el modelo)

  • LED integrado (GPIO6 en E1001/E1002, GPIO16 en E1003, GPIO48 en E1004)

  • Sensor de temperatura y humedad (interfaz I²C)

  • Pantalla táctil capacitiva (GT911 solo en reTerminal E1003)

Veamos cómo usar cada uno de estos componentes en aplicaciones prácticas.

Modelos compatibles y versión de ESPHome

Los ejemplos de esta página cubren E1001 / E1002 / E1003 / E1004. Para los controladores de pantalla de E1003 y E1004, usa ESPHome 2026.7.0 o posterior.

Control de componentes de hardware de la reTerminal E Serie con pantalla de tinta electrónica

Veamos cómo usar cada uno de los componentes de hardware de la reTerminal E Serie con pantalla de tinta electrónica en Home Assistant.

Botones y LED

Este ejemplo muestra cómo usar los tres botones de tu reTerminal E Serie con pantalla de tinta electrónica para controlar funciones y proporcionar retroalimentación visual con el LED integrado.

Puedes usar este ejemplo copiando el código de abajo y pegándolo después de la línea de código captive_portal en tu archivo Yaml.

Pin del LED integrado según el modelo
  • E1001 / E1002: GPIO6
  • E1003: GPIO16
  • E1004: GPIO48

Actualiza el pin de output en el fragmento anterior para que coincida con tu dispositivo.

# Button configuration
binary_sensor:
- platform: gpio
pin:
number: GPIO3 # Green button
mode: INPUT_PULLUP
inverted: true
id: button_1
name: "Button 1"
on_press:
then:
- light.turn_on: onboard_led
- delay: 500ms
- light.turn_off: onboard_led

- platform: gpio
pin:
number: GPIO4 # Right white button
mode: INPUT_PULLUP
inverted: true
id: button_2
name: "Button 2"
on_press:
then:
- light.turn_on: onboard_led
- delay: 200ms
- light.turn_off: onboard_led
- delay: 200ms
- light.turn_on: onboard_led
- delay: 200ms
- light.turn_off: onboard_led

- platform: gpio
pin:
number: GPIO5 # Left white button
mode: INPUT_PULLUP
inverted: true
id: button_3
name: "Button 3"
on_press:
then:
- light.toggle: onboard_led

# LED configuration
output:
- platform: gpio
pin: GPIO6
id: led_output
inverted: true

light:
- platform: binary
name: "Onboard LED"
output: led_output
id: onboard_led

Esta configuración:

  • Configura los tres botones como entradas con resistencias pull‑up
  • Configura el Botón 1 para hacer parpadear brevemente el LED
  • Configura el Botón 2 para hacer parpadear el LED con un patrón de doble destello
  • Configura el Botón 3 para conmutar el LED encendido/apagado
  • Hace que el LED esté disponible en Home Assistant como una entidad de luz controlable

Control del zumbador

La reTerminal E Serie con pantalla de tinta electrónica incluye un zumbador en GPIO45 que se puede usar para proporcionar retroalimentación audible. Aquí se muestra cómo configurarlo:

Puedes usar este ejemplo copiando el código de abajo y pegándolo después de la línea de código captive_portal en tu archivo Yaml.

# This component creates a raw PWM (Pulse Width Modulation) output signal.
# For ESP32, the correct platform is 'ledc', which uses the dedicated LED Control hardware peripheral.
output:
- platform: ledc # CORRECTED: 'ledc' is the correct platform for ESP32 PWM.
pin: GPIO45
id: buzzer_pwm
# The frequency determines the pitch of the buzzer's sound. 1000Hz is a mid-range tone.
frequency: 1000Hz

# Create a light entity to provide a user-friendly way to control the buzzer.
# The 'brightness' of the light will control the PWM duty cycle, which effectively changes the buzzer's volume.
light:
- platform: monochromatic
output: buzzer_pwm
name: "Buzzer"
id: buzzer
# Setting transition length to 0s makes the buzzer turn on and off instantly.
default_transition_length: 0s

# This section defines the physical button that will trigger the buzzer.
binary_sensor:
- platform: gpio
pin:
number: GPIO3 # The GPIO pin connected to the green button.
mode: INPUT_PULLUP # Use the internal pull-up resistor.
inverted: true # The signal is low when pressed.
id: button_1
# 'on_press' defines the sequence of actions to execute when the button is pressed.
on_press:
then:
# First beep: turn on at 50% volume (brightness) for 200 milliseconds.
- light.turn_on:
id: buzzer
brightness: 50%
- delay: 200ms
- light.turn_off: buzzer
# Pause for 100 milliseconds between beeps.
- delay: 100ms
# Second beep: turn on at 70% volume for 200 milliseconds.
- light.turn_on:
id: buzzer
brightness: 70%
- delay: 200ms
- light.turn_off: buzzer

Esta configuración:

  • Configura el zumbador como una salida PWM
  • Crea una entidad de luz para controlar el zumbador
  • Configura el Botón 1 para reproducir un patrón de pitido corto cuando se pulsa
tip

Puedes ajustar el parámetro frequency para cambiar el tono del zumbador. Los valores más altos generan tonos más agudos.

Monitorización de la batería

La reTerminal E Serie con pantalla de tinta electrónica puede monitorizar su nivel de batería a través de la entrada analógica en GPIO1. Aquí se muestra cómo configurarlo:

Pin de habilitación de medición de batería según el modelo

Para medir el nivel de batería, debes activar la salida de habilitación de batería antes de leer GPIO1. Usa el pin que coincida con tu dispositivo:

  • E1001 / E1002 / E1004: GPIO21
  • E1003: GPIO40
esphome:
name: reterminal-e10xx
friendly_name: reTerminal_E10xx
on_boot:
priority: 600
then:
- output.turn_on: bsp_battery_enable

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

# Enable logging
logger:

# Enable Home Assistant API
api:
encryption:
key: "REPLACE_WITH_YOUR_API_KEY"

ota:
- platform: esphome
password: "REPLACE_WITH_YOUR_OTA_PASSWORD"

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

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Reterminal-E10Xx"
password: "ChangeMe123"

captive_portal:

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

sensor:
- platform: adc
pin: GPIO1
name: "Battery Voltage"
id: battery_voltage
update_interval: 60s
attenuation: 12db
filters:
- multiply: 2.0 # Voltage divider compensation

- 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: 10s
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

Esta configuración:

  • Lee el voltaje de la batería a través del ADC
  • Convierte el voltaje en un porcentaje de batería usando una curva de calibración
  • Hace que tanto el voltaje bruto como el porcentaje estén disponibles en Home Assistant

Demo 2. Toma el panel de Home Assistant como una captura de pantalla

Este ejemplo muestra cómo capturar capturas de pantalla de tu panel de Home Assistant y mostrarlas en tu reTerminal E Serie.

Instalación del complemento Puppet

Paso 1. Primero, debes instalar el complemento Puppet. Haz clic en el botón de abajo, que te llevará directamente a la página de instalación del complemento en tu instancia de Home Assistant:

Paso 2. En la página del complemento, haz clic en el botón "INSTALL" y espera a que se complete la instalación.

Creación de un token de acceso

Paso 3. Después de la instalación, ve a la página de Configuration del complemento Puppet. Como puedes ver, aquí necesitamos introducir el token. Necesitarás crear un token de acceso para este complemento.

Paso 4. Ve a tu perfil en Home Assistant haciendo clic en tu nombre de usuario en la esquina inferior izquierda y luego selecciona "Long-Lived Access Tokens" en la parte inferior de la página.

Paso 5. Crea un nuevo token con un nombre descriptivo como "Puppet Screenshot" y copia el token generado.

Paso 6. Vuelve a la configuración del complemento Puppet y pega el token en el campo "Long-Lived Access Token".

Paso 7. Guarda la configuración y reinicia el complemento Puppet.

Comprender el Screenshot API

El complemento Puppet inicia un servidor en el puerto 10000 que genera capturas de pantalla de cualquier página de Home Assistant. Aquí se explica cómo usarlo:

Formato básico de la URL de captura de pantalla

http://homeassistant.local:10000/lovelace/0?viewport=800x480

Esta URL capturará una captura de pantalla de tu panel predeterminado a una resolución de 800x480 (perfecta para reTerminal E Serie).

Optimización para E-Paper

Para pantallas de papel electrónico, añade el parámetro eink para reducir la paleta de colores:

http://homeassistant.local:10000/lovelace/0?viewport=800x480&eink=2

El valor 2 representa una paleta de 2 colores (blanco y negro).

Invertir colores

Añade el parámetro invert para invertir blanco y negro:

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

Capturar diferentes páginas

Puedes capturar cualquier página de Home Assistant cambiando la ruta de la URL:

http://homeassistant.local:10000/todo?viewport=800x480&eink=2&invert

Prueba tu URL de captura de pantalla introduciéndola en un navegador web. Deberías ver la captura de pantalla de la página de Home Assistant que hayas seleccionado.

Configuración de ESPHome

Paso 11. Añade el siguiente código a tu configuración de ESPHome después de la sección captive_portal:


……
psram:
mode: octal
speed: 80MHz

……

captive_portal:

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

http_request:
verify_ssl: false
timeout: 20s
watchdog_timeout: 25s

online_image:
- id: dashboard_image
format: PNG
type: GRAYSCALE
buffer_size: 65536
url: http://homeassistant.local:10000/lovelace/0?viewport=800x480&eink=2&invert
update_interval: 1min
on_download_finished:
- component.update: epaper_display

display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2 # You can use 7.50inv2alt when you draw complex info and it display not good.
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: 300s
lambda: |-
it.image(0, 0, id(dashboard_image));
precaución

Sustituye homeassistant.local por la dirección IP real de tu Home Assistant si la resolución DNS local no funciona en tu red.

Cuando tu configuración se haya subido y esté ejecutándose correctamente, tu pantalla de papel electrónico reTerminal E Serie mostrará una captura de pantalla de tu panel de Home Assistant:

Demo 3: Modo de Deep Sleep

tip

Si empiezas a usar el programa de Deep Sleep, te recomendamos que lo uses preferiblemente con el botón blanco del lado derecho y que configures el botón blanco del lado derecho como botón de activación de Sleep. De este modo, cuando quieras actualizar el programa, no te encontrarás con la situación incómoda de que el dispositivo está durmiendo y no puedes subir el programa a través del puerto serie.

Este ejemplo muestra cómo usar el modo de deep sleep para reducir significativamente el consumo de energía, haciendo que tu pantalla de papel electrónico reTerminal E Serie sea adecuada para aplicaciones alimentadas por batería.

Puedes usar este ejemplo copiando el código de abajo y pegándolo después de la línea de código captive_portal en tu archivo Yaml.

globals:
- id: sleep_counter
type: int
restore_value: yes # Use RTC storage to maintain counter during sleep
initial_value: '0'

# Deep sleep configuration
deep_sleep:
id: deep_sleep_1
run_duration: 30s # Device remains awake for 30 seconds
sleep_duration: 5min # Then sleeps for 5 minutes
# Optional: Use a button to wake from sleep
wakeup_pin: GPIO4
wakeup_pin_mode: INVERT_WAKEUP

interval:
- interval: 29s # Schedule sleep just before run_duration ends
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
id: epaper_display
model: 7.50inv2
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: 5min
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));

Esta configuración:

  • Crea un contador que persiste entre ciclos de suspensión
  • Configura el dispositivo para que se active durante 30 segundos y luego duerma durante 3 minutos
  • Actualiza la pantalla con el número actual de activaciones
  • Opcionalmente configura un botón para activar el dispositivo

Cuando se está ejecutando, verás que el contador se incrementa cada vez que el dispositivo se despierta de la suspensión:

Demo 4: Ejemplo integral

tip

Para una mejor comprensión, te recomendamos encarecidamente que ejecutes primero los ejemplos básicos anteriores antes de probar este ejemplo integral.

Este ejemplo avanzado combina múltiples funciones en una solución de panel de control completa para la reTerminal E Serie. Demuestra:

  1. Visualización del clima y del ambiente interior
  2. Monitorización de la batería con iconos
  3. Visualización de la hora y la fecha
  4. Cambio de página usando botones
  5. Monitorización de la batería
Haz clic aquí para ver el código completo
esphome:
name: reterminal_e1001
friendly_name: reTerminal_E1001
on_boot:
priority: 600
then:
- output.turn_on: bsp_sd_enable
- 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 logging
logger:

# Enable Home Assistant API
api:
encryption:
key: "REPLACE_WITH_YOUR_API_KEY"

ota:
- platform: esphome
password: "REPLACE_WITH_YOUR_OTA_PASSWORD"

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

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "reTerminal-E1001"
password: "ChangeMe123"

captive_portal:

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

# SPI / I²C
spi:
clk_pin: GPIO7
mosi_pin: GPIO9
i2c:
scl: GPIO20
sda: GPIO19

# 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_mdi_large
size: 70
glyphs:
- "\U000F050F" # thermometer
- "\U000F058E" # humidity
- 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

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: sht4x
temperature:
name: "Temperature"
id: temp_sensor
humidity:
name: "Relative Humidity"
id: hum_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_led
inverted: true
- platform: gpio
pin: GPIO16
id: bsp_sd_enable
- platform: gpio
pin: GPIO21
id: bsp_battery_enable

# Onboard LED
light:
- platform: binary
name: "Onboard LED"
output: bsp_led
id: onboard_led

binary_sensor:
- platform: gpio # Next page
pin:
number: GPIO3
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
pin:
number: GPIO5
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: GPIO4
# mode: INPUT_PULLUP
# inverted: true
# id: key2
# name: "Key2"
# on_press:
# then:
# - lambda: |-
# id(page_index) = (id(page_index) - 1 + 3) % 3;
# id(epaper_display).update();

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

# e-paper
display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: never
lambda: |-
// ---------- PAGE 0 ----------
if (id(page_index) == 0) {
const int scr_w = 800;
const int scr_h = 480;

// Battery in upper-right corner
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);

//line
it.filled_rectangle(400, 100, 2, 280);

// Convert °C to °F
float temp_f = id(temp_sensor).state * 9.0 / 5.0 + 32.0;

// ---------------------------------------------------------
// Horizontal split: two 400 px columns
const int col_w = scr_w / 2;

const int icon_y = 100; // Icon baseline
const int value_y = 220; // Number baseline
const int unit_y = 300; // Unit baseline
const int label_y = 380; // Text label baseline

const int icon_size = 70; // icon font size
const int val_size = 120; // number font size
const int unit_size = 44; // unit font size
const int label_size= 36; // label font size

// --- Left column : Temperature -----------------------------
const int left_mid = col_w / 2 - 30; // 200 px

// Icon
it.printf(left_mid, icon_y, id(font_mdi_large), TextAlign::CENTER, "\U000F050F");
// Value
it.printf(left_mid, value_y, id(big_font), TextAlign::CENTER, "%.0f", temp_f);
// Unit
it.printf(left_mid + 150, unit_y, id(mid_font), TextAlign::CENTER, "°F");
// Label
it.printf(left_mid, label_y, id(mid_font), TextAlign::CENTER, "Temperature");

// --- Right column : Humidity -------------------------------
const int right_mid = col_w + col_w / 2; // 600 px

// Icon
it.printf(right_mid, icon_y, id(font_mdi_large), TextAlign::CENTER, "\U000F058E");
// Value
it.printf(right_mid, value_y, id(big_font), TextAlign::CENTER, "%.0f", id(hum_sensor).state);
// Unit
it.printf(right_mid + 150, unit_y, id(mid_font), TextAlign::CENTER, "%%");
// Label
it.printf(right_mid, label_y, id(mid_font), TextAlign::CENTER, "Humidity");
}
// ---------- 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);
}

Cuando tu configuración se haya subido y esté ejecutándose correctamente, la pantalla de tinta electrónica reTerminal E Serie mostrará un panel de control completo con datos ambientales, hora y estado de la batería:

Entender el ejemplo completo

Este ejemplo implementa:

  1. Múltiples páginas: La pantalla alterna entre dos páginas: un panel de control climático y una pantalla de hora/fecha
  2. Navegación por botones: Los botones en GPIO3 y GPIO5 se utilizan para navegar entre las páginas
  3. Supervisión de la batería: El nivel de batería se muestra con iconos apropiados que cambian según el nivel de carga
  4. Inicialización de hardware: Las circuiterías de la tarjeta SD y de supervisión de la batería se habilitan al arrancar
  5. Visualización de temperatura y humedad: Usando el sensor SHT4x integrado a través de I²C
  6. Iconos dinámicos: Los iconos de Material Design cambian según los valores de los sensores

Pantalla táctil capacitiva (solo reTerminal E1003)

Solo E1003

La pantalla táctil capacitiva GT911 está disponible en reTerminal E1003. Los reTerminal E1001, E1002 y E1004 no incluyen este controlador táctil, así que omite esta sección en esos modelos.

reTerminal E1003 usa un controlador táctil GT911 en el bus I2C compartido. En ESPHome lo conectas a la pantalla it8951 con el componente touchscreen, y luego registras o actúas sobre los eventos táctiles.

Resumen del cableado

FunciónPin / Bus
Interrupción táctilGPIO2
Reinicio táctilGPIO48
I2CSDA GPIO19, SCL GPIO20 (compartido con SHT4x / PCF8563)

Ejemplo mínimo de táctil

Añade lo siguiente después de la configuración de la pantalla E1003 (el bloque display debe usar id: epaper_display). Requiere ESPHome 2026.7.0 o posterior.

i2c:
scl: GPIO20
sda: GPIO19

touchscreen:
- platform: gt911
id: e1003_touch
display: epaper_display
interrupt_pin: GPIO2
reset_pin: GPIO48
transform:
mirror_x: true
on_touch:
- logger.log:
format: "Touch: x=%d, y=%d"
args: ["touch.x", "touch.y"]

Qué deberías ver

  1. Flashea una configuración E1003 que incluya tanto los bloques de pantalla it8951 como de pantalla táctil gt911.
  2. Abre los registros de ESPHome por USB (logger con hardware_uart: UART0).
  3. Toca el panel: deberías ver líneas Touch: x=..., y=... en el registro.

Puedes ampliar on_touch con automatizaciones como cambios de página, zonas táctiles tipo botón o eventos de Home Assistant. Mantén transform.mirror_x: true alineado con la transformación de la pantalla E1003 para que las coordenadas táctiles coincidan con lo que dibujas en pantalla.

Preguntas frecuentes (FAQ)

P1: ¿Por qué no hay datos?

En este caso, debes ir a Settings -> Devices & Services -> Integrations para RECONGFIGURE el dispositivo. ¿No has encontrado tu panel de ePaper? Intenta reiniciar Home Assistant.

P2: ¿Por qué no puedo obtener esos datos en Home Assistant?

En este caso, debes ir a Settings -> Devices & Services -> Integrations para ADD tu dispositivo a Home Assistant.

P3: ¿Falló la carga del programa por Wi‑Fi?

En este caso, tu dispositivo está desconectado o en modo de suspensión profunda. Asegúrate de que esté conectado a tu red o despiértalo del modo de suspensión antes de intentar cargar.

P4: ¿Por qué no hay registro serie por USB?

La reTerminal E Serie utiliza un puente USB‑a‑UART CH340K en UART0. Mantén este ajuste de logger en tu YAML:

logger:
hardware_uart: UART0

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a distintas preferencias y necesidades.

Loading Comments...