先上一個改進圖:
這個是沒加藍芽和喇叭的樣子。現在已經加了,可以手機瀏覽器控制。
製作要求:顯示公曆日期/農曆日期/天氣/風向/溫度/節日/提醒(螢幕較小,先顯示這麼多)。派加電即可顯示,派正常關機螢幕白 屏(休眠)以保護墨水屏,天氣相關資訊每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目錄,我本來是想放在主程式同目錄的,目前還不知道怎麼改。
這麼個小東西,花了三天時間研究程式碼,填各種坑,玩程式碼真是很辛苦,沒辦法,喜歡。從中也學習和複習了很多東西。
最後上一張多半成品的圖: