找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 2|回覆: 0

    用 ESP32 + 電子紙做家庭資訊看板(超省電,可以掛牆上)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    平板當資訊看板有三個問題:耗電、發光、要充電。

    電子紙(E-Ink)全部解決。



    電子紙的特性


    • 不發光 —— 像紙一樣,靠環境光看
    • 只有更新的瞬間才耗電 —— 顯示內容不耗電
    • 電池可以撐幾個月
    • 更新很慢(一到三秒)
    • 黑白或有限顏色
    • 不能觸控(有些型號可以,但貴很多)


    所以它適合「顯示」不適合「控制」。

    適合放什麼


    • 天氣和溫度
    • 今天的行事曆
    • 垃圾車時間
    • 待辦事項
    • 家裡的狀態摘要
    • 電費用量


    不適合:需要即時更新的東西(例如監視器、正在播的音樂)。

    要買什麼


    • 電子紙模組 —— Waveshare 的最常見。
        2.9 吋(約 400 元)、4.2 吋(約 900 元)、
        7.5 吋(約 1800 元)
    • ESP32 開發板 —— 或者買整合好的(例如 Waveshare 的 ESP32 驅動板)
    • 外框 —— 相框改裝最省事


    尺寸建議


    • 2.9 吋 —— 只能放三四行字,適合單一資訊(例如只顯示溫度)
    • 4.2 吋 —— 我覺得最實用,放得下天氣 + 行事曆
    • 7.5 吋 —— 很有存在感,但貴




    接線(SPI)
    1. 電子紙      ESP32
    2. ------      -----
    3. VCC    →    3.3V
    4. GND    →    GND
    5. DIN    →    GPIO23  (MOSI)
    6. CLK    →    GPIO18  (SCK)
    7. CS     →    GPIO5
    8. DC     →    GPIO17
    9. RST    →    GPIO16
    10. BUSY   →    GPIO4
    複製代碼

    腳位可以改,但 MOSI 和 SCK 最好用預設的硬體 SPI 腳位(比較快)。

    ESPHome 設定
    1. spi:
    2.   clk_pin: GPIO18
    3.   mosi_pin: GPIO23
    4. font:
    5.   - file: "gfonts://Noto+Sans+TC"
    6.     id: font_big
    7.     size: 42
    8.     glyphs: &tc_glyphs
    9.       - "0123456789.:%°/-"
    10.       - "溫度濕度今天明天上午下午"
    11.       - "晴陰雨多雲雷陣時"
    12.       - "星期一二三四五六日"
    13.       - "垃圾車待辦客廳臥室"
    14.   - file: "gfonts://Noto+Sans+TC"
    15.     id: font_mid
    16.     size: 24
    17.     glyphs: *tc_glyphs
    18.   - file: "gfonts://Noto+Sans+TC"
    19.     id: font_small
    20.     size: 16
    21.     glyphs: *tc_glyphs
    22. display:
    23.   - platform: waveshare_epaper
    24.     model: 4.20in
    25.     cs_pin: GPIO5
    26.     dc_pin: GPIO17
    27.     reset_pin: GPIO16
    28.     busy_pin: GPIO4
    29.     update_interval: never      # 我們自己控制什麼時候更新
    30.     id: eink
    31.     lambda: |-
    32.       it.printf(10, 10, id(font_small), "室內");
    33.       it.printf(10, 34, id(font_big), "%.1f°", id(temp_in).state);
    34.       it.printf(10, 90, id(font_small), "濕度 %.0f%%", id(humid_in).state);
    35.       it.line(0, 130, 400, 130);
    36.       it.printf(10, 145, id(font_small), "室外");
    37.       it.printf(10, 168, id(font_mid), "%.0f°  %s",
    38.                 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/ 然後用本地路徑


    本地檔案比較保險,不依賴編譯時能不能連外網。

    控制更新頻率(省電的關鍵)
    1. display:
    2.   - platform: waveshare_epaper
    3.     ...
    4.     update_interval: never
    5. time:
    6.   - platform: homeassistant
    7.     id: ha_time
    8.     on_time:
    9.       # 每 15 分鐘更新一次
    10.       - minutes: /15
    11.         then:
    12.           - component.update: eink
    複製代碼

    為什麼不要更新太頻繁


    • 每次更新耗電(雖然只有一瞬間)
    • 電子紙有「殘影」 —— 更新太多次會越來越淡
    • 更新時畫面會閃黑白幾下,很干擾


    我的設定:15 分鐘一次,深夜不更新。

    接 HA 的資料
    1. sensor:
    2.   - platform: homeassistant
    3.     id: temp_out
    4.     entity_id: sensor.outdoor_temperature
    5.   - platform: homeassistant
    6.     id: temp_in
    7.     entity_id: sensor.living_room_temperature
    8. text_sensor:
    9.   - platform: homeassistant
    10.     id: weather
    11.     entity_id: weather.home
    12.   - platform: homeassistant
    13.     id: next_event
    14.     entity_id: calendar.home
    15.     attribute: message
    複製代碼

    platform: homeassistant 的感測器會即時從 HA 拉資料 ——
    這是 ESPHome 一個很方便的功能。



    六個實務建議

    一、先用序列埠除錯,不要一直燒錄

    排版調整很花時間。接著 USB 線看日誌,
    用 ESP_LOGD 印出你算出來的座標

    二、殘影的處理

    電子紙用久了會有殘影(上一個畫面的淡淡痕跡)。

    解法:定期做一次「完整刷新」
    1.       # 每天凌晨完整刷新一次(會閃幾下但能清掉殘影)
    2.       - hours: 3
    3.         minutes: 0
    4.         then:
    5.           - lambda: 'id(eink).update();'
    複製代碼

    有些型號有專門的 full_update_every 設定:
    1.     full_update_every: 30      # 每 30 次部分更新做一次完整更新
    複製代碼

    三、電池方案

    要真的做到「幾個月不充電」,需要深度睡眠
    1. deep_sleep:
    2.   run_duration: 30s
    3.   sleep_duration: 30min
    4.   id: deep_sleep_1
    複製代碼

    但深度睡眠有代價


    • 醒來要重新連 Wi-Fi(要幾秒)
    • HA 那邊會看到裝置一直上線下線
    • 沒辦法即時 OTA 更新(要等它醒來的那 30 秒)


    我自己是用 USB 供電,因為方便太多。
    真的要電池的話建議接一顆行動電源。

    四、OTA 更新的時機

    用深度睡眠的話,要留一個「不睡」的方式:
    1. binary_sensor:
    2.   - platform: homeassistant
    3.     id: ota_mode
    4.     entity_id: input_boolean.eink_ota_mode
    5. # 在 on_boot 檢查
    6. esphome:
    7.   on_boot:
    8.     - if:
    9.         condition:
    10.           binary_sensor.is_on: ota_mode
    11.         then:
    12.           - deep_sleep.prevent: deep_sleep_1
    13.           - logger.log: "OTA 模式,不進入睡眠"
    複製代碼

    要更新時先在 HA 打開那個開關,等它醒來就不會睡了。

    五、版面設計


    • 字要大 —— 電子紙對比不如螢幕,小字很難看
    • 留白 —— 塞滿反而看不清楚
    • 用線條分區(it.line)
    • 最重要的資訊放最上面、最大


    六、外殼


    • 最省事:買一個相框,挖個洞把電子紙放進去
    • 3D 列印 —— Thingiverse 上有很多現成的模型
    • 壓克力板 + 熱熔膠 —— 最便宜


    實際做出來的感想


    • 最有用的資訊是「垃圾車時間」和「明天會不會下雨」
    • 溫度反而還好(手機上看就好)
    • 掛在玄關最實用 —— 出門前掃一眼
    • 做完之後大概兩個月才想起來要看一下它還活著沒


    最後一點其實是好事 —— 資訊看板就該是這樣,
    不用管它,需要的時候資訊就在那裡。

    ---

    下一篇:紅外線收發 ——
    把老冷氣、老電視接進 HA。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 12:19 , Processed in 0.101400 second(s), 24 queries .

    快速回覆 返回頂部 返回列表