如何使用Raspberry Pi設置登場音樂

在我年輕的時候,我最喜歡的摔跤手絕對是被稱為“Heartbreak Kid”的Shawn Michaels。他是一個偉大的運動員和表演者,所做的一切都非常有趣。

從他進入大樓的那一刻開始,這首音樂響起:

這讓我開始思考,如果Shawn Michaels可以以這種方式入場,為什麼我不能?

是的,有了Raspberry Pi和Python chops,像我(或者您!)這樣的傢伙也許就可以擁有登場音樂了。

Raspberry Pi如何檢測出您的登場?

這裡有幾種選擇。

我們可以檢測出您的手機是否連接到無線網路。這很有用,因為Raspberry Pi可以確認是否是您本人在進入(而非您的室友或家人)。

缺點是它對您的距離的測定不太精確。我的意思是,這是登場音樂,對嗎?它應該在您進門時開始響起。

您也可以改用PIR運動感測器。這可以將音樂與入門動作精確匹配,不過這種方法無法對正在進入的人作出區分。

所以,我們可以將這兩者結合起來。Raspberry Pi將會在您的手機連接到無線網路時檢測出您已經到家,然後等待感測器來檢測出您進入的確切時間。

如果您更傾向於使用其中的一種,可以直接去除掉其他部分。

使用Python Subprocess模組

本專案還會引入Python的subprocess模組。該模組在標準庫中,您無需進行安裝。

使用該模組,我們可以在Python內部運行shell命令。這非常方便。如果您已經知道這些命令列是如何執行操作的,只需直接運行該命令即可。

我們將使用的兩個命令是mpg123和ping。

mpg123是一個用於播放mp3檔的命令列實用程式。我們需要安裝mpg123。

您不需要安裝ping,系統中已經有了。這是一個簡單的工具,用於檢查遠端伺服器或設備是否處於連通狀態並作出回應。我們將使用它來檢查您的手機是否連接到了您的無線網路。

所需組件

對於本專案,您將需要以下元件:

帶有電源、無線網卡以及一個SD卡的Raspberry Pi raspberry pi
一個PIR運動感測器

(我使用的是XC-4444)

PIR motion sensor
Shawn Michaels所演唱的Sexy Boy高品質MP3檔(或者您也可以選擇其他非常鐘意的歌曲)
從Raspberry Pi播放音樂的某種方式。連接到HDMI埠的家庭娛樂系統是比較理想的

您還需要一部智慧手機、一個無線家用網路和3根公對母跳線。

確保您的手機設置為自動連接到您家裡的無線網路,並且沒有使用任何省電設置,以防手機在不使用時禁用無線網路。

這裡我們假設您已經瞭解PIR運動感測器GPIO Zero庫了。如果沒有,請先查看這些相關介紹。您將從中瞭解該設備的工作原理,在本專案中我們將以大致相同的方式對其進行接線。

本項目用Raspberry Pi OS Buster進行了測試,但是舊版本的Raspbian應該也沒問題。我們使用的Python模組和Linux命令都是存在已久的了。

設置Raspberry Pi

我們首先為這個專案創建一個目錄,並進入該目錄。打開終端並輸入:
mkdir ~/entrancemusic
cd ~/entrancemusic

用一種您喜歡的方式將mp3檔複製到此目錄中。

然後用以下命令更新您的系統並安裝mpg123:

sudo apt update && sudo apt upgrade -y
sudo apt install mpg123

連接PIR運動感測器

這次我們不使用麵包板。對於我們的項目來說,麵包板將會產生阻礙。

拿起您的PIR運動感測器和跳線。將感測器的電源引腳連接到Raspberry Pi的5V電源引腳。然後將感測器的接地引腳連接到Raspberry Pi上的接地引腳。

然後將數位輸出連接到一個GPIO引腳。我使用的是引腳24,因為它的位置比較方便。

這就是運動感測器的全部接線過程。將其擺放為面向您將要進入的門口。

為您的智能手機保留IP地址

幾乎所有家庭無線網路都使用DHCP來為所連接的新設備自動分配可用的IP位址。這很方便,因為它很可靠並且無需讓您進行管理。

這也意味著特定設備的IP位址可能會不時發生更改。對於本項目,我們希望您的手機始終分配到同一個IP位址上,並且沒有其他設備使用該位址。

大多數路由器為一個設備分配的IP位址至少會持續一天左右的時間。因此,如果您只打算執行本項目一次,那麼可以愉快地繼續進行,不必再為此困擾。

但是如果您想多次運行此腳本,那麼您應該為您的設備保留一個IP位址。您可以通過登陸無線路由器的管理面板來執行此操作。不同的路由器對此的處理方式略有不同,但通常操作方式都比較容易。如果您遇到了困難,請使用搜尋引擎查找您設備的手冊。

我的手機保留的IP地址為192.168.0.5。您的IP位址可能會有所不同,只需按照說明對其進行替換即可。

當還有一點是—您是否有使用SSH通過本地網路訪問Raspberry Pi的習慣?請也為其保留一個IP位址。如果它的IP位址是不會改變的,那就更方便了。

使用mpg123播放登場音樂

要從命令行使用mpg123,你只需要輸入您要播放的mp3名稱即可,如下所示:

mpg123 ‘Sexy Boy (Shawn Michaels).mp3’

從Python運行此命令也並不複雜。

首先,導入subprocess模組中的run函數。然後將以上命令列作為第一個參數傳遞給該函數,並將“shell=True”作為第二個參數,如下所示;

from subprocess import run
run(“mpg123 ~/entrancemusic/’Sexy Boy (Shawn Michaels).mp3′”, shell=True)

使用Ping檢測您的手機是否已連接

您可以通過命令列ping您的手機,如下所示:

ping -c 192.168.0.5

請記得替換您手機的IP地址。我們添加“-c 1”來告訴ping只發送一次請求。如果我們不添加該內容,該命令將會被一直運行,直到被取消。

如果設備回應,ping將會返回成功。如果沒有回應,將會返回一個錯誤代碼。

理想情況下,我們可以用此錯誤代碼來查看手機是否已經連接到網路。不幸的是,許多智慧手機不會對請求發生回應。這就意味著無論您的手機是否連接到了網路,ping都會返回錯誤代碼。

那麼讓我們來看看輸出內容。如果沒有設備在指定的IP位址上,那麼輸出中將包含語句“Destination Host Unreachabl(目標主機無法訪問)”。

Python的subprocess模組包含Popen和PIPE物件,可以讓我們對輸出進行處理,如下所示:

from subprocess import Popen, PIPE
p1 = Popen([“ping”, “-c”, “1”, “192.168.0.5”], stdout=PIPE)
stdout_value = p1.communicate()[0]

如果您想瞭解此代碼中所運行的內容,請閱讀此處。對於本專案來說,知道它運行了ping命令,然後將輸出分配給了stdout_value就足夠了。

我們可以使用它來編寫一個迴圈程式,當“Destination Host Unreachable”沒有出現在輸出中時可進行中斷。

while True:
p1 = Popen([“ping”, “-c”, “1”, “192.168.0.5”], stdout=PIPE)
stdout_value = p1.communicate()[0]
if b’Destination Host Unreachable’ not in stdout_value:
break
sleep(2)

這個迴圈會一直運行到您的手機連接到網路為止。

將所有程式寫到一個腳本中

我們現在已經具備了用於簡單的登場音樂程式的所有代碼塊。輸入以下命令打開一個新檔:

nano entrancemusic.py

然後輸入(或粘貼)以下內容:

from time import sleep
from signal import pause
from subprocess import run, Popen, PIPE
from gpiozero import MotionSensor

sleep(600) # This gives you 10 minutes to leave your home
pir = MotionSensor(24)

while True:
p1 = Popen([“ping”, “-c”, “1”, “192.168.0.5”], stdout=PIPE)
stdout_value = p1.communicate()[0]
if b’Destination Host Unreachable’ not in stdout_value:
break
sleep(2)

sleep(5)

pir.wait_for_motion()
run(“mpg123 ~/entrancemusic/’Sexy Boy (Shawn Michaels).mp3′”, shell=True)

Save and exit nano.

如果您想在回家時安排登場音樂,請在離開家之前運行此腳本,輸入:

python3 entrancemusic.py

微調

該腳本會像本文所述的那樣運行,但是您可能會想要調試一些功能。

安排您的入場時間

您可能已經注意到了,此腳本會在傳令感測器感應運動前休眠5秒鐘,這是為什麼?

這是為了對時間進行限制,從而防止其他人誤用了您的登場音樂。如果您將運動感測器設置在了共用區域(例如客廳或大廳),這一點極為重要。

那麼5秒鐘是正確的等待時間嗎?這取決於您的無線網路範圍和家庭的佈局。如果您的感測器正對著前門,您可能不希望有任何延遲。您可以進行多次嘗試來找到合適的延遲時間。

圖片:Raspberry Pi

多晚才算太晚?

如果您要去吃晚飯或去酒吧,很晚回家,這時候用Shawn Michaels的動感音樂吵醒大家怎麼辦?如果您完全沉迷於自己的角色扮演中,那麼這將會是一個刺激競爭對手並且建立主導地位的絕佳機會。

至於我?我不願意在晚上十點之後播放嘈雜的音樂。

我們可以使用time模組中的localtime()函數來檢查時間。可以通過將腳本中的第一行更改為以下內容來導入該函數:

from time import sleep, localtime

然後我們可以通過以下比較來檢查時間是否在上午9點到晚上10點之間:

9 < localtime().tm_hour < 22

接下來,我們只需要將mpg123命令放置在if語句中即可。

if 9 < localtime().tm_hour < 22:
run(“mpg123 ~/entrancemusic/’Sexy Boy (Shawn Michaels).mp3′”, shell=True)

您可以根據自己的情況來調整設備的工作時間。

平凡客廳的隆重登場

世界上很少有人能夠稱為職業摔跤手。多虧了Python和Raspberry Pi,您也可以享受到隆重登場的感覺了。

您會對此做出進一步調整嗎?請在評論中留下您的想法!