Har du någonsin velat komma hem till ett personligt välkomnande? Med en Raspberry Pi och några enkla komponenter kan du! I detta enkla projekt kommer vi att använda en reed switch för att utlösa en temalåt när en dörr öppnas. Vi kommer att använda en Raspberry Pi som styrenhet här, även om du kan använda nästan vilken annan mikrokontroller som helst för det här projektet med samma krets. Här är en demo.
Du kommer behöva
Du kommer förmodligen redan att äga alla delarna du behöver för att göra detta förutom reed switchen, som är runt $2–3, eller så kan du få ett paket med 5 för drygt $8 här.
En Raspberry Pi (vilken modell som helst fungerar för detta). 1 x 220 Ohm motstånd. 1 x 1K Ohm motstånd. 3 x 10K Ohm motstånd. 1 x magnetisk reed switch. 1 x LED. 2 x Tryckknappsbrytare. Bakbord. Anslut kablar. Datorhögtalare eller liknande.
Vi kommer att använda Raspberry Pi för att spela en låt när rummet kommer in, och designa en krets med knappar på vår breadboard för att aktivera den på en fördröjning och stoppa programmet.
Detta projekt, även om det är gjort mestadels för skojs skull, täcker grunderna för många applikationer inom DIY-hemautomation och även DIY-hemsäkerhet
Komma igång
Låt oss börja med att göra vår krets. Se till att din Pi är strömlös och ställ in din krets så här:
Lysdioden är ansluten till stift 7 på vår pi. De två tryckknappsomkopplarna är anslutna till stift 11 och 13, och reedomkopplaren ansluts till stift 15. Vår kraft går till stift 1 (3v3) och stift 6 (Gnd).
Se till att kontrollera att allt är på exakt rätt plats.
Medan du testar det här projektet kan det hjälpa att hålla din reed-brytare framför dig så att du enkelt kan slå på eller av den. I det här fallet var tungströmbrytaren redan installerad ovanför dörren. När ditt projekt väl är igång kan du antingen tillfälligt fästa strömbrytaren på din dörr med tejp, eller om du känner dig mer säker kan du fästa den mer permanent för användning i framtida projekt!
Anslut 3,5 mm-jackutgången på din Pi till ditt högtalarsystem. När allt är ihop ska det se ut ungefär så här:
Observera att brödbrädan som används här har sina kraftskenor tvärtom mot Fritzing-diagrammet ovan.
Slå nu på din Pi och få tillgång till den med SSH så att vi kan komma åt terminalen. Om du inte är säker på hur du gör detta kan den här guiden hjälpa dig. Om du använder din Raspberry Pi med en bildskärm, mus och tangentbord, hoppa över detta steg och öppna terminalen.
Innan du sätter igång är det värt att kolla om du är uppdaterad. Typ
sudo apt-get update
in i terminalen.
Nu kan vi gå vidare till att få vår Pi att prata med vår krets.
Testar vår installation
Till att börja med, låt oss kontrollera vår krets med ett enkelt program. Om du är säker på att du har kopplat allt rätt så långt kan du hoppa över det här steget, även om jag skulle rekommendera det eftersom det kan spara huvudvärk senare.
Om du aldrig har programmerat i Python tidigare och känner dig lite förskräckt finns det en mängd fantastiska webbplatser som kan hjälpa dig att komma igång.
Skapa ett nytt skript i terminalen:
nano test.py
När den är öppen lägger du till den här koden i filen och trycker på Ctrl-C för att avsluta, följ dialogrutan för att spara:
#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()
Denna kod läser av knapparnas värde och skrivs ut på skärmen när de ändras. De två tryckknapparna har neddragningsmotstånd, så de rapporterar HÖG när de trycks ned. Reedmagnetomkopplaren rapporterar HÖG när den medföljande magneten är nära.
Kör programmet:
python test.py
Du bör se LED-lampan tändas och en rapport till skärmen när du trycker på dina två knappar och drar bort magneten från din reed-omkopplare. Om du inte får feedback när du trycker på knappar, kontrollera dina kretsar igen och se till att allt är anslutet som det ska. När du är klar med att testa, tryck CTRL-C för att stoppa programmet.
Nu kan vi sätta ihop ett enkelt program för att ställa in, trigga och återställa vår dörrsensor. Vi kommer att gå igenom koden i delar och kortfattat förklara vad varje del gör, men om du vill se hela koden, scrolla ner för att se den presenterad i sin helhet.
Vi måste börja med att importera några moduler:
import Rpi.GPIO as GPIO
import pygame.mixer
import time
Vi kommer att använda Pygame modul för att spela vår musik. Det kommer som standard med Raspbian Jessie och är ett fantastiskt bibliotek för allt du behöver för att göra Python-spel och många andra fantastiska projekt.
Vi kommer att använda en variabel som heter aktiva för att avgöra om vårt system är aktivt eller inte. Låt oss definiera ett par funktioner som kommer att göra detta för oss:
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
Den första funktionen här skapar en variabel med namnet aktiva, och ställer in den på 0. Att ge det aktiva tillståndet ett numeriskt värde innebär att om du planerar att senare skala upp ditt program till att ha olika aktiva tillstånd kan du numrera dem därefter. Även om det kanske inte är den bästa Python-programmeringen i världen, kommer det mer än att räcka för det här projektet.
Den andra funktionen när den anropas kontrollerar om systemet är aktivt (eller aktiv==1). Om det är det ställer det in systemet på att inte vara aktivt (aktiv==0), släcker lysdioden och skriver ut till konsolen. Om den inte är det, ger den dig en 10 sekunders nedräkning för att lämna rummet där lysdioden blinkar, innan den förblir tänd för att visa att systemet är aktivt.
Nu kan vi definiera en funktion som kommer att se vår reedmagnet växla:
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)
Vi skapar en annan variabel här som heter spelar — detta är helt enkelt till för att stoppa programmet som försöker börja spela upprepade gånger när omkopplaren utlöses.
Inne i while-loopen startar den första if-satsen musiken (som vi inte har någon av ännu, men oroa dig inte, den kommer). Den låter bara musiken starta om systemet är aktivt, reedomkopplaren är öppen och den inte redan spelar.
Den andra if-satsen är för vår utgångsknapp. Om du trycker på denna knapp stoppar musiken och programmet avslutas.
Den tredje if-satsen är för att växla om systemet är aktivt eller inte. De tid.sömn Funktionen här är att förhindra att flera knappar läses när den trycks ned.
Nu är det dags att sätta upp Pis stift.
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)
Om du har experimenterat med Pi tidigare bör detta vara bekant för dig. De initial=GPIO.LOW argumentet i stift 7:s inställningar sätter det till lågt så snart det initieras.
Nu kan vi anropa vår funktion som kommer att ställa in systemet så att det inte är aktivt när programmet startar.
activeSetup()
Musik Maestro!
Vid det här laget bör vi börja tänka på vilken musik vi ska spela. Du kan välja vilken musikfil du vill, men vi kommer att välja något som är tillgängligt för alla för tillfället. Om du tittar på YouTube är du förmodligen redan bekant med Kevin MacLeods musik. Låt oss ladda ner en fantastisk låt av honom som heter “One-eyed Maestro”. Detta, tillsammans med mycket av musiken på hans webbplats, är licensierat under Creative Commons, och det finns många goda skäl att använda innehåll med dessa licenser för dina projekt.
Tillbaka i vår kod måste vi starta Pygame-mixern och ladda vår låt.
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))
Den första raden i detta block initierar Pygame mixer. Det sista argumentet inom parentes är bufferten som styr latensen i vilken ljudet spelas. Om du upplever hackig uppspelning senare när din musik spelas, försök att öka detta antal till 4096. Inställningarna som de är fungerar utan problem på en Pi 3.
Om du laddade ner din musikfil till en annan katalog än din door.py programmet måste du ange hela sökvägen inom parentes när du definierar namnvariabeln.
Nu återstår bara att sätta upp en loop som väntar på att vi antingen aktiverar programmet eller avslutar det.
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()
Denna while-loop väntar på en inmatning från någon av knapparna och avslutar eller ändrar tillståndet till aktivt i enlighet med detta. Om tillståndet för aktiv blir 1, då watch Door funktion vi definierade tidigare anropas och nästa gång dörren öppnas kommer vår låt att spelas. Vi ringer också GPIO.cleanup() att återställa våra stift vid utgång, vilket i allmänhet är en bra praxis för all programmering på Raspberry Pi.
Det är allt vi behöver göra för att få igång det här projektet, här är koden i sin helhet:
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()
Om du scrollade ner här för att ta hela koden direkt, kom ihåg att du fortfarande måste ladda ner musiken till din Pi för att det ska fungera!
Nu borde du ha en fungerande välkomsthemstemalåt! Fäst din vassbrytare på din dörr och prova den. Pinsam dans är valfritt men rekommenderas.
Det här projektet täckte grunderna för många former av hemövervakning, säkerhet och automatisering, och förhoppningsvis var det också roligt!
Nu när du har kommit så långt, varför sluta där? Du kan lägga till fler spår och låta programmet välja ett slumpmässigt från en lista. Du kan lägga till ett relä och låta andra objekt triggas vid inträde. Om du har ett hemmusiksystem, varför inte ha en temalåt för varje rum?
Kommer du att designa ditt eget personliga välkomstmeddelande? Har du varit uppfinningsrik med vassbrytare i ditt hem på andra sätt? Om så är fallet, lämna en kommentar om vad du planerar eller redan har gjort i kommentarsfältet nedan!
Om författaren
Ian Buckley (220 artiklar publicerade)
Ian Buckley är en frilansjournalist, musiker, artist och videoproducent bosatt i Berlin, Tyskland. När han inte skriver eller står på scen, pysslar han med DIY-elektronik eller kod i hopp om att bli en galen vetenskapsman.
Mer från Ian Buckley
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera
