前言
上一篇說明了怎麼使用 I2C 介面的溫溼度感測器與 OLED螢幕,並且將溫溼度資訊顯示在 OLED 上面。在這篇文章中,我們會使用跟上一篇相同的感測器,目標一樣是呈現溫溼度資訊,只是改用電子紙顯示。
材料清單
- ESP32開發板 x1
- Circus SHT3x 溫溼度感測器模組 x1
- 1.9吋 段碼電子墨水螢幕 x1
- micro USB 傳輸線 x1
- 麵包板 x1
- 杜邦線(公-公) x4
91 段電子紙簡介
本文使用的電子紙是專門為了顯示溫濕度資訊而設計,也是一款以段落(segment)構成的電子紙。它使用微膠囊電泳顯示器技術,擁有91個顯示段落,能顯示黑白雙色,並且以I2C介面通訊。其顯示效果就如同電子鐘或電子錶,有乾淨簡單的介面,在呈現溫濕度資訊時相當清楚直覺,而且即使在斷電後也可以維持前一次的顯示內容,就算沒在工作也不容易被發現(喂~(´◔ ₃ ◔`)
螢幕最大的顯示範圍可以到199.9 °C/°F,與99.9 %的相對濕度。
💡 Tips
關於電子紙的顯示原理,可以參考「ESP32教學系列(九):實戰 SPI ePaper 電子紙模組」的內容。
外觀
我們使用的是帶有驅動板的電子紙模組,驅動板透過FPC連接器與螢幕軟排線連接。在模組的背面兩側各引出了一排排針,這兩排的功能都完全相同,使用時只需要選擇其中一邊連接即可。
通訊部分使用I2C介面,但與一般I2C裝置不同的是還要另外連接BUSY和RESET這兩隻接腳,所以加上電源一共有6根接腳。購買時也會附上一條6 Pin的杜邦排線,方便與麵包板連接或是直接插到開發板做使用。
模組的背面已經設計了電壓轉換電路,因此VCC電源可以連接5V或是3.3V,就算是Arduino UNO這類電壓準位是5V的開發板也可以直接使用。
參數與規格
電子紙的大小是 1.9 英寸。將它和 ESP32 開發板對比,提供讀者參考螢幕的比例與尺寸。
詳細的參數請參考下表:
模組尺寸 | 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。
所有數字都是用2個Byte來表示,其中的特例是溫度欄位的百位數,因為只有5個段落,所以只需要 1 Byte。
段落與位元的關係如下圖所示:
那麼這2 Byte的內容要如何表示成電子紙看得懂的格式呢?編碼的方法是High Bytr在前,Low Byte在後。
以顯示數字3為例,(請對照下方圖表)High Byte的內是0xF5,Low Byte的內容是0x1F,所以”3對應”的編碼就是{0xF5, 0x1F}。
所有的數字都是用這種編碼來表示,下表列出了每個數字與其對應的編碼:
範例: 顯示 SHT3x上的溫溼度數值
瞭解如何在電子紙上顯示數值後,我們來看看範例吧!這個範例會結合上一篇的SHT3x範例程式,將讀取到的溫濕度數值顯示到電子紙上。
先備條件: 安裝Adafruit SHT31 函式庫
(在上一篇安裝過的讀者,可跳過此步驟 ─=≡Σ((( つ•̀ω•́)つ)
在Arduino IDE的Library Manager中搜尋 Adafruit SHT31,安裝下圖中紅框部分的函式庫。
連接示意圖
我們一樣使用ESP32 I2C在Arduino IDE的預設接腳 :GPIO 21 (SDA) 和 GPIO 22 (SDL)。由於SHT3x模組和電子紙都是使用I2C通訊,因此可以連接到同一個bus上。
ESP32 | SHT3x | 91段電子紙 |
---|---|---|
3V3 | VCC | VCC |
GND | GND | GND |
GPIO 21 | SDA | SDA |
GPIO 22 | SCL | SCL |
GPIO 26 | – | BUSY |
GPIO 27 | – | RST |
範例程式碼
這個程式的功能是每5秒感測一次環境的溫溼度,並以180秒為間隔重新刷新一次螢幕。
因檔案較多,請直接到我們的Github Repository下載或查看。(點我)
執行效果
小結
在這篇文章中我們對這片電子紙做了詳細的介紹,同時也說明了如何在微雪的91段電子紙顯示溫溼度資訊。實際測試以後,筆者認為這款電子紙在顯示上完全可以取代傳統的液晶顯示器,電子紙在靜止顯示狀態下幾乎不耗任何電量 ,刷新所需的電流也很小,再搭配 ESP32 的 Sleep Mode 就會很適合用在有低功耗需求且需要螢幕顯示的專案。
這片電子紙的另一項優點是,它和常見的溫溼度感測器(例如BME280、HTU21D、SHT31)都是使用I2C通訊界面,所以在硬體連接的部分可以共用相同的接腳,能有效的節省I/O接腳的使用數量,如果您的專案需要顯示溫溼度資訊,不妨可以考慮它哦!d(`・∀・)b