|
|
平板當資訊看板有三個問題:耗電、發光、要充電。
電子紙(E-Ink)全部解決。

電子紙的特性
- 不發光 —— 像紙一樣,靠環境光看
- 只有更新的瞬間才耗電 —— 顯示內容不耗電
- 電池可以撐幾個月
- 更新很慢(一到三秒)
- 黑白或有限顏色
- 不能觸控(有些型號可以,但貴很多)
所以它適合「顯示」不適合「控制」。
適合放什麼
- 天氣和溫度
- 今天的行事曆
- 垃圾車時間
- 待辦事項
- 家裡的狀態摘要
- 電費用量
不適合:需要即時更新的東西(例如監視器、正在播的音樂)。
要買什麼
- 電子紙模組 —— Waveshare 的最常見。
2.9 吋(約 400 元)、4.2 吋(約 900 元)、
7.5 吋(約 1800 元)
- ESP32 開發板 —— 或者買整合好的(例如 Waveshare 的 ESP32 驅動板)
- 外框 —— 相框改裝最省事
尺寸建議:
- 2.9 吋 —— 只能放三四行字,適合單一資訊(例如只顯示溫度)
- 4.2 吋 —— 我覺得最實用,放得下天氣 + 行事曆
- 7.5 吋 —— 很有存在感,但貴

接線(SPI)
- 電子紙 ESP32
- ------ -----
- VCC → 3.3V
- GND → GND
- DIN → GPIO23 (MOSI)
- CLK → GPIO18 (SCK)
- CS → GPIO5
- DC → GPIO17
- RST → GPIO16
- BUSY → GPIO4
複製代碼
腳位可以改,但 MOSI 和 SCK 最好用預設的硬體 SPI 腳位(比較快)。
ESPHome 設定
- spi:
- clk_pin: GPIO18
- mosi_pin: GPIO23
- font:
- - file: "gfonts://Noto+Sans+TC"
- id: font_big
- size: 42
- glyphs: &tc_glyphs
- - "0123456789.:%°/-"
- - "溫度濕度今天明天上午下午"
- - "晴陰雨多雲雷陣時"
- - "星期一二三四五六日"
- - "垃圾車待辦客廳臥室"
- - file: "gfonts://Noto+Sans+TC"
- id: font_mid
- size: 24
- glyphs: *tc_glyphs
- - file: "gfonts://Noto+Sans+TC"
- id: font_small
- size: 16
- glyphs: *tc_glyphs
- display:
- - platform: waveshare_epaper
- model: 4.20in
- cs_pin: GPIO5
- dc_pin: GPIO17
- reset_pin: GPIO16
- busy_pin: GPIO4
- update_interval: never # 我們自己控制什麼時候更新
- id: eink
- lambda: |-
- it.printf(10, 10, id(font_small), "室內");
- it.printf(10, 34, id(font_big), "%.1f°", id(temp_in).state);
- it.printf(10, 90, id(font_small), "濕度 %.0f%%", id(humid_in).state);
- it.line(0, 130, 400, 130);
- it.printf(10, 145, id(font_small), "室外");
- it.printf(10, 168, id(font_mid), "%.0f° %s",
- id(temp_out).state, id(weather).state.c_str());
複製代碼

中文字體是最大的坑
電子紙要顯示中文,必須把用到的字「嵌進韌體」。
- 中文有幾萬個字,全部嵌進去韌體會爆掉
- 所以要用 glyphs 列出你實際會用到的字
glyphs 怎麼列:
- 把你顯示器上會出現的所有中文字列出來
- 數字、符號、單位也要列(0-9、.、:、%、°)
- 不要重複(重複也沒關係,只是浪費)
用 YAML 錨點共用(上面範例的 &tc_glyphs 和 *tc_glyphs)
可以讓三個字體大小共用同一份字集。
忘記列某個字的話,那個位置會是空白或方塊。
字體來源:
- gfonts://Noto+Sans+TC —— 直接從 Google Fonts 下載(要能上網)
- 或者下載 .ttf 放到 /config/esphome/fonts/ 然後用本地路徑
本地檔案比較保險,不依賴編譯時能不能連外網。
控制更新頻率(省電的關鍵)
- display:
- - platform: waveshare_epaper
- ...
- update_interval: never
- time:
- - platform: homeassistant
- id: ha_time
- on_time:
- # 每 15 分鐘更新一次
- - minutes: /15
- then:
- - component.update: eink
複製代碼
為什麼不要更新太頻繁:
- 每次更新耗電(雖然只有一瞬間)
- 電子紙有「殘影」 —— 更新太多次會越來越淡
- 更新時畫面會閃黑白幾下,很干擾
我的設定:15 分鐘一次,深夜不更新。
接 HA 的資料
- sensor:
- - platform: homeassistant
- id: temp_out
- entity_id: sensor.outdoor_temperature
- - platform: homeassistant
- id: temp_in
- entity_id: sensor.living_room_temperature
- text_sensor:
- - platform: homeassistant
- id: weather
- entity_id: weather.home
- - platform: homeassistant
- id: next_event
- entity_id: calendar.home
- attribute: message
複製代碼
platform: homeassistant 的感測器會即時從 HA 拉資料 ——
這是 ESPHome 一個很方便的功能。

六個實務建議
一、先用序列埠除錯,不要一直燒錄
排版調整很花時間。接著 USB 線看日誌,
用 ESP_LOGD 印出你算出來的座標。
二、殘影的處理
電子紙用久了會有殘影(上一個畫面的淡淡痕跡)。
解法:定期做一次「完整刷新」
- # 每天凌晨完整刷新一次(會閃幾下但能清掉殘影)
- - hours: 3
- minutes: 0
- then:
- - lambda: 'id(eink).update();'
複製代碼
有些型號有專門的 full_update_every 設定:
- full_update_every: 30 # 每 30 次部分更新做一次完整更新
複製代碼
三、電池方案
要真的做到「幾個月不充電」,需要深度睡眠:
- deep_sleep:
- run_duration: 30s
- sleep_duration: 30min
- id: deep_sleep_1
複製代碼
但深度睡眠有代價:
- 醒來要重新連 Wi-Fi(要幾秒)
- HA 那邊會看到裝置一直上線下線
- 沒辦法即時 OTA 更新(要等它醒來的那 30 秒)
我自己是用 USB 供電,因為方便太多。
真的要電池的話建議接一顆行動電源。
四、OTA 更新的時機
用深度睡眠的話,要留一個「不睡」的方式:
- binary_sensor:
- - platform: homeassistant
- id: ota_mode
- entity_id: input_boolean.eink_ota_mode
- # 在 on_boot 檢查
- esphome:
- on_boot:
- - if:
- condition:
- binary_sensor.is_on: ota_mode
- then:
- - deep_sleep.prevent: deep_sleep_1
- - logger.log: "OTA 模式,不進入睡眠"
複製代碼
要更新時先在 HA 打開那個開關,等它醒來就不會睡了。
五、版面設計
- 字要大 —— 電子紙對比不如螢幕,小字很難看
- 留白 —— 塞滿反而看不清楚
- 用線條分區(it.line)
- 最重要的資訊放最上面、最大
六、外殼
- 最省事:買一個相框,挖個洞把電子紙放進去
- 3D 列印 —— Thingiverse 上有很多現成的模型
- 壓克力板 + 熱熔膠 —— 最便宜
實際做出來的感想
- 最有用的資訊是「垃圾車時間」和「明天會不會下雨」
- 溫度反而還好(手機上看就好)
- 掛在玄關最實用 —— 出門前掃一眼
- 做完之後大概兩個月才想起來要看一下它還活著沒
最後一點其實是好事 —— 資訊看板就該是這樣,
不用管它,需要的時候資訊就在那裡。
---
下一篇:紅外線收發 ——
把老冷氣、老電視接進 HA。 |
|