您是否曾經(jīng)想過個人歡迎回家?有了Raspberry Pi和一些簡單的組件,您就可以!在這個簡單的項目中,我們將使用簧片開關(guān)在門打開時觸發(fā)主題曲。盡管您可以使用相同的電路在該項目中使用幾乎任何其他微控制器,但在這里我們將使用Raspberry Pi作為控制器。這是一個演示。
您將需要
您可能已經(jīng)擁有制作所需的所有零件,除了簧片開關(guān)(大約$ 2-3),或者您可以得到一包5個,剛好超過8美元。
一個Raspberry Pi(任何型號都可以使用)。
1 x 220歐姆電阻。
1 x 1K歐姆電阻。
3 x 10K歐姆電阻。
1 x磁簧開關(guān)。
1 x LED。
2個按鈕開關(guān)。
面包板。
連接線。
電腦揚聲器或類似產(chǎn)品。
進(jìn)入房間后,我們將使用Raspberry Pi播放歌曲,并在面包板上設(shè)計帶有按鈕的電路以延遲激活它,并停止程序。
該項目雖然主要是為了娛樂,但它涵蓋了DIY家庭自動化以及DIY家庭安全中許多應(yīng)用程序的基礎(chǔ)。
入門
讓我們從制作電路開始。確保您的Pi沒電,并按如下所示設(shè)置電路:
LED連接到我們pi的引腳7。兩個按鈕開關(guān)分別連接到引腳11和13,簧片開關(guān)連接到引腳15。我們的電源流向引腳1(3v3)和引腳6(Gnd)。
請確保檢查所有內(nèi)容均在正確的位置。
在測試該項目時,它可能有助于將簧片開關(guān)置于您的面前,以便您輕松切換它打開或關(guān)閉。在這種情況下,舌簧開關(guān)已經(jīng)安裝在門上方。項目啟動并運行后,您可以使用磁帶將開關(guān)暫時連接到門上,或者如果您更有信心,可以將其更永久地連接以用于將來的項目中!
將Pi的3.5mm插孔輸出連接到揚聲器系統(tǒng)。一旦所有內(nèi)容放在一起,它應(yīng)該看起來像這樣:
請注意,此處使用的面包板具有電源軌,與Fritzing圖相反
現(xiàn)在打開您的Pi的電源,并使用SSH訪問它,以便我們可以訪問終端。如果您不確定如何執(zhí)行此操作,本指南可以為您提供幫助。如果您將Raspberry Pi與顯示器,鼠標(biāo)和鍵盤一起使用,請?zhí)^此步驟并打開終端。
在開始之前,值得檢查您是否最新。在終端中輸入sudo apt-get update。
現(xiàn)在我們可以繼續(xù)讓Pi與電路進(jìn)行通訊了。
測試設(shè)置
開始,讓我們使用一個簡單的程序檢查電路。如果您確信到目前為止一切都正確,您可以跳過此步驟,盡管我建議您這樣做,因為這樣可以避免以后出現(xiàn)頭痛。
如果您以前從未使用過Python編程并且感到有點畏縮,有很多很棒的網(wǎng)站可以幫助您入門。
在終端中,創(chuàng)建一個新腳本:
nano test.py
打開后,將此代碼添加到文件中,然后按Ctrl-C退出,并遵循保存對話框:
#This code was written for an article on www.MakeUseOf.com by Ian Buckley.
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(11,GPIO.IN)
GPIO.setup(13,GPIO.IN)
GPIO.setup(15,GPIO.IN)
while True:
GPIO.output(7,GPIO.HIGH)
if (GPIO.input(11)==1):
print(“Button on GPIO 11”)
time.sleep(1)
if (GPIO.input(13)==1):
print(“Button on GPIO 13”)
time.sleep(1)
if (GPIO.input(15)==1):
print(“Button on GPIO 15”)
time.sleep(1)
GPIO.cleanup()
此代碼讀取按鈕的值并打印到當(dāng)它們改變時的屏幕。兩個按鈕具有下拉電阻,因此按下時它們報告為高電平。只要其隨附的磁鐵閉合,磁簧開關(guān)就會報告為HIGH。
運行程序:
python test.py
當(dāng)您按下兩個按鈕并將磁鐵從簧片開關(guān)上拉開時,您應(yīng)該會看到LED亮起,并向屏幕報告。如果您在按按鈕時沒有收到反饋,請再次檢查電路,并確保一切均已連接。完成測試后,請按 CTRL-C 停止程序。
現(xiàn)在我們可以編寫一個簡單的程序設(shè)置,觸發(fā)和重置我們的門傳感器。我們將遍歷各部分的代碼,并簡要說明每個部分的功能,但是如果您想向下滾動完整的代碼以查看完整的內(nèi)容,則可以使用。
我們需要從導(dǎo)入一些模塊開始:
import Rpi.GPIO as GPIO
import pygame.mixer
import time
我們將使用 Pygame 模塊播放音樂。它是Raspbian Jessie的標(biāo)準(zhǔn)配置,并且是編寫Python游戲和許多其他出色項目所需的一切的強大庫。
我們將使用名為 active 的變量決定我們的系統(tǒng)是否處于活動狀態(tài)。讓我們定義幾個為我們執(zhí)行此操作的函數(shù):
def activeSetup():
global active
active=0
print(“Currently Not Active”)
def activeState():
global active
if active==1:
active=0
GPIO.output(7,GPIO.LOW)
print(“Currently Not Active”)
elif active==0:
print (“Activating in 10 seconds”)
for x in range(0,10):
GPIO.output(7,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(7,GPIO.LOW)
time.sleep(0.5)
active=1
GPIO.output(7,GPIO.HIGH)
print(“Currently Active”)
else: return
此處的第一個函數(shù)創(chuàng)建一個名為 active 的變量,并將其設(shè)置為0。給活動狀態(tài)一個數(shù)值意味著,如果您打算以后擴(kuò)展程序以具有不同的活動狀態(tài),則可以對它們進(jìn)行相應(yīng)編號。盡管它可能不是世界上最好的Python編程,但對于這個項目來說已經(jīng)足夠了。
調(diào)用時的第二個函數(shù)檢查系統(tǒng)是否處于活動狀態(tài)(或 active == 1 )。如果是,它將設(shè)置系統(tǒng)為非活動狀態(tài)( active == 0 ),關(guān)閉LED并打印到控制臺。如果不是,那么它會為您提供10秒鐘的倒數(shù)時間,使其離開LED閃爍的房間,然后繼續(xù)顯示系統(tǒng)處于活動狀態(tài)。
現(xiàn)在,我們可以定義一個函數(shù)來觀察我們的磁簧開關(guān):
def watchDoor():
global playing
playing = False
while True:
if active==1 and GPIO.input(15)==1 and playing == False:
playing=True
pygame.mixer.music.play()
if GPIO.input(13)==1:
print(“Stop button pressed: Exiting”)
pygame.mixer.music.stop()
break
if GPIO.input(11)==1:
activeState()
time.sleep(0.5)
我們在這里創(chuàng)建了另一個名為 playing 的變量-只是為了阻止程序嘗試在出現(xiàn)以下情況時反復(fù)開始播放
在while循環(huán)中,第一個if語句開始播放音樂(我們還沒有音樂,但不用擔(dān)心,它來了)。僅當(dāng)系統(tǒng)處于活動狀態(tài),簧片開關(guān)打開且尚未播放時,音樂才能開始播放。
第二個if語句用于退出按鈕。如果按下此按鈕,音樂將停止并且程序?qū)⑼顺觥?/p>
第三個if語句用于切換系統(tǒng)是否處于活動狀態(tài)。此處的 time.sleep 功能是防止在按下按鈕時讀取多個按鈕。
現(xiàn)在是時候設(shè)置Pi的引腳了。
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(11,GPIO.IN)
GPIO.setup(13,GPIO.IN)
GPIO.setup(15,GPIO.IN)
如果您在使用Pi之前已經(jīng)做過任何實驗,那么您應(yīng)該已經(jīng)熟悉了。引腳7設(shè)置中的 initial = GPIO.LOW 參數(shù)將在初始化后立即將其設(shè)置為低電平。
現(xiàn)在,我們可以調(diào)用函數(shù),將系統(tǒng)設(shè)置為不
activeSetup()
音樂大師!
這時,我們應(yīng)該開始考慮要播放的音樂。您可以選擇所需的任何音樂文件,但是我們現(xiàn)在將選擇適合所有人的內(nèi)容。如果您觀看YouTube,您可能已經(jīng)很熟悉Kevin MacLeod的音樂。讓我們下載他的一首美妙的樂曲,稱為“獨眼大師”。這些內(nèi)容以及他網(wǎng)站上的許多音樂均已獲得知識共享(Creative Commons)的許可,并且有很多充分的理由將這些許可的內(nèi)容用于您的項目。
回到我們的代碼中,我們需要啟動Pygame混音器并加載我們的音樂。
pygame.mixer.init(44100,-16,2,1024)
pygame.mixer.music.set_volume(1.0)
name = “One-eyed Maestro.mp3”
pygame.mixer.music.load(name)
print(“Loaded track - ”+ str(name))
此塊的第一行啟動 Pygame 混音器。括號中的最后一個參數(shù)是緩沖區(qū),該緩沖區(qū)控制播放聲音的延遲。如果以后播放音樂時出現(xiàn)斷斷續(xù)續(xù)的播放,請嘗試將此數(shù)字增加到4096。在Pi 3上可以正常使用的設(shè)置。
如果將音樂文件下載到其他目錄,您的 door.py 程序,定義名稱變量時需要在方括號內(nèi)提供完整路徑。
現(xiàn)在剩下要做的就是建立一個循環(huán)
while True:
if(GPIO.input(13)==1):
print(“Stop button pressed: Exiting”)
pygame.mixer.music.stop()
break
if(GPIO.input(11)==1):
activeState()
time.sleep(0.5)
if(active==1):
watchDoor()
break
GPIO.cleanup()
此while循環(huán)等待來自任一按鈕的輸入,然后退出或?qū)顟B(tài)更改為活動狀態(tài)相應(yīng)地。如果活動狀態(tài)變?yōu)?,則將調(diào)用我們之前定義的 watchDoor 函數(shù),并且在下次打開門時將播放我們的樂曲。我們還調(diào)用 GPIO.cleanup()來重置退出時的引腳,這通常是對Raspberry Pi上所有編程的一個好習(xí)慣。
這就是我們要做的一切啟動并運行該項目,下面是完整的代碼:
import RPi.GPIO as GPIO
import pygame.mixer
import time
def activeSetup():
global active
active=0
print(“Currently Not Active”)
def activeState():
global active
if active==1:
active=0
GPIO.output(7,GPIO.LOW)
print(“Currently Not Active”)
elif active==0:
print (“Activating in 10 seconds”)
for x in range(0,10):
GPIO.output(7,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(7,GPIO.LOW)
time.sleep(0.5)
active=1
GPIO.output(7,GPIO.HIGH)
print(“Currently Active”)
else: return
def watchDoor():
global playing
playing = False
while True:
if active==1 and GPIO.input(15)==1 and playing == False:
playing=True
pygame.mixer.music.play()
if GPIO.input(13)==1:
print(“Stop button pressed: Exiting”)
pygame.mixer.music.stop()
break
if GPIO.input(11)==1:
activeState()
time.sleep(0.5)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(11,GPIO.IN)
GPIO.setup(13,GPIO.IN)
GPIO.setup(15,GPIO.IN)
activeSetup()
pygame.mixer.init(44100,-16,2,1024)
pygame.mixer.music.set_volume(1.0)
name = “One-eyed Maestro.mp3”
pygame.mixer.music.load(name)
print(“Loaded track - ”+ str(name))
while True:
if(GPIO.input(13)==1):
print(“Stop button pressed: Exiting”)
pygame.mixer.music.stop()
break
if(GPIO.input(11)==1):
activeState()
time.sleep(0.5)
if(active==1):
watchDoor()
break
GPIO.cleanup()
如果您在此處向下滾動以立即獲取完整的代碼,請記住您仍然需要將音樂下載到您的Pi上以使其正常工作!
現(xiàn)在,您應(yīng)該可以正常運行歡迎的主題音樂了!將簧片開關(guān)安裝到門上,然后嘗試一下。令人尷尬的跳舞是可選的,但建議這樣做。
該項目涵蓋了各種形式的家庭監(jiān)控,安全性和自動化的基礎(chǔ)知識,希望它也很有趣!
現(xiàn)在您已經(jīng)走了這么遠(yuǎn),為什么停在那里?您可以添加更多軌道,并讓程序從列表中隨機(jī)選擇一個。您可以添加一個中繼,并在輸入時觸發(fā)其他對象。如果您有家庭音樂系統(tǒng),為什么不為每個房間都準(zhǔn)備主題曲呢?
責(zé)任編輯:wv
-
樹莓派
+關(guān)注
關(guān)注
121文章
2005瀏覽量
107445
發(fā)布評論請先 登錄
樹莓派6 傳聞:發(fā)布日期與規(guī)格!

【正點原子STM32MP257開發(fā)板試用】5.播放音樂
樹莓派小技巧:無需鍵盤或顯示器,如何通過WiFi設(shè)置樹莓派?

搭載代碼的樹莓派進(jìn)入國際空間站!

樹莓派分類器:用樹莓派識別不同型號的樹莓派!

樹莓派“吉尼斯世界記錄”:將樹莓派的性能發(fā)揮到極致的項目!

評論