最近看到什麼番茄時鐘管理法,看10分鐘英文單字休息25分鐘,結果感到自己廢到點開app都嫌麻煩,於是做了這個番茄鐘計時器,最近迷上e-ink的顯示效果,買了一塊e-paper螢幕試試
結果這螢幕毛特多,沒有中文字庫,arduino記憶體三不五時就炸,搞了整整一個禮拜終於有這個效果Orz
當初想自己做番茄鐘時,很明確地想法就是用e-ink螢幕來達成,不想使用會發光的OLED螢幕或是LCD螢幕
也是再三確認能否用arduino達成,確認可行之後才開始買材料動手做
這篇文章會講以下幾點
- 選擇電子紙螢幕的注意事項
- Arduino不同開發板的SPI腳位接法
- 在Arduino上顯示中文字體並壓縮空間的方式
我使用的這塊螢幕是微雪電子2.9吋黑白兩色電子紙螢幕
他們有出其他尺寸以及多了紅色或是黃色的三色電子紙
使用Waveshare e-paper e-ink等關鍵字,可以在網路上找到一些別人分享使用樹莓派Raspberry Pi或是Arduino的相關作品
但要注意的是Arduino的儲存空間極小,若不使用記憶卡,便無法存入較大面積的圖像,一次能畫面更新的範圍也會被記憶體所限制,使用上比較麻煩
使用樹莓派會是比較方便的選擇,空間足夠之外,廠商也有出使用樹莓派GPIO插槽的HAT版電子紙,直接插上去,執行程式就可以顯示,遇到的問題會少很多
(不過本人就是覺得一個小小的時鐘要用樹莓派來做豈不是殺雞用牛刀之後,也是再三確認Arduino能否好好控制2.9吋電子紙才下手)
要做時鐘便可能有每秒更新畫面的需求,在網路上賣的樹莓派Raspberry Pi或是Arduino用電子紙大部分更新畫面至少要花費兩秒
而且這是黑白兩色的更新時間,如果是三色電子紙更新畫面可能會花到三倍以上的時間,隨款式不同而更新速度不同
很明顯的,三色電子紙沒辦法做太即時的畫面更新
而且這些款式是無法調濃淡沒有灰階,黑白兩個顏色就只有兩個顏色,無法顯示灰色這種中間色
若要像電子紙閱讀器那樣反應速度更快,對比度豐富的螢幕價格更高,會導致製作成本高許多
在微雪的官方產品表格中,只有部分黑白兩色電子紙產品支援局部刷新功能,使進行小區域畫面更新所花費的時間只需約0.3秒
要想達到時鐘每秒更新畫面的需求,就需要使用局部刷新功能,針對秒數顯示區域進行更新才能達到
也請注意購買時,不要買到沒有微雪控制器(電子紙後方藍色部分)的裸板,沒有控制器我們的arduino就無法接上螢幕,也無法控制螢幕
微雪有提供新舊兩種範例程式,分別對應新舊兩種控制器,唯一的差異就是出貨時間不同
賣家也不一定知道自己賣的是哪一版,唯一的辦法就是都執行看看
弔詭的事,我在微雪的網站上找的三種電子紙函式庫相異的arduino範例程式
在微雪電子提供的2.9吋電子紙螢幕範例程式中,已經提供了控制微雪控制器的liberay,建議將liberay資料夾下的檔案移動至demo資料夾中後,點擊epd2in9-demo.ino打開Arduino IDE看程式碼如何操作控制器,使畫面顯示到電子紙上面
其中 epdif.h這個檔案告訴我們是設定用哪一些arduino腳位連結至電子紙,這四個腳位是可以自己設定的,官方影片上有說DIN腳位要接UNO板的D11,CLK腳位要接UNO板的D13,這兩個腳位是模組要走SPI協定必要腳位,其中D11是UNO的SPI協定MOSI腳,D13是UNO的SPI協定SCK腳,MOSI腳跟SCK腳是不能自訂更改的,換到arduino micro板上就是改接MOSI腳跟SCK腳
所以使用
排插標示 | UNO板接腳 | micro板接腳 |
---|---|---|
3.3v | 3.3v | 3.3v |
GND | GND | GND |
DIN | D11 | MOSI |
CLK | D13 | SCK |
CS | D10 | SS |
DC | D9 | D9 |
RST | D8 | D8 |
// Pin definition
#define RST_PIN 8 //D8腳位
#define DC_PIN 9 //D9腳位
#define CS_PIN 10 //D10腳位
#define BUSY_PIN 7 //D7腳位
這個範例程式是確定可以在我的電子紙上顯示的版本
程式中有說明微雪控制器中有兩個儲存區塊,畫面變更是把變更的資料儲存在其中一個區塊中後,由控制器把該區塊的資料顯示在電子紙上面
每次變更都是兩個區塊交替使用,奇數次變更使用A區塊,偶數次變更至B區塊,然而我們不能控制微雪控制器每一次的變更要使用哪個區塊
所以範例程式中Setup時是連續兩次清除與顯示的動作,來確保不會顯示出舊的資料
epd.ClearFrameMemory(0xFF); // 清除儲存區塊中的資料
epd.DisplayFrame(); // 顯示
epd.ClearFrameMemory(0xFF); // 清除儲存區塊中的資料
epd.DisplayFrame(); // 顯示
兩個區塊的好處在於,當靜態展示時,兩張圖片需要交替顯示的話,寫入儲存空間後,靠執行顯示來交替展示,而不用再做寫入的動作,例如:
//~~~省略宣告部分
void setup(){
epd.SetFrameMemory(IMAGE_DATA1);//寫入圖片一
epd.DisplayFrame();
epd.SetFrameMemory(IMAGE_DATA2);//寫入圖片二
epd.DisplayFrame();
}
void loop(){
epd.DisplayFrame();
delay(2000);
}
不過若電子紙要顯示的資料會隨時間動態變更的話,建議連續更新兩次,確保兩個區塊中都有新的資料,避免使用局部更新時出現意想不到的事
程式碼請看GitHub