Introduction: MotionSensorPI

About: student NMCT at Howest (Kortrijk Belgium)

Dit project gebruikt een infrarode motion sensor om beweging te detecteren. via de raspberry pi camera module wordt er dan een foto of video genomen. hierop wordt deze naar de database op de pi doorgestuurd. via een zelfgemaakte website kun je deze logs dan beheren en de foto's of video's bekijken.

De code voor het project is te vinden op GitHub

Step 1: BOM

De lijst van materialen die gebruikt werden in dit project:

  1. 2 PIR Motion sensors
  2. Raspberry Pi NOIR camera v2
  3. 2 Raspberry Pi Model 3
  4. 1 16x2 LCD scherm
  5. 3 solderless breadboards
  6. 1 Led
  7. 1 Drukknop
  8. 3 weerstanden(1 van 10k ohm, 2 van 220 ohm)

De materialen voor de behuizing:

  1. Plexiglass scheufdeur
  2. Blauwe verf
  3. Lijm
  4. Triplex hout 5mm
  5. houtstaaf 1 op 1 cm

Step 2: Opbouw Raspberry Pi's

Op de eerste pi sluiten we de motion sensor aan. Deze heeft een 5v ingang, grond uitgang, en de vout(deze stuurt een hoog signaal als er beweging is). sluit de 5v aan op de 5v van de pi, de grond op de grond van de pi en de vout naar een GPIO pin.

op de andere raspberry pi sluit je een led en een knop aan. bij beiden steek je een weerstand van 220 ohm. sluit beide onderdelen aan op de grond van de pi. beiden sluit je vervolgens aan op een GPIO poort.

op het lcd scherm sluit je de eerste pin naar de grond aan, de tweede naar de 5v, de dered kan je aansluiten op het middenste been van een trimmer om de helderheid te regelen. de 4de en 6de pin sluit je aan op een GPIO pin. de 5de is altijd 0 in de ocde dus deze kan je gewoon op de grond aansluiten. In 4 bits modus hebben we de volgende 4 pinnen niet nodig. de volgende 4 sluit je aan op GPIO pinnen. we gebruiken deze om de data naar het scherm te sturen. de laatste 2 pinnen sluiten we aan op de 5v en de grond.

Step 3: Database

De database is redelijk gemakkelijk op te zetten.

de tabel comments is optioneel. enkel als je comments vanop de website wil bewaren hoef je deze aan te maken.

Maak vervolgens de user tabel aan, deze heeft een username en een password alsook een rol waarmee je inlogt.

De tabellen locatie en type zijn identiek, beiden hebben een ID dat auto incrementeert en een veld met de naam van de locatie of het type.

De belangrijkste tabel is de logs tabel, hierin komen alle instanties van beweging die onze motion sensor detecteert.

Maak eerst een ID aan dat autoincrementeert. voeg een kolom LOCID van het zelfde type als het ID in de tabel locatie toe. doe vervolgens hetzelfde voor het TypeID. we hebben ook een tijdstip nodig waarop de foto of video is genomen. Je wil ook de bestandsnaam opslaan zodat je het bestand op je website kan ophalen zet deze als een unieke kolom je kan immers geen twee dezelfde files hebben. voorts is er ook een notitieveld en een ja of nee veld of die log belangrijk is.

Nu link je het id in de tabel locatie met hetgene je aangemaakt hebt in de tabel logs. doe dit nog eens voor het typeID. zorg ervoor dat het een 1 op veel relatie is. de veel kant zijn de meerdere strepen, de 1 kant is de platte streep.

Step 4: 4 Bit Klasse Voor LCD Scherm

De lcd klasse initieert eerst alle GPIO pinnen die we aangesloten hebben en een setup functie waarin we bepalen hoe we die pinnen gaan gebruiken. om het scherm juist te initialiseren maken we een functie init wwarin de manuele reset en de clear display functie gebruikt wordt.

verder heb je ook functies nodig om data en instructies te versturen als 1 of 0 en een functie om de data te lezen en deze naar de datapinnen van het LCD scherm door te sturen.

de allerlaatste functie is de sendstring functie. Hiermee versturen we tekst naar het scherm waarop dit wordt weergegeven.

vervolgens geven we de knop en led de juiste GPIO poort. Ook maken we een object van onze scherm klasse aan met de gebruikte GPIO poorten. In de main functie kiezen we hoe de led en knop worden gebruikt.

vervolgens maken we de server aan waarop we de data van de andere raspberry pi gaan ontvangen. ik gebruik hier het IP adress dat mijn router standaard aan deze pi geeft, als je dit een lege string laat zeg je dat welk ip adress deze pi heeft men er kan op connecteren. we geven ook mee dat we maar 1 connectie willen hebben op deze server. wil je meerdere motion sensors en raspberry's gebruiken kan je dit verhogen door socket.listen(2-3-4-..)

gebruikt de main functie uit de loop. in de loop zelf kijken we naar de status van de knop, dan initialiseren we het scherm en sturen we een tekst om af te printen vervolgens krijgen we de data binnen op onze connectie. is deze data het woord beweging dan doen we een while lus die enkel stopt als je op de knop gedrukt hebt. we laten de led branden en een waarschuwing tonen totdat je de knop indrukt om te laten tonen dat je deze gezien hebt.

als dit is gebeurt dan word de led gedoofd en krijg je een boodschap te zien. hierna wachten we 2 seconden en begint de loop opnieuw.

Step 5: Aanmaken Logs

lijn 1-7 zijn het importeren van libraries die we nodig hebben. (Time voor tijd, socket voor de communicatie tussen beide pi's, ....)

lijn 11 maak een camera object aan.

lijn 13 is het declareren van de motion sensor: zet hier de GPIO pin waarop je hem hebt aangesloten.

lijn 14-15 bepalen of je video of foto modus wil.

lijn 17-18 is het declareren van de sensor als een ingang. zo krijgen we een signaal binnen als er beweging is

via lijn 19-20 maken we een verbinding waarmee we naar de tweede pi met het lcd scherm data kunnen sturen.

als ip adress geef je hier het ip mee van de andere pi. als poort neem je best een hoger nummer(2000-10000....)

LET OP!! connecteer je via dhcp dan verandert het ip van de server. verander dit IP dan ook naar hetgene waarmee de andere raspberry pi op het netwerk geconnecteerd is.

de functie motion krijgt de foto en video variabelen mee. zo bepaalt hij of er een foto of video wordt genomen.

de filename stellen we in als jaar maand dag underscore uren minuten seconden na het aanmaken van de foto geef je deze mee aan de database samen met de locatieID, datum, Type en de filenaam.

op lijn 43 openen we een lus die constant blijft draaien tot als de pi word afgesloten. via de wait_for_edge op de sensor kijk de pi of het signaal verandert van 0 naar 1 vervolgens stuurt hij het woord beweging naar de tweede pi, en maak hij een foto of video via de motion functie daarna wacht hij tien seconden en begint de loop opnieuw. bij een exception sluit je de camera en maak je de GPIO pinnen leeg in het geheugen.

Step 6: Database Klasse

we maken een tweede python file aan voor de link met onze database. door deze in een klasse te steken kan je deze in alle andere file gebruiken via een import statement.

in de init zet je de host waarop de database draait samen met de gebruiker waarmee je op de database inlogt en de naam van de database. vervolgens kun je een functie maken die sql query's maakt en deze uitvoert op de database.

in deze file zijn er query's om een volledige tabel op te halen of enkel records met een bepaalde waarde. ook functies om een record te deleten of te updaten alsook een volledig nieuw record in een tabel toetevoegen.

lijn 15 alle records

lijn 70 met voorwaarde

lijn 82 nieuw record

lijn 102 deleten record

lijn 152 updaten record

Step 7: Python File Voor De Flask Routes

flask maakt gebruik van routes om een gebruiker te leiden op een website. bovenaan importeren we eerst flask zelf alsook de functies session, request en render_template van flask. ook de onze database klasse importeren we hier en os om zaken uit te voeren op de schijf van de pi zelf.

De index route van onze website kijkt of onze sessie logged in is. indien dit het geval is krijgen we de home pagina te zien anders krijgen we het login scherm te zien. de login pagina gebruikt een formulier om in te loggen. om dit te kunnen gebruiken geven we de methode post mee met de route als het formulier verzonden wordt sturen we dit naar hier. vervolgens kijkt de functie of de gebruiker in de database zit is dit het geval dan loggen we in anders komen we terug op het login scherm.

voor elke pagina is er een route

voor de log pagina bijvoorbeeld halen we alle logs uit de database op geven we die mee met de route waardoor we deze kunnen af printen in een tabel.

je wil op de website ook logs kunnen verwijderen. dit gebeurt opnieuw via een form. zie lijn 98-110. als je een log verwijdert moet de file ook verwijdert worden via os.remove en het volledige path waar de file is opgeslagen wordt de file ook op de pi zelf gewist.

lijn 121-129.

via de display route geven we de foto of video weer. we geven via een form het id van de log die we willen zien mee.

we halen die log uit de database. LET OP!!! deze wordt hierna als een tuple in een list gestoken. om enkel de filenaam en het type te kunnen meegeven moet je aan python zeggen ik wil x[3] = type 3rde kolom voor elk type in de log die we uit de database hebben gehaald. dit is er maar 1 dus uit die log haal hij kolom 3 wat het type is. dit geven we mee zodat we op de display pagina kunnen beslissen of we een foto of video weergeven. via de filenaam haal je de file van de raspberry pi en geef je hem weer.

lijn 131-140

hier kun je een log updaten met een notitie en beslissen of het belangrijk is of niet ook hier gebruik je een form.

bij de formulieren in de tabellen maak je het best gebruikt van verborgen input velden. zo zie je enkel de knop zelf en blijft de tabel overzichtelijk.

Step 8: Html Files

je maakt een basis html aan waarop alle pagina's zich zullen baseren. hierin heb ik een navigatie gestoken als header, een footer en een middengedeelte dat elke pagina zelf kan opvullen.

op de verschillende pagina's zeg je dan dat men zich moet baseren op de basis html. via de verschillende blokken kan je in het block body dan op elke pagina dit verschillend opvullen. voor de pagina's met tabellen maak je dan een for loop die voor elke rij deze afprint. op het einde steek je dan een form voor het deleten van die rij en in het geval van de logs nog een form voor het bekijken van die foto of video.

we gebruiken input type hidden zodat deze niet te zien zijn, alse value kan je deze dan de variabele meegeven uit de database die je nodig hebt. bij logs is dit het LOGID dit is log[0](eerste kolom) en de filenaam dit is kolom 4 log[4].

Step 9: Behuizing

De behuizing bestaat uit een houten van lengte 25 cm hoogte 6 cm en breedte 21 cm voor de pi met het LCD scherm en lengte 21 cm hoogte 8 cm en breedte 15 cm voor de pi met de motion sensor.

na het tekenen van de afmetingen op het hout zaag je deze vlakken eruit. vervolgens schuur je de randen zo best mogelijk glad. zorg zeker voor wat speling zodat de vlakken vlot met een tussenschot over mekaar gelijmd kunnen worden. maak een opening voor de netwerk- en powerkabel op de lcd pi en de power en netwerkkabel alsook de camera en de motion sensor op de andere pi. na het lijmen laat best een paar uur drogen schilder vervolgens de behuizing in een kleur naar keuze. voor mijn behuizing heb ik blauw gekozen. bij het lcd scherm maak je in het dak een opening voor de schuifdeur. bevestig de gleuven aan beide kanten. snij vervolgens het plexiglass op maat en test de schuifdeur grondig.

Step 10: Extra Howest Netwerk

om de scripts te doen werken op het howest network moet je de wpa supplicant file op beide Pi's aanpassen door het thuisnetwerk in commentaar te zetten en het howest netwerk uit commentaar te halen.

Op de motion sensor pi moet het ip address van de socket dan ook verandert worden naar het nieuwe toegekende ip aan de lcd pi.

start eerste de pi met het lcd scherm op en dan de motion sensor. beiden hebben een paar minuten nodig voor het opstarten.

website gebruikersnaam: Stijnvds

website password: testadmin

motion pi login: pi

password: projectmotion

createlogs file = /home/pi/project1 verander socket.connect((nieuw ip ', 9050))

lcd pi login: stijn@stijnras

password: projectlcd