ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

前言

上一篇說明了怎麼使用 I2C 介面的溫溼度感測器與 OLED螢幕,並且將溫溼度資訊顯示在 OLED 上面。在這篇文章中,我們會使用跟上一篇相同的感測器,目標一樣是呈現溫溼度資訊,只是改用電子紙顯示。

材料清單

91 段電子紙簡介

本文使用的電子紙是專門為了顯示溫濕度資訊而設計,也是一款以段落(segment)構成的電子紙。它使用微膠囊電泳顯示器技術,擁有91個顯示段落,能顯示黑白雙色,並且以I2C介面通訊。其顯示效果就如同電子鐘或電子錶,有乾淨簡單的介面,在呈現溫濕度資訊時相當清楚直覺,而且即使在斷電後也可以維持前一次的顯示內容,就算沒在工作也不容易被發現(喂~(´◔ ₃ ◔`)

螢幕最大的顯示範圍可以到199.9 °C/°F,與99.9 %的相對濕度。

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙
將全部段落一起顯示的效果

💡 Tips

關於電子紙的顯示原理,可以參考「ESP32教學系列(九):實戰 SPI ePaper 電子紙模組」的內容。

外觀

我們使用的是帶有驅動板的電子紙模組,驅動板透過FPC連接器與螢幕軟排線連接。在模組的背面兩側各引出了一排排針,這兩排的功能都完全相同,使用時只需要選擇其中一邊連接即可。

通訊部分使用I2C介面,但與一般I2C裝置不同的是還要另外連接BUSY和RESET這兩隻接腳,所以加上電源一共有6根接腳。購買時也會附上一條6 Pin的杜邦排線,方便與麵包板連接或是直接插到開發板做使用。

模組的背面已經設計了電壓轉換電路,因此VCC電源可以連接5V或是3.3V,就算是Arduino UNO這類電壓準位是5V的開發板也可以直接使用。

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

參數與規格

電子紙的大小是 1.9 英寸。將它和 ESP32 開發板對比,提供讀者參考螢幕的比例與尺寸。

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

詳細的參數請參考下表:

模組尺寸51mm × 34 mm
顯示範圍41.35mm × 28.11 mm
工作電壓3.3V / 5V (通訊電壓要跟工作電壓一致)
通訊介面I2C
段落91段
顯示顏色黑、白
局部刷新時間0.3 秒
刷新時間1.5 秒
刷新功耗< 5 mW (typically)
休眠電流< 0.01uA

Address Frame

這片電子紙的通訊方式都與一般的I2C相同,比較需要說明的是它的 I2C Address Frame。Address Frame總共有8 bits,其中的7-bit是電子紙的I2C位址(slave address),第8個bit則是用來表示讀或寫。因此在ESP32傳送指令給電子紙時,addres frame的內容是0x3C,而ESP32在接收電子紙回傳的資料時,address frame是0x3D。

顯示原理

段落電子紙是由固定位置的段落(segment)組成,而每一個段落都只有黑、白兩種狀態,因此我們可以用1bit來表示一個段落的狀態: ”1”代表黑色;”0”代表白色,也就是不顯示。

畫面顯示

電子紙的畫面總共由7個數字和其他符號組成,且一個完整的數字需要用2 Byte表示。將螢幕上的每個數字、小數點與符號都算進去,總共會用到15個Byte來顯示畫面上的資訊。

每個數字或符號都有其對應的資料欄位,所以只要弄清楚數字對應的編碼跟它們所在的資料欄位,就可以顯示出想要的結果了!

數字的編碼

現在我們知道畫面上每個符號的表示方法了,接下來就來看一看如何顯示數字。

一個完整的數字有13個段落,而1個Byte的資料只有8位元,無法儲存13個段落,所以總共需要用到 2個Byte 來儲存,這兩個Byte就是我們在下面的表格中提到的High Byte和 Low Byte。

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙
一個數字共有13個段落 (數字標示僅作為參考)

所有數字都是用2個Byte來表示,其中的特例是溫度欄位的百位數,因為只有5個段落,所以只需要 1 Byte。

段落與位元的關係如下圖所示:

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

那麼這2 Byte的內容要如何表示成電子紙看得懂的格式呢?編碼的方法是High Bytr在前,Low Byte在後。

以顯示數字3為例,(請對照下方圖表)High Byte的內是0xF5,Low Byte的內容是0x1F,所以”3對應”的編碼就是{0xF5, 0x1F}。

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙
ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

所有的數字都是用這種編碼來表示,下表列出了每個數字與其對應的編碼:

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

範例: 顯示 SHT3x上的溫溼度數值

瞭解如何在電子紙上顯示數值後,我們來看看範例吧!這個範例會結合上一篇的SHT3x範例程式,將讀取到的溫濕度數值顯示到電子紙上。

先備條件: 安裝Adafruit SHT31 函式庫

(在上一篇安裝過的讀者,可跳過此步驟 ─=≡Σ((( つ•̀ω•́)つ)

在Arduino IDE的Library Manager中搜尋 Adafruit SHT31,安裝下圖中紅框部分的函式庫。

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙

連接示意圖

我們一樣使用ESP32 I2C在Arduino IDE的預設接腳 :GPIO 21 (SDA) 和 GPIO 22 (SDL)。由於SHT3x模組和電子紙都是使用I2C通訊,因此可以連接到同一個bus上。

ESP32SHT3x91段電子紙
3V3VCCVCC
GNDGNDGND
GPIO 21SDASDA
GPIO 22SCLSCL
GPIO 26BUSY
GPIO 27RST

範例程式碼

這個程式的功能是每5秒感測一次環境的溫溼度,並以180秒為間隔重新刷新一次螢幕。

因檔案較多,請直接到我們的Github Repository下載或查看。(點我

執行效果

ESP32 教學系列(十一):用 ESP32 玩 91 段電子紙
在重新刷新的過程中,螢幕呈現黑白閃爍是正常現象。

小結

在這篇文章中我們對這片電子紙做了詳細的介紹,同時也說明了如何在微雪的91段電子紙顯示溫溼度資訊。實際測試以後,筆者認為這款電子紙在顯示上完全可以取代傳統的液晶顯示器,電子紙在靜止顯示狀態下幾乎不耗任何電量 ,刷新所需的電流也很小,再搭配 ESP32 的 Sleep Mode 就會很適合用在有低功耗需求且需要螢幕顯示的專案。

這片電子紙的另一項優點是,它和常見的溫溼度感測器(例如BME280、HTU21D、SHT31)都是使用I2C通訊界面,所以在硬體連接的部分可以共用相同的接腳,能有效的節省I/O接腳的使用數量,如果您的專案需要顯示溫溼度資訊,不妨可以考慮它哦!d(`・∀・)b