自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用樹莓派做一個倒計時器

系統(tǒng) Linux
使用樹莓派和電子紙顯示屏開始倒計時你的下一個假期。

圓周率日Pi Day(3 月 14 日) 來了又走,留下美好的回憶以及 許多樹莓派項(xiàng)目 等待我們?nèi)L試。在任何令人精神振奮、充滿歡樂的假期后回到工作中都很難,圓周率日也不例外。當(dāng)我們回望三月的時候,渴望那些天的快樂。但是不用害怕,親愛的圓周率日慶祝者們,我們開始下一個節(jié)日的漫長倒計時!

好了,嚴(yán)肅點(diǎn)。我做了一個圓周率日倒計時器,你也可以!

不久前,我購買了一個 樹莓派 Zero W,并且用它來 解決 WiFi 信號較差的原因 。我也對使用電子紙ePaper來作為它的顯示屏十分感興趣。雖然我不知道該用它來干什么,但是!它看起來真的很有趣!我買了一個十分適合放在樹莓派的頂部的 2.13 英寸的 WaveShare 顯示器 。安裝很簡單:只需要將顯示器接到樹莓派的 GPIO 上即可。

我使用 樹莓派操作系統(tǒng) 來實(shí)現(xiàn)該項(xiàng)目,雖然其他的操作系統(tǒng)肯定也能完成。但是下面的 ??raspi-config?? 命令在樹莓派系統(tǒng)上很容易使用。

設(shè)置樹莓派和電子紙顯示屏

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

下面是完成這些的步驟。

啟用 SPI

樹莓派上啟用 SPI 最簡單的方式是使用 ??raspi-config?? 命令。SPI 總線允許與設(shè)備進(jìn)行串行數(shù)據(jù)通信——在本例中,電子紙顯示:

    $ sudo raspi-config

從彈出的菜單中, 選擇 “接口選項(xiàng)Interfacing Options-> SPI -> 是Yes” 來啟用 SPI 接口,然后啟動。

安裝 BCM2835 庫

如上所述,BCM2835 庫是用于樹莓派博通 BCM2385 芯片的軟件,它允許訪問 GPIO 引腳來控制設(shè)備。

在我寫這篇文章之時,用于樹莓派的最新博通 BCM2385 庫版本是 v1.68 。安裝此庫需要下載軟件壓縮包然后使用 ??make?? 來安裝:

    # 下載 BCM2853 庫并解壓
$ curl -sSL http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.g> -o - | tar -xzf -
# 進(jìn)入解壓后的文件夾
$ pushd bcm2835-1.68/
# 配置、檢查并安裝 BCM2853 庫
$ sudo ./configure
$ sudo make check
$ sudo make install
# 返回上級目錄
$ popd

安裝需要的 Python 庫

你用 Python 控制電子紙顯示屏需要安裝 Python 庫 ??RPi.GPIO???,還需要使用 ??python3-pil?? 包來畫圖。顯然,PIL 包已經(jīng)不行了,但 Pillow 可以作為代替方案。我還沒有為該項(xiàng)目測試過 Pillow ,但它可行:

    # 安裝需要的 Python 庫
$ sudo apt-get update
$ sudo apt-get install python3-pip python3-pil
$ sudo pip3 install RPi.GPIO

注意:這些是 Python3 的指令。你可以在 WaveShare 網(wǎng)站查到 Python2 的指令。

下載 WaveShare 示例和 Python 庫

Waveshare 維護(hù)了一個 Python 和 C 的 Git 庫,用于使用其電子紙顯示屏和一些展示如何使用它們的示例。對這個倒計時時鐘而言,你需要克隆這個庫并使用用于 2.13 英寸顯示屏的庫:

    # 克隆這個 WaveShare e-Paper git 庫
$ git clone https://github.com/waveshare/e-Paper.gi>

如果你用不同的顯示器或者其他公司產(chǎn)品,需要使用適配軟件。

Waveshare 提供了很多指導(dǎo):

獲得有趣的字體(選做)

你可以隨心所欲的使用顯示器,為什么不搞點(diǎn)花樣?找一個炫酷的字體!

這有大量 開放字體許可 的字體可供選擇。我十分喜愛 Bangers 字體。如果你看過 YouTube 那你見過這種字體了,它十分流行。你可以下載到本地的共享字體目錄文件中,并且所有的應(yīng)用都可以使用,包括這個項(xiàng)目:

    # “Bangers” 字體是 Vernon Adams 使用 Google 字體開放許可授權(quán)的字體
$ mkdir -p ~/.local/share/fonts
$ curl -sSL https://github.com/google/fonts/raw/master/ofl/bangers/Bangers-Regular.ttf -o fonts/Bangers-Regular.ttf

創(chuàng)建一個圓周率日倒計時器

現(xiàn)在你已經(jīng)安裝好了軟件,可以使用帶有炫酷字體的電子紙顯示屏了。你可以創(chuàng)建一個有趣的項(xiàng)目:倒計時到下一個圓周率日!

如果你想,你可以從該項(xiàng)目的 ??GitHub 倉庫?? 直接下載 ??countdown.py?? 這個 Python 文件并跳到文章結(jié)尾。

為了滿足大家的好奇心,我將逐步講解。

導(dǎo)入一些庫

    #!/usr/bin/python3
# -*- coding:utf-8 -*-
import logging
import os
import sys
import time
from datetime import datetime
from pathlib import Path
from PIL import Image,ImageDraw,ImageFont
logging.basicConfig(level=logging.INFO)
basedir = Path(__file__).parent
waveshare_base = basedir.joinpath('e-Paper', 'RaspberryPi_JetsonNano', 'python')
libdir = waveshare_base.joinpath('lib')

開始先導(dǎo)入一些標(biāo)準(zhǔn)庫之后腳本中用。也需要你從 PIL 添加 ??Image??、??ImageDraw?? 和 ??ImageFont??,你會用到這些來畫一些簡單的圖形。最后,為本地 ??lib?? 目錄設(shè)置一些變量,該目錄包含了用于 2.13 英寸顯示屏的 Waveshare Python 庫,稍后你可以使用這些變量從本地目錄加載庫。

字體大小輔助函數(shù)

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

    def set_font_size(font_size):
logging.info("Loading font...")
return ImageFont.truetype(f"{basedir.joinpath('Bangers-Regular.ttf').resolve()}", font_size)

倒計時邏輯

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

    def countdown(now):
piday = datetime(now.year, 3, 14)
# 如果錯過了就增加一年
if piday < now:
piday = datetime((now.year + 1), 3, 14)
days = (piday - now).days
logging.info(f"Days till piday: {days}")
return day

主函數(shù)

最后,到了主函數(shù),需要初始化顯示屏并向它寫數(shù)據(jù)。這時,你應(yīng)該寫一個歡迎語然后再開始倒計時。但是首先,你需要加載 Waveshare 庫:

    def main():
if os.path.exists(libdir):
sys.path.append(f"{libdir}")
from waveshare_epd import epd2in13_V2
else:
logging.fatal(f"not found: {libdir}")
sys.exit(1)

上面的代碼片段檢查以確保該庫已下載到倒計時腳本旁邊的目錄中,然后加載??epd2in13_V2?? 庫。如果你使用不同的顯示屏,則需要使用不同的庫。如果你愿意,也可以自己編寫。我發(fā)現(xiàn)閱讀 Waveshare 隨顯示屏提供的 Python 代碼很有趣,它比我想象的要簡單得多。

下一段代碼創(chuàng)建一個 EPD(電子紙顯示屏)對象以與顯示器交互并初始化硬件:

 logging.info("Starting...")
try:
# 創(chuàng)建一個顯示對象
epd = epd2in13_V2.EPD()
# 初始化并清空顯示
# ePaper 保持它的狀態(tài)處分更新
logging.info("Initialize and clear...")
epd.init(epd.FULL_UPDATE)
epd.Clear(0xFF)

關(guān)于電子紙的一個有趣之處:它僅在將像素從白色變?yōu)楹谏驈暮谏優(yōu)榘咨珪r才耗電。這意味著當(dāng)設(shè)備斷電或應(yīng)用程序因任何原因停止時,屏幕上的任何內(nèi)容都會保留下來。從功耗的角度來看,這很好,但這也意味著你需要在啟動時清除顯示,否則你的腳本只會覆蓋屏幕上已有的內(nèi)容。
因此,??epd.Clear(0xFF)?? 用于在腳本啟動時清除顯示。

接下來,創(chuàng)建一個“畫布”來繪制剩余的顯示輸出:

 # 創(chuàng)建一個圖形對象
# 注意:"epd.heigh" 是屏幕的長邊
# 注意:"epd.width" 是屏幕的短邊
# 真是反直覺…
logging.info(f"Creating canvas - height: {epd.height}, width: {epd.width}")
image = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
draw = ImageDraw.Draw(image)

這與顯示器的寬度和高度相匹配——但它有點(diǎn)反直覺,因?yàn)轱@示器的短邊是寬度。我認(rèn)為長邊是寬度,所以這只是需要注意的一點(diǎn)。 請注意,??epd.height?? 和 ??epd.width?? 由 Waveshare 庫設(shè)置以對應(yīng)于你使用的設(shè)備。

歡迎語

接下來,你將開始畫一些畫。這涉及在你之前創(chuàng)建的“畫布”對象上設(shè)置數(shù)據(jù)。這還沒有將它繪制到電子紙顯示屏上——你現(xiàn)在只是在構(gòu)建你想要的圖像。由你為這個項(xiàng)目繪制帶有一塊餡餅的圖像,來創(chuàng)建一個慶祝圓周率日的歡迎信息:

畫一塊餡餅

畫一塊餡餅

很可愛,不是嗎?

logging.info("Set text text...")
bangers64 = set_font_size(64)
draw.text((0, 30), 'PI DAY!', font = bangers64, fill = 0)
logging.info("Set BMP...")
bmp = Image.open(basedir.joinpath("img", "pie.bmp"))
image.paste(bmp, (150,2))

最后,真是是最后了,你可以展示你畫的圖畫:

  logging.info("Display text and BMP")
epd.display(epd.getbuffer(image))

上面那段話更新了顯示屏,以顯示你所畫的圖像。

接下來,準(zhǔn)備另一幅圖像展示你的倒計時:

圓周率日倒計時

首先,創(chuàng)建一個用來展示倒計時的圖像對象。也需要設(shè)置數(shù)字的字體大?。?/p>

logging.info("Pi Date countdown; press CTRL-C to exit")
piday_image = Image.new('1', (epd.height, epd.width), 255)
piday_draw = ImageDraw.Draw(piday_image)
# 設(shè)置字體大小
bangers36 = set_font_size(36)
bangers64 = set_font_size(64)

為了使它顯示的時候更像一個倒計時,更新圖像的一部分是更加有效的手段,僅更改已經(jīng)改變的顯示數(shù)據(jù)部分。下面的代碼準(zhǔn)備以這樣方式運(yùn)行:

# 準(zhǔn)備更新顯示
epd.displayPartBaseImage(epd.getbuffer(piday_image))
epd.init(epd.PART_UPDATE)

最后,需要計時,開始一個無限循環(huán)來檢查據(jù)下次圓周率日還有多久,并顯示在電子紙上。如果到了圓周率日,你可以輸出一些慶祝短語:

while (True):
days = countdown(datetime.now())
unit = get_days_unit(days)

# 通過繪制一個填充有白色的矩形來清除屏幕的下半部分
piday_draw.rectangle((0, 50, 250, 122), fill = 255)
# 繪制頁眉
piday_draw.text((10,10), "Days till Pi-day:", font = bangers36, fill = 0)
if days == 0:
# 繪制慶祝語
piday_draw.text((0, 50), f"It's Pi Day!", font = bangers64, fill = 0)
else:
# 繪制距下一次 Pi Day 的時間
piday_draw.text((70, 50), f"{str(days)} {unit}", font = bangers64, fill = 0)
# 渲染屏幕
epd.displayPartial(epd.getbuffer(piday_image))
time.sleep(5)

腳本最后做了一些錯誤處理,包括捕獲鍵盤中斷,這樣你可以使用 ??Ctrl + C??? 來結(jié)束無限循環(huán),以及一個根據(jù)計數(shù)來打印 ??day??? 或 ??days?? 的函數(shù):

except IOError as e:
logging.info(e)
except KeyboardInterrupt:
logging.info("Exiting...")
epd.init(epd.FULL_UPDATE)
epd.Clear(0xFF)
time.sleep(1)
epd2in13_V2.epdconfig.module_exit()
exit()
def get_days_unit(count):
if count == 1:
return "day"
return "days"
if __name__ == "__main__":
main()

現(xiàn)在你已經(jīng)擁有一個倒計時并顯示剩余天數(shù)的腳本!這是在我的樹莓派上的顯示(視頻經(jīng)過加速,我沒有足夠的磁盤空間來保存一整天的視頻):

Pi Day Countdown Timer In Action

Pi Day Countdown Timer In Action

安裝 systemd 服務(wù)(選做)

如果你希望在系統(tǒng)打開時運(yùn)行倒計時顯示,并且無需登錄并運(yùn)行腳本,你可以將可選的 systemd 單元安裝為 ??systemd 用戶服務(wù)??。

將 GitHub 上的 ??piday.service??? 文件復(fù)制到 ??${HOME}/.config/systemd/user??,如果該目錄不存在,請先創(chuàng)建該目錄。然后你可以啟用該服務(wù)并啟動它:

    $ mkdir -p ~/.config/systemd/user
$ cp piday.service ~/.config/systemd/user
$ systemctl --user enable piday.service
$ systemctl --user start piday.service
# Enable lingering, to create a user session at boot
# and allow services to run after logout
$ loginctl enable-linger $USER

該腳本將輸出到 systemd 日志,可以使用 ??journalctl?? 命令查看輸出。

它開始看起來像是圓周率日了!

這就是你的作品!一個顯示在電子紙顯示屏上的樹莓派 Zero W 圓周率日倒計時器!并在系統(tǒng)啟動時使用 systemd 單元文件啟動!現(xiàn)在距離我們可以再次相聚慶祝圓周率日還有好多天的奇妙設(shè)備———樹莓派。通過我們的小項(xiàng)目,我們可以一目了然地看到確切的天數(shù)。

但實(shí)際上,每個人都可以在每一天在心中慶祝圓周率日,因此請使用自己的樹莓派創(chuàng)建一些有趣且具有教育意義的項(xiàng)目吧!

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2011-09-16 17:18:43

iPhone應(yīng)用TimeSpan

2023-04-17 09:08:27

CSS計時器

2019-03-23 19:33:14

樹莓派Linux操作系統(tǒng)

2018-05-25 08:44:22

樹莓派PythonMySQL

2022-10-21 15:42:21

倒計時鴻蒙

2014-03-21 13:46:45

2014-08-18 14:30:27

Android倒計時

2020-06-11 08:48:49

JavaScript開發(fā)技術(shù)

2022-06-28 15:29:56

Python編程語言計時器

2015-03-23 17:58:04

驗(yàn)證碼倒計時并行

2017-07-20 16:21:52

UICountDownTidelay

2011-04-11 09:17:28

Ubuntu倒計時

2011-04-11 09:50:56

Ubuntu 11.0

2014-02-18 10:36:33

2011-05-23 08:43:40

jQueryjQuery插件

2013-02-25 10:26:31

創(chuàng)業(yè)創(chuàng)業(yè)者

2012-11-30 13:59:52

傲游

2013-10-08 09:24:39

Windows 8.1Windows 8

2022-06-14 08:45:27

瀏覽器IEWindows

2019-03-31 08:00:02

樹莓派更新樹莓派 Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號