Be­wa­king 1.0

Laat de Pi Ze­ro je een mail­tje stu­ren als de deur van je huis of koel­kast open staat.

C’t Magazine - - Praktijk | Pi Zero: deur-/raambeveiliging - Jan Mul­der

Er zijn van die si­tu­a­ties waar je geen zicht op hebt. Je kunt bij­voor­beeld de deur van je ga­ra­ge van­uit je huis niet zien, of je hebt de koel­kast­deur open la­ten staan. De Pi Ze­ro W is ide­aal om een deur of raam te con­tro­le­ren en een mail­tje te stu­ren als hij open­staat.

Het be­gon al­le­maal met wat hui­se­lijk on­ge­mak. Het ge­beur­de een paar keer dat de voor­deur op een kier bleek te staan, ter­wijl ik dacht dat hij dicht was. Ik had hem na­me­lijk niet goed ge­noeg in het slot ge­duwd. Van­uit de woon­ka­mer of de slaap­ka­mer was dat na­tuur­lijk niet te zien. Nu houd ik wel van ver­ras­sin­gen, maar niet als er plot­se­ling een vreem­de in mijn woon­ka­mer zou staan. Het­zelf­de sce­na­rio kun je be­den­ken voor je ach­ter­tuin. Als de poort­deur niet op slot is, kan ie­der­een zo­maar in­eens in je tuin staan. En om nou aan el­ke deur een alarm met si­re­ne te plaat­sen is wat over­dre­ven. Van­daar dat ik op zoek ging naar een zelf­bouw­op­los­sing met de com­pac­te Pi Ze­ro. En dat bleek een leuk avon­tuur in hard- en soft­wa­re.

De kern van dit pro­ject is een sim­pe­le mag­neet­scha­ke­laar zo­als die in veel deur- en raam­con­tac­ten zit. Dat wil zeg­gen aan de deur of het raam zelf zit een klein mag­neetje en aan de deur­post een 'reed con­tact'. Een reed con­tact is een dun gla­zen­buis­je met daar­in twee dun­ne me­ta­len lip­jes die even­wij­dig naast el­kaar zit­ten. Wan­neer de deur ge­slo­ten is, zit de mag­neet vlak naast de sen­sor. De lip­jes wor­den dan door de mag­neet te­gen el­kaar ge­trok­ken waar­door er een ge­slo­ten elek­trisch cir­cuit ont­staat. Gaat de deur open, dan zit de mag­neet niet meer te­gen de sen­sor aan en gaan de lip­jes van el­kaar af, het cir­cuit wordt ver­bro­ken. Dit pro­ject is ook ge­schikt als uit­gangs­punt voor an­de­re (uit­ge­brei­de­re) toe­pas­sin­gen, bij­voor­beeld om au­to­ma­tisch een bui­ten­lamp aan te doen en een foto te ma­ken als de tuin­deur open­gaat. De mo­ge­lijk­he­den zijn le­gio.

Voor­be­rei­din­gen

Het reed con­tact en de bij­be­ho­ren­de mag­neet haal­den we uit een oud kast­lamp­je. Aan­ge­zien we maar een paar van de GPIO-pins no­dig heb­ben, hoef je niet per se een 40-pins he­a­der op de Pi Ze­ro te sol­de­ren. We wil­den het ge­heel com­pact hou­den, zo­dat het reed con­tact bij de Pi in de of­fi­ci­ë­le Pi Ze­ro-be­hui­zing past. We sol­deer­den daar­om het reed con­tact en de led recht­streeks op de be­tref­fen­de GPIO-gaat­jes (zie sche­ma). Maar wil je er geen per­ma­nen­te op­los­sing van ma­ken of eerst het een en an­der uit­pro­be­ren, ge­bruik dan een (mi­ni)bre­ad­board en jum­per wi­res om de boel aan te slui­ten. Je moet dan nog wel eerst de 40pins he­a­der uit het Adap­ter Pack op de Pi sol­de­ren. Voor­zie de Pi daar­na van de adap­ters voor hd­mi en usb en sluit daar een mo­ni­tor en een toet­sen­bord met in­ge­bouwd touch­pad of track­ball op aan (voor toet­sen­bord plus los­se muis heb je ook nog een usb­hub­je no­dig). Zorg dat Rasp­bi­an op het sd-kaartje staat en naar de laat­ste ver­sie is ge­üp­da­tet door in de ter­mi­nal het com­man­do:

su­do apt-get up­da­te && su­do apt-get

up­gra­de -y

uit te voe­ren.

Ver­geet niet om bij een nieu­we in­stal­la­tie in Pixel via het me­nu 'Pre­fe­ren­ces / Rasp­ber­ry Pi Con­fi­gu­ra­ti­on' het stan­daard wacht­woord ('rasp­ber­ry') te ver­an­de­ren in iets vei­li­gers (tab­blad Sy­s­tem) en de tijd­zo­ne, toet­sen­bord­lay-out en even­tu­eel taal in te stel­len (tab­blad Lo­ca­li­sa­ti­on). Sluit de Pi nu af en maak de stroom­ka­bel los.

Com­po­nen­ten aan­slui­ten

Daar­na is het tijd om de elek­tro­ni­ca aan te slui­ten. Dat is in dit ge­val erg sim­pel. Sluit op het bre­ad­board het reed con­tact en het rode led­je aan vol­gens het sche­ma en ver­bind ze met de jum­per­ka­bels aan de GPIO-poor­ten van de Pi. Let op: stroom gaat maar in één rich­ting door de led. En aan de plus-zij­de (ano­de, het lan­ge poot­je) moet ook nog een weer­stand­je ko­men. Het led­je fun­geert als ex­tra con­tro­le voor de wer­king van het deur­con­tact. We ge­bruik­ten voor het reed con­tact de pin­num­mers 12 (GPIO18) en 34 (GND). Dan kan hij na­me­lijk mooi plat­lig­gen, als we hem di­rect op de GPIO-gaat­jes aan­slui­ten. En voor de led ge­bruik­ten we de pin­num­mers 11 (GPIO17) en 9 (GND); dus de plus met voor­ge­plaatste weer­stand komt op GPIO17. Wan­neer al­les goed zit, is het tijd om de stroom aan te slui­ten en de Pi op te star­ten.

Co­de

Start via het me­nu de Py­thon 3 pro­gram­meer­om­ge­ving (IDLE) en maak een nieuw be­stand aan. Sla dat op als deur­alarm.py. Typ in het le­ge be­stand de vol­gen­de re­gels:

im­port RPi.GPIO as GPIO GPIO.set­mo­de(GPIO.BCM) deur_pin = 18

Met de eer­ste twee re­gels im­por­te­ren we de be­no­dig­de bi­bli­o­the­ken in de GPIO­na­mes­pa­ce. set­mo­de(GPIO.BCM) in re­gel drie zorgt er­voor dat Py­thon de GPIO-pin­num­me­ring van de pro­ces­sor (BCM, Broad­com) ge­bruikt en niet de num­me­ring van de pin­nen zelf (GPIO.BOARD). Daar­on­der zet­ten we de be­tref­fen­de num­mers in twee va­ri­a­be­len.

Daar­na volgt het in­stel­len van de uit­gangs­toe­stand van de GPIO-pin voor het reed con­tact. We zet­ten hem hoog (1) zo­dat hij bij het weg­ha­len van de mag­neet naar 0 gaat, de trig­ger voor alarm: GPIO.setup(deur_pin, GPIO.IN,

pul­l_up_­down=GPIO.PUD_UP)

Nu kun­nen we met een lus dit on­ein­dig door la­ten lo­pen:

whi­le True: if GPIO.in­put(deur_pin): print ("DEUR is OPEN!")

Sla het be­stand op en druk op F5 om de co­de te tes­ten. In het shell-ven­ster van Py­thon moet nu na en­ke­le se­con­den de mel­ding DEUR is OPEN! her­haal­de­lijk ver­schij­nen met een in­ter­val van een hal­ve se­con­de. Houd de mag­neet naast het reed con­tact, en de mel­din­gen stop­pen. Ge­bruik Ctrl+C om het script te stop­pen.

Als de­ze eer­ste test ge­lukt is, kun­nen we het script uit­brei­den, zo­dat bij een open deur ook de led gaat bran­den:

im­port RPi.GPIO as GPIO GPIO.set­mo­de(GPIO.BCM)

deur_pin = 18 le­d_pin = 17

GPIO.setup(deur_pin, GPIO.IN,

pul­l_up_­down=GPIO.PUD_UP) GPIO.setup(le­d_pin, GPIO.OUT)

whi­le True: if GPIO.in­put(deur_pin): GPIO.out­put(le­d_pin, True) print ("DEUR is OPEN!")

Hier­na voe­gen we aan de lus een elif toe om wan­neer de deur weer dicht is, de led uit te zet­ten en de mel­ding 'DEUR is DICHT!' te ge­ven.

whi­le True: if GPIO.in­put(deur_pin): GPIO.out­put(le­d_pin, True) print ("DEUR is OPEN!") elif GPIO.out­put(le­d_pin,

Fal­se) print ("DEUR is DICHT!")

Als dit werkt, komt de vol­gen­de stap: het ver­stu­ren van een waar­schu­wing per mail. Daar­voor moe­ten we bo­ven­in het script de smtp-bi­bli­o­theek voor Py­thon im­por­te­ren im­port smt­plib, en ver­vol­gens de in­stel­lin­gen voor de mail, de mail­ser­ver en het mail­ac­count toe­voe­gen; als laat­ste wordt het he­le be­richt sa­men­ge­steld:

#setup van gmail-mail

TO = 'mijn-eer­ste-ac­count@gmail.com' SUBJECT = 'Deur­alarm'

TEXT = 'Deur is open!'

#setup van gmail-af­zen­der gmail_­sen­der =

'mijn-twee­de-ac­count@gmail.com' gmail_­passwd = 'mijn gmail-wacht­woord'

#setup van gmail-ser­ver ser­ver = smt­plib.SMTP('smtp.gmail.com',

587)

ser­ver.ehlo() ser­ver.starttls() ser­ver.ehlo ser­ver.lo­gin(gmail_­sen­der,

gmail_wacht­woord)

#gmail be­richt

BODY = '\r\n'.join([

'To: %s' % TO,

'From: %s' % gmail_­sen­der , 'Subject: %s' % SUBJECT , '',

TEXT

])

Ver­geet niet om de dum­my-gmail­ac­counts en het -wacht­woord in het script te ver­van­gen door je ei­gen ge­ge­vens. Het bes­te kun je hier apar­te mail­ac­counts voor aan­ma­ken. Tot slot voe­gen we de op­dracht voor het ver­stu­ren van de mail toe aan de if-sta­te­ment in de lus:

ser­ver.send­mail(gmail_­sen­der, [TO],

BODY)

De elif-sta­te­ment daar­na zet al­les weer te­rug naar de uit­gangs­po­si­tie en be­ves­tigt dat in de shell met de tekst "DEUR is DICHT!":

elif Cur­rent_Sta­te==0 and Pre­vious_

Sta­te==1: GPIO.out­put(le­d_pin, Fal­se) print ("DEUR is DICHT!") Pre­vious_Sta­te=0

In de de­fi­ni­tie­ve co­de ge­brui­ken we de va­ri­a­be­len Cur­rent_Sta­te en Pre­vious_Sta­te om de hui­di­ge en voor­gaan­de toe­stand (0 of 1) vast te leg­gen, zo­dat we die als re­fe­ren­tie kun­nen ge­brui­ken voor het scha­ke­len van de ac­ties.

Voor de af­wer­king heb­ben we de he­le lus ten slot­te in een try-ex­cept sta­te­ment ge­zet, zo­dat je het pro­gram­ma met Ctrl+C kunt stop­pen zon­der dat de in­ter­pre­ter met een Key­boar­dIn­ter­rupt-ex­cep­ti­on komt. Hier­bij wor­den als laat­ste de GPIOpins ook ge­re­set. Zie voor de he­le Py­thon­co­de de link on­der­aan dit ar­ti­kel.

En ver­der

Dit pro­ject is be­doeld als op­zet­je dat je ver­der kunt uit­brei­den en aan­pas­sen aan je ei­gen wen­sen. Om te be­gin­nen zou je wil­len dat bij het op­star­ten van de Pi het script au­to­ma­tisch start. Daar­voor open je het be­stand /etc/rc.lo­cal:

su­do na­no /etc.rc.lo­cal

en voeg je bo­ven de laat­ste re­gel exit 0 de vol­gen­de re­gel toe:

py­thon /ho­me/pi/deur­alarm.py &

Zorg ver­vol­gens dat de Pi op­start in de com­mand­line in­ter­fa­ce, 'Voor­keu­ren / Rasp­ber­ry Pi Con­fi­gu­ra­tie / Sys­teem / Naar CLI'. Wat het Py­thon-script be­treft kun je bij­voor­beeld nog een ver­tra­ging in­bou­wen in de re­gi­stra­tie of de deur open­staat. Dan krijg je al­leen een mel­ding als de deur lan­ge­re tijd open blijft staan, en niet el­ke keer als hij kort even open gaat. Daar­voor kun je bij­voor­beeld een re­gel met ti­me. sleep(10) toe­voe­gen aan het be­gin van de lus, di­rect on­der de re­gel Cur­rent_Sta­te = GPIO.in­put(deur_pin). Ver­geet niet om he­le­maal aan het be­gin van het script de re­gel im­port ti­me toe te voe­gen. De hard­wa­re is uit te brei­den met bij­voor­beeld een pir-sen­sor en een ca­me­ra om een foto te ma­ken en in de mail mee te stu­ren, tel­kens wan­neer er ie­mand bin­nen­komt. Je zou in plaats van de mail ook een mes­sen­ger kun­nen ge­brui­ken voor het ver­stu­ren van de mel­din­gen.

Om de Pi op af­stand te be­he­ren, kun je ssh ge­brui­ken of als je al­les lie­ver via de GUI doet, de VNC Vie­wer. Bei­de moet je eerst nog ac­ti­ve­ren in 'Voor­keu­ren / Rasp­ber­ry Pi Con­fi­gu­ra­tie / In­ter­fa­ces'. (jmu)

Al­les past met ge­mak in de of­fi­ci­ë­le Pi Ze­ro be­hui­zing. Zorg dat het reed con­tact te­gen de be­hui­zing aan ligt om een zo goed mo­ge­lijk con­tact met de mag­neet te krij­gen. Het led­je kan door het dek­sel­tje met het gaat­je naar bui­ten ste­ken.

Het aan­sluit­sche­ma is su­per­sim­pel. Zorg dat de GPIO-num­mers in het script over­een­ko­men met de ge­bruik­te GPIO-aan­slui­tin­gen.

Het script stuurt een mail­tje met de alarm­mel­ding.

Newspapers in Dutch

Newspapers from Netherlands

© PressReader. All rights reserved.