メインコンテンツまでスキップ

ESPHome クックブック: ボタン、ブザー、LED、バッテリー、タッチ & 省電力(reTerminal E シリーズ)

前提条件

このページでは、すでに reTerminal E シリーズ向け ESPHome ディスプレイクックブック(デバイスが Wi-Fi に接続済み、Home Assistant との連携がオンライン、最初のダッシュボードが描画済み)を一通り終えていることを前提とします。プラットフォームレベルの YAML スケルトンと Home Assistant 連携手順については、ESPHome を使う を参照してください。RTC、microSD カード検出、マイクのセットアップについては、ESPHome クックブック: RTC、SD カード & マイク を参照してください。静電容量式タッチ(GT911)はこのページの後半で扱い、reTerminal E1003 のみが対象です。

ブラウザで ESPHome YAML を生成したりデモを書き込んだりする

すべてのピンを手作業で組み立てなくても、すぐに使える ESPHome 設定が欲しいですか?reTerminal E-Series Firmware Hub を開き、ESPHome カードを選択し、デバイス(E1001 / E1002 / E1003 / E1004)を選んでから、必要なオンボード機能 ― ディスプレイ、ボタン、バッテリー、センサー、RTC、SD カード、マイク、タッチ、ディープスリープなど ― にチェックを入れます。Hub は、ESPHome ダッシュボードにコピーまたはダウンロードできる対応する ESPHome YAML を生成します。

同じ Hub から、ブラウザ(デスクトップ版 Chrome または Edge)経由でデモファームウェアを書き込むこともできます。共通の ESPHome ワークフローについては、ESPHome を使う を参照してください。



この記事では、ESPHome ディスプレイクックブック で扱った基礎的な概念を土台として、reTerminal E シリーズ ePaper Display デバイスのオンボード I/O と電源関連の ESPHome 設定について説明します。ESPHome や reTerminal E シリーズを初めて扱う場合は、ここで紹介するハードウェア例を使う前に、まずディスプレイガイドから始めることをおすすめします。

ハードウェア機能

reTerminal E シリーズ ePaper Display には、ESPHome を通じて Home Assistant から活用できる複数のハードウェアコンポーネントが搭載されています。

  • 3 つのプログラマブルボタン(GPIO3、GPIO4、GPIO5)

  • ブザー(GPIO45)

  • バッテリーレベル監視(電圧用 GPIO1、イネーブルピンはモデルごとに異なる)

  • オンボード LED(E1001/E1002 は GPIO6、E1003 は GPIO16、E1004 は GPIO48)

  • 温度・湿度センサー(I²C インターフェース)

  • 静電容量式タッチスクリーン(reTerminal E1003 のみ、GT911)

ここから、これら各コンポーネントを実際の用途でどのように使うかを見ていきます。

対応モデル & ESPHome バージョン

このページの例は E1001 / E1002 / E1003 / E1004 を対象としています。E1003 および E1004 のディスプレイドライバには ESPHome 2026.7.0 以降 を使用してください。

reTerminal E シリーズ ePaper Display ハードウェアコンポーネント制御

ここから、reTerminal E シリーズ ePaper Display 上の各ハードウェアコンポーネントを Home Assistant でどのように使うかを見ていきます。

ボタンと LED

この例では、reTerminal E シリーズ ePaper Display 上の 3 つのボタンを使って機能を制御し、オンボード LED による視覚的フィードバックを提供する方法を示します。

この例を使うには、以下のコードをコピーして、Yaml ファイル内の captive_portal 行の後に貼り付けてください。

オンボード LED のモデル別ピン
  • E1001 / E1002: GPIO6
  • E1003: GPIO16
  • E1004: GPIO48

以下のスニペット内の output ピンを、お使いのデバイスに合わせて更新してください。

# 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

この設定では、次のことを行います。

  • 3 つすべてのボタンをプルアップ抵抗付き入力として設定
  • ボタン 1 を押したときに LED を短く点滅させるように設定
  • ボタン 2 を押したときに LED をダブルブリンクパターンで点滅させるように設定
  • ボタン 3 を押したときに LED のオン/オフをトグルするように設定
  • LED を Home Assistant から制御可能な light エンティティとして利用できるようにする

ブザー制御

reTerminal E シリーズ ePaper Display には GPIO45 に接続されたブザーがあり、音によるフィードバックに利用できます。以下のように設定します。

この例を使うには、以下のコードをコピーして、Yaml ファイル内の captive_portal 行の後に貼り付けてください。

# 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

この設定では、次のことを行います。

  • ブザーを PWM 出力として設定
  • ブザーを制御するための light エンティティを作成
  • ボタン 1 を押したときに短いビープパターンを再生するように設定
ヒント

frequency パラメータを調整することで、ブザーの音程を変更できます。値を大きくすると、より高い音程になります。

バッテリー監視

reTerminal E シリーズ ePaper Display は、GPIO1 のアナログ入力を通じてバッテリーレベルを監視できます。以下のように設定します。

モデル別のバッテリー測定イネーブルピン

バッテリーレベルを測定するには、GPIO1 を読み取る前にバッテリーイネーブル出力をオンにする必要があります。お使いのデバイスに対応するピンを使用してください。

  • 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

この設定では、次のことを行います。

  • ADC を通じてバッテリー電圧を読み取る
  • キャリブレーションカーブを使って電圧をバッテリー残量(パーセンテージ)に変換する
  • Home Assistant で生の電圧値とパーセンテージの両方を利用できるようにします

デモ 2. Home Assistant ダッシュボードをスクリーンショットとして取得する

この例では、Home Assistant ダッシュボードのスクリーンショットを取得し、それを reTerminal E シリーズに表示する方法を説明します。

Puppet アドオンのインストール

ステップ 1. まず、Puppet アドオンをインストールする必要があります。以下のボタンをクリックすると、Home Assistant インスタンス内のアドオンインストールページに直接移動します。

ステップ 2. アドオンページで "INSTALL" ボタンをクリックし、インストールが完了するまで待ちます。

アクセストークンの作成

ステップ 3. インストール後、Puppet アドオンの Configuration ページに移動します。ここでトークンを入力する必要があることがわかります。このアドオン用のアクセストークンを作成する必要があります。

ステップ 4. 左下のユーザー名をクリックして Home Assistant のプロフィール画面に移動し、ページ下部の "Long-Lived Access Tokens" を選択します。

ステップ 5. "Puppet Screenshot" のようなわかりやすい名前で新しいトークンを作成し、生成されたトークンをコピーします。

ステップ 6. Puppet アドオンの設定画面に戻り、"Long-Lived Access Token" フィールドにトークンを貼り付けます。

ステップ 7. 設定を保存し、Puppet アドオンを再起動します。

スクリーンショット API の理解

Puppet アドオンはポート 10000 でサーバーを起動し、任意の Home Assistant ページのスクリーンショットを生成します。使用方法は次のとおりです。

基本的なスクリーンショット URL 形式

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

この URL は、デフォルトのダッシュボードを 800x480 の解像度でキャプチャします(reTerminal E シリーズに最適です)。

電子ペーパー向けの最適化

電子ペーパーディスプレイの場合は、eink パラメータを追加してカラーパレットを減らします。

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

2 は 2 色(白黒)のパレットを表します。

色の反転

黒と白を反転するには、invert パラメータを追加します。

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

別のページをキャプチャする

URL パスを変更することで、任意の Home Assistant ページをキャプチャできます。

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

スクリーンショット用の URL を Web ブラウザに入力してテストします。選択した Home Assistant ページのスクリーンショットが表示されるはずです。

ESPHome の設定

ステップ 11. 次のコードを ESPHome 設定ファイルの 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));
注意

ネットワーク内でローカル DNS 解決が機能しない場合は、homeassistant.local を Home Assistant の実際の IP アドレスに置き換えてください。

設定が正常にアップロードされて実行されると、reTerminal E シリーズ ePaper Display に Home Assistant ダッシュボードのスクリーンショットが表示されます。

デモ 3: ディープスリープモード

ヒント

ディープスリーププログラムを使い始める場合は、右側の白いボタンを優先的に使用し、右側の白いボタンをスリープ解除ボタンとして設定することをお勧めします。こうすることで、プログラムを更新したいときに、デバイスがスリープ中でシリアルポート経由でプログラムをアップロードできないという気まずい状況を避けることができます。

この例では、ディープスリープモードを使用して消費電力を大幅に削減し、reTerminal E シリーズ ePaper Display をバッテリー駆動アプリケーションに適したものにする方法を説明します。

この例は、以下のコードをコピーして Yaml ファイル内の captive_portal コード行の後に貼り付けることで使用できます。

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));

この設定では、次のことを行います:

  • スリープサイクル間で保持されるカウンタを作成する
  • デバイスを 30 秒間ウェイクさせ、その後 3 分間スリープするように設定する
  • 現在のウェイクアップ回数でディスプレイを更新する
  • オプションで、ボタンでデバイスをウェイクアップできるように設定する

実行中は、デバイスがスリープから復帰するたびにカウンタが増加する様子が確認できます:

デモ 4:総合的なサンプル

ヒント

よりよく理解するために、この総合サンプルを試す前に、まず上記の基本サンプルを実行することを強くお勧めします。

この高度なサンプルは、複数の機能を組み合わせて、reTerminal E シリーズ向けの完全なダッシュボードソリューションを構成します。以下を実演します:

  1. 天気と室内環境の表示
  2. アイコン付きのバッテリー監視
  3. 時刻と日付の表示
  4. ボタンによるページ切り替え
  5. バッテリー監視
完全なコードを見るにはここをクリック
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);
}

設定が正常にアップロードされ実行されると、reTerminal E シリーズ ePaper ディスプレイに、環境データ、時刻、バッテリー状態を含む包括的なダッシュボードが表示されます:

包括的なサンプルの理解

このサンプルでは次の機能を実装しています:

  1. 複数ページ:ディスプレイは 2 つのページ(気候ダッシュボードと時刻/日付表示)を切り替えます
  2. ボタンナビゲーション:GPIO3 と GPIO5 上のボタンでページ間を移動します
  3. バッテリー監視:バッテリー残量は、充電レベルに応じて変化する適切なアイコンで表示されます
  4. ハードウェア初期化:起動時に SD カードとバッテリー監視回路を有効化します
  5. 温度と湿度の表示:オンボードの SHT4x センサーを I²C 経由で使用します
  6. 動的アイコン:Material Design Icons がセンサー値に応じて変化します

静電容量式タッチ(reTerminal E1003 のみ)

E1003 only

GT911 静電容量式タッチスクリーンは reTerminal E1003 で利用できます。reTerminal E1001、E1002、E1004 にはこのタッチコントローラは搭載されていないため、これらのモデルでは本セクションをスキップしてください。

reTerminal E1003 は共有 I2C バス上に GT911 タッチコントローラを使用しています。ESPHome では touchscreen コンポーネントを使って it8951 ディスプレイに接続し、タッチイベントをログに記録したり、それに応じて動作させたりします。

配線の概要

機能ピン / バス
タッチ割り込みGPIO2
タッチリセットGPIO48
I2CSDA GPIO19, SCL GPIO20(SHT4x / PCF8563 と共有)

最小限のタッチ設定例

以下を E1003 ディスプレイ設定の後に追加します(display ブロックは id: epaper_display を使用している必要があります)。ESPHome 2026.7.0 以降が必要です。

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"]

期待される動作

  1. it8951 ディスプレイブロックと gt911 タッチスクリーンブロックの両方を含む E1003 用設定を書き込みます。
  2. USB 経由で ESPHome のログを開きます(hardware_uart: UART0 を指定した logger)。
  3. パネルをタップすると、ログに Touch: x=..., y=... の行が表示されるはずです。

on_touch を拡張して、ページ切り替え、ボタンのようなホットスポット、Home Assistant イベントなどのオートメーションを追加できます。タッチ座標が画面に描画した内容と一致するように、E1003 ディスプレイの transform 設定と transform.mirror_x: true を揃えておいてください。

FAQ

Q1: データが表示されないのはなぜですか?

この場合、Settings -> Devices & Services -> Integrations に移動してデバイスを RECONGFIGURE する必要があります。ePaper パネルが見つからない場合は、Home Assistant を再起動してみてください。

Q2: Home Assistant でデータを取得できないのはなぜですか?

この場合、Settings -> Devices & Services -> Integrations に移動して、デバイスを Home Assistant に ADD する必要があります。

Q3: Wi-Fi 経由でのプログラム書き込みが失敗する?

この場合、デバイスがオフラインであるか、ディープスリープモードになっている可能性があります。アップロードを試みる前に、ネットワークに接続されていること、またはスリープモードから復帰していることを確認してください。

Q4: USB 経由でシリアルログが出力されないのはなぜですか?

reTerminal E シリーズは UART0 上に CH340K USB-UART ブリッジを使用しています。YAML では次の logger 設定を維持してください:

logger:
hardware_uart: UART0

技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます。製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートをご用意しています。お好みやニーズに合わせて選べる複数のコミュニケーションチャネルを提供しています。

Loading Comments...