
圓周率日🔗 en.wikipedia.org(Pi Day)(3 月 14 日) 來了又走,留下美好的回憶以及許多樹莓派項目🔗 opensource.com等待我們去嘗試。在任何令人精神振奮、充滿歡樂的假期後回到工作中都很難,圓周率日也不例外。當我們回望三月的時候,渴望那些天的快樂。但是不用害怕,親愛的圓周率日慶祝者們,我們開始下一個節日的漫長倒計時!
好了,嚴肅點。我做了一個圓周率日倒計時器,你也可以!
不久前,我購買了一個樹莓派 Zero W🔗 www.raspberrypi.org,並且用它來解決 WiFi 信號較差的原因🔗 opensource.com。我也對使用電子紙(ePaper)來作為它的顯示屏十分感興趣。雖然我不知道該用它來幹什麼,但是!它看起來真的很有趣!我買了一個十分適合放在樹莓派的頂部的 2.13 英寸的WaveShare 顯示器🔗 www.waveshare.com。安裝很簡單:只需要將顯示器接到樹莓派的 GPIO 上即可。
我使用樹莓派操作系統🔗 www.raspberrypi.org來實現該項目,雖然其他的操作系統肯定也能完成。但是下面的raspi-config命令在樹莓派系統上很容易使用。

設置樹莓派和電子紙顯示屏
設置樹莓派和電子紙顯示屏一起工作,需要你在樹莓派軟件中啟用串行外設接口(SPI),安裝 BCM2835 C 庫(來訪問樹莓派上的博通 BCM 2835 芯片的 GPIO 功能),安裝 Python GPIO 庫來控制電子紙顯示屏。最後,你需要安裝 WaveShare 的庫來使用 Python 控制這個 2.13 英寸的顯示屏。
下面是完成這些的步驟。

啟用 SPI
樹莓派上啟用 SPI 最簡單的方式是使用raspi-config命令。SPI 總線允許與設備進行串行數據通信——在本例中,電子紙顯示:
從彈出的菜單中, 選擇 「接口選項(Interfacing Options)-> SPI ->是(Yes)」 來啟用 SPI 接口,然後啟動。

安裝 BCM2835 庫
如上所述,BCM2835 庫是用於樹莓派博通 BCM2385 芯片的軟件,它允許訪問 GPIO 引腳來控制設備。
在我寫這篇文章之時,用於樹莓派的最新博通 BCM2385 庫版本是 v1.68 。安裝此庫需要下載軟件壓縮包然後使用make來安裝:

安裝需要的 Python 庫
你用 Python 控制電子紙顯示屏需要安裝 Python 庫RPi.GPIO,還需要使用python3-pil包來畫圖。顯然,PIL 包已經不行了,但 Pillow 可以作為代替方案。我還沒有為該項目測試過 Pillow ,但它可行:
注意:這些是 Python3 的指令。你可以在 WaveShare 網站查到 Python2 的指令。

下載 WaveShare 示例和 Python 庫
Waveshare 維護了一個 Python 和 C 的 Git 庫,用於使用其電子紙顯示屏和一些展示如何使用它們的示例。對這個倒計時時鐘而言,你需要克隆這個庫並使用用於 2.13 英寸顯示屏的庫:
如果你用不同的顯示器或者其他公司產品,需要使用適配軟件。
Waveshare 提供了很多指導:

獲得有趣的字體(選做)
你可以隨心所欲的使用顯示器,為什麼不搞點花樣?找一個炫酷的字體!
這有大量開放字體許可🔗 scripts.sil.org的字體可供選擇。我十分喜愛 Bangers 字體。如果你看過 YouTube 那你見過這種字體了,它十分流行。你可以下載到本地的共享字體目錄文件中,並且所有的應用都可以使用,包括這個項目:

創建一個圓周率日倒計時器
現在你已經安裝好了軟件,可以使用帶有炫酷字體的電子紙顯示屏了。你可以創建一個有趣的項目:倒計時到下一個圓周率日!
如果你想,你可以從該項目的GitHub 倉庫🔗 github.com直接下載countdown.py🔗 github.com這個 Python 文件並跳到文章結尾。
為了滿足大家的好奇心,我將逐步講解。

導入一些庫
開始先導入一些標準庫之後腳本中用。也需要你從 PIL 添加Image、ImageDraw和ImageFont,你會用到這些來畫一些簡單的圖形。最後,為本地lib目錄設置一些變量,該目錄包含了用於 2.13 英寸顯示屏的 Waveshare Python 庫,稍後你可以使用這些變量從本地目錄加載庫。

字體大小輔助函數
下一部分是為你選擇的 Bangers-Regular.ttf 字體建立一個修改大小的輔助函數。該函數將整型變量作為大小參數,並返回一個圖形字體對象來用於顯示:

倒計時邏輯
接下來是計算這個項目的一個函數:距下次圓周率日還有多久。如果是在一月,那麼計算剩餘天數將很簡單。但是你需要考慮是否今年的圓周率日是否已經過去了(允悲)。如果是的話,那麼計算在你可以再次慶祝之前還有多少天:

主函數
最後,到了主函數,需要初始化顯示屏並向它寫數據。這時,你應該寫一個歡迎語然後再開始倒計時。但是首先,你需要加載 Waveshare 庫:
上面的代碼片段檢查以確保該庫已下載到倒計時腳本旁邊的目錄中,然後加載epd2in13_V2庫。如果你使用不同的顯示屏,則需要使用不同的庫。如果你願意,也可以自己編寫。我發現閱讀 Waveshare 隨顯示屏提供的 Python 代碼很有趣,它比我想象的要簡單得多。
下一段代碼創建一個 EPD(電子紙顯示屏)對象以與顯示器交互並初始化硬件:
關於電子紙的一個有趣之處:它僅在將像素從白色變為黑色或從黑色變為白色時才耗電。這意味着當設備斷電或應用程序因任何原因停止時,屏幕上的任何內容都會保留下來。從功耗的角度來看,這很好,但這也意味着你需要在啟動時清除顯示,否則你的腳本只會覆蓋屏幕上已有的內容。因此,epd.Clear(0xFF)用於在腳本啟動時清除顯示。
接下來,創建一個「畫布」來繪製剩餘的顯示輸出:
這與顯示器的寬度和高度相匹配——但它有點反直覺,因為顯示器的短邊是寬度。我認為長邊是寬度,所以這只是需要注意的一點。請注意,epd.height和epd.width由 Waveshare 庫設置以對應於你使用的設備。

歡迎語
接下來,你將開始畫一些畫。這涉及在你之前創建的「畫布」對象上設置數據。這還沒有將它繪製到電子紙顯示屏上——你現在只是在構建你想要的圖像。由你為這個項目繪製帶有一塊餡餅的圖像,來創建一個慶祝圓周率日的歡迎信息:
畫一塊餡餅
很可愛,不是嗎?
最後,真是是最後了,你可以展示你畫的圖畫:
上面那段話更新了顯示屏,以顯示你所畫的圖像。
接下來,準備另一幅圖像展示你的倒計時:

圓周率日倒計時
首先,創建一個用來展示倒計時的圖像對象。也需要設置數字的字體大小:
為了使它顯示的時候更像一個倒計時,更新圖像的一部分是更加有效的手段,僅更改已經改變的顯示數據部分。下面的代碼準備以這樣方式運行:
最後,需要計時,開始一個無限循環來檢查據下次圓周率日還有多久,並顯示在電子紙上。如果到了圓周率日,你可以輸出一些慶祝短語:
腳本最後做了一些錯誤處理,包括捕獲鍵盤中斷,這樣你可以使用Ctrl + C來結束無限循環,以及一個根據計數來打印day或days的函數:
現在你已經擁有一個倒計時並顯示剩餘天數的腳本!

安裝 systemd 服務(選做)
如果你希望在系統打開時運行倒計時顯示,並且無需登錄並運行腳本,你可以將可選的 systemd 單元安裝為systemd 用戶服務🔗 wiki.archlinux.org。
將 GitHub 上的piday.service🔗 github.com文件複製到${HOME}/.config/systemd/user,如果該目錄不存在,請先創建該目錄。然後你可以啟用該服務並啟動它:
該腳本將輸出到 systemd 日誌,可以使用journalctl命令查看輸出。

它開始看起來像是圓周率日了!
這就是你的作品!一個顯示在電子紙顯示屏上的樹莓派 Zero W 圓周率日倒計時器!並在系統啟動時使用 systemd 單元文件啟動!現在距離我們可以再次相聚慶祝圓周率日還有好多天的奇妙設備———樹莓派。通過我們的小項目,我們可以一目了然地看到確切的天數。
但實際上,每個人都可以在每一天在心中慶祝圓周率日,因此請使用自己的樹莓派創建一些有趣且具有教育意義的項目吧!
via:https://opensource.com/article/21/3/raspberry-pi-countdown-clock
作者:Chris Collins選題:lujun9972譯者:Donkey校對:wxy
本文由LCTT原創編譯,Linux中國榮譽推出

