首頁>數碼>

先上一個改進圖:

這個是沒加藍芽和喇叭的樣子。現在已經加了,可以手機瀏覽器控制。

製作要求:顯示公曆日期/農曆日期/天氣/風向/溫度/節日/提醒(螢幕較小,先顯示這麼多)。派加電即可顯示,派正常關機螢幕白 屏(休眠)以保護墨水屏,天氣相關資訊每12小時更新一次。天氣資訊來源於爬取的內容,每天用cron(定時任務)定時爬取,爬取時間在墨水屏重新整理前半個小時。

注意事項:根據某雪官方的說法,目前只有黑白墨水屏支援區域性重新整理,可以做時鐘顯示,其他三色屏是不支援區域性重新整理的。這個2.9寸的屏區域性重新整理是0.2秒,全部重新整理是2秒。而且墨水屏最好24小時要全刷一次,不然會留殘影,嚴重導致螢幕不可修復的損壞,所以我設定是每天全重新整理兩次。原程式程式碼設定,全刷時,螢幕閃兩次黑屏兩次,局刷沒有明顯變化。

改進計劃:

1.顯示不同地區的基本天氣。

2.定製鬧鐘並顯示。

3.紅外感應沒人時螢幕休眠或顯示其他內容。

4.手機控制螢幕顯示不同內容(高階功能)。

5.語音控制顯示內容(高階功能)。

硬體及軟體:

1、2.9inch e-Paper Module(2.9寸墨水屏帶驅動,祼屏不行。)

樹梅派3B(以後想改成zero w貨還沒到,先用這個)

raspbian系統最新版,python3.7,BCM2835, wiringPi,PIL,borax.

製作過程:

硬體連線:(raspbian系統的安裝及操作方法這裡不講,請自行百度)

連線派:(注意vcc是接在3.3V上,而不是5V,我也不知道接到5V上會不會壞,反正我沒敢)

對應引腳

圖片不是3B的不過一樣,對應40腳的圖.

2、開啟派SPI口。

軟體安裝:(raspbian系統的安裝及操作方法這裡不講,請自行百度)相關庫下載及安裝:說明:由於我是在root使用者下操作的,所以下面的命令都沒有加sudo。由於raspbian預設使用者是pi,所以給最後面的工作增加了一點麻煩,不過我還是按我的思路和實現方法來說明,以免造成誤導。

安裝BCM2

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gztar zxvf bcm2835-1.60.tar.gz cd bcm2835-1.60/./configuremakemake checkmake install

安裝wiringpi

apt-get install wiringpi  #對於樹莓派4B可能需要進行升級:cd /tmpwget https://project-downloads.drogon.net/wiringpi-latest.debdpkg -i wiringpi-latest.debgpio -v# 執行gpio -v會出現2.52版本,如果沒有出現說明安裝出錯文

安裝Python函式庫

apt-get update

apt-get install python3-pip

apt-get install python3-pil

apt-get install python3-numpy

pip3 install RPi.GPIO

pip3 install spidev

如果是最新的系統,大部分的python庫都已安裝。

微雪官方測試程式下載:

 clone https://github.com/waveshare/e-Papercd e-Paper/RaspberryPi\&JetsonNano/

執行測試程式:

python3 epd_2in9_text.py

到此就應該可以看以墨水屏有顯示了。基礎工作已做完。

以上內容來自微雪官方網址:http://www.waveshare.net/wiki/2.9inch_e-Paper_Module

2.必須庫下載及安裝

PIL安裝:(PIL是Python一個強大方便的影象處理庫)

pip install Pillow

農曆庫Borax1.3安裝 (Borax是一個的 Python3 開發工具集合庫,不限於顯示農曆)

pip install borax

到此環境已搭建完成,下面是關鍵的程式碼部分。

關鍵程式碼理解及解釋:

def nianyueri():

#年月日星期

time_draw.rectangle((5, 5, 185, 25), fill = 255)

time_draw.text((5, 5), time.strftime('%Y年%m月%d日 %a'), font = font18, fill = 0)

newimage = time_image.crop([5, 5, 185, 25])

time_image.paste(newimage, (5,5))

墨水屏的顯示原理是畫圖,跟其他的顯示裝置不一樣。

在這裡我定義了一個函式,因為後面還要用到這些程式碼,原測試程式裡不是,測試程式碼實現的功能也比較簡單。

time_draw.rectangle((5, 5, 185, 25), fill = 255)

這行是畫一個矩形,(5, 5, 185, 25)顯示是左上角x,y座標,和右下角x,y座標。fill=255是白色填充。還有一個引數outline=’black’我覺得很有用,在佈局的時候可以幫助定位。

time_draw.text((5, 5), time.strftime('%Y年%m月%d日 %a'), font = font18, fill = 0)

在這個框內畫的內容:

time.strftime('%Y年%m月%d日 %a')顯示當前日期及星期,格式為:XXXX年XX月XX日

%a為英文星期的簡寫,如週一顯示:Mon。font=font18為字型大小(font後面解釋)。fill=0為黑色填充。

newimage = time_image.crop([5, 5, 185, 25])這個我沒認真研究,估計要顯示的新內容。

time_image.paste(newimage, (5,5))也沒研究,估計是在(5,5)這個位置顯示newimage內容。

特別說明:顯示內容和佈局是必須要改的,其他不用改,在佈局的時候有幾個關鍵的地方要注意:

1.字型的大小。字型的大小要不斷的試。而且大小直接影響佈局。

我這裡定義了4種字型大小,示例程式只帶了一種字型font.ttc,位置在上一級的pic目錄下其他字型沒安裝也沒試。

2.矩形online引數。加了這個引數後有利於看顯示情況,再進行調整。

3.每設定完一個顯示區域最後再增加一條。epd.display(epd.getbuffer(time_image))對不起,這條也沒懂,getbuffer我看函式說明也沒看懂。必須要加,但不是每一個都加,這個有時間延遲,如果很顯示一個區域都加這個,每個都會延遲1秒左右顯示 ,看起來延好看。但如果加了計數的話,每段程式碼的執行時間就延長,計數時間也就長(原示例程式碼是執行5次退出。)。

4.相關函式:

函式:

nianyueri() #顯示年月日星期

shijian() #顯示時間

nongli() #顯示農曆

tianqi() #顯示天氣

wendu() #顯示溫度

fengxiang() #顯示風向

shidu() #顯示溼度

richeng() #顯示日程(節日等,可自定義)

整個內容分成2大塊,常重新整理的,時間,和其他不常刷的,比如年月日星期/農曆/天氣/溫度。。。時間的重新整理是透過迴圈實現的。其他只要顯示在那就可以了,不重新整理內容不會消失(墨水屏的特點。)。

農曆的顯示:

def nongli():

#農曆位置

today=LunarDate.today()

time_draw.rectangle((195, 5, 295, 25), fill = 255)

time_draw.text((195, 5), today.strftime('農 %M月%D'), font = font18, fill = 0)

newimage = time_image.crop([195, 5, 295, 25])

time_image.paste(newimage, (195,5))

today=LunarDate.today()

這段程式碼必須放在一起,不然農曆過了0點也不會變。

5、必須要提一點:天氣相關資料的顯示。天氣是從天氣網上爬下來的,程式碼是從別人那拿來用的,不是我寫的。網上有很多這樣的程式碼,但多數都不太好用,這個正好符合要求。

寫在最後

本例實現的各個檔案位置:

1、epd_2in9_test.py(主程式)

/root/e-Paper/RaspberryPi\&JetsonNano/python/examples/epd_2in9_test.py

2、天氣爬取程式位置同上。

3、weather.txt檔案。/root/weather.txt因為自動爬取程式生成這個檔案自動放在root目錄,我本來是想放在主程式同目錄的,目前還不知道怎麼改。

這麼個小東西,花了三天時間研究程式碼,填各種坑,玩程式碼真是很辛苦,沒辦法,喜歡。從中也學習和複習了很多東西。

最後上一張多半成品的圖:

14
最新評論
  • 雙11 神舟放大招,11代i7筆電直降1100?
  • 相見恨晚,彩色墨水屏閱讀器引領護眼閱讀,媲美紙質圖書