Sigurnosna kamera Raspberry Pi: 11 koraka (sa slikama)
Sigurnosna kamera Raspberry Pi: 11 koraka (sa slikama)
Anonim
Sigurnosna kamera Raspberry Pi
Sigurnosna kamera Raspberry Pi

Ovo je korak po korak uputstvo o tome kako stvoriti IoT sigurnosnu kameru s pokretom pomoću Raspberry Pi. Naučit ćete kako stvoriti web poslužitelj i obrazac koji omogućuje korisniku da prilagodi osjetljivost fotoaparata i vrijeme snimanja, ručno pokrene/zaustavi snimanje i/ili napravi sliku koja će biti spremljena lokalno.

Supplies

  • Raspberry Pi 3
  • Pi kamera
  • PIR senzor pokreta
  • sd kartica
  • Izvor napajanja

Korak 1: Sastavite hardver

Sastavite hardver
Sastavite hardver
Sastavite hardver
Sastavite hardver
Sastavite hardver
Sastavite hardver
Sastavite hardver
Sastavite hardver

Dok je Pi isključen, umetnite mikro-SD karticu u Pi. Umetnite trakasti kabel modula kamere u priključak modula kamere na Pi. Zatim spojite 3 pina (označeni kao VCC, OUT i GND) PRI detektora pokreta s Pi -jevim GPIO pinovima. Spojite VCC na 5,5 V napajanja, GND na masu, a OUT na pin 11 na Pi.

Korak 2: Provjerite je li vaš Pi povezan s internetom

Uvjerite se da je vaš Pi povezan s internetom
Uvjerite se da je vaš Pi povezan s internetom

Sada uključite Pi povezivanjem na izvor napajanja i provjerite jeste li povezani s internetom pomoću naredbe ping. Ako ne znate kako povezati svoj Pi na internet, kliknite ovdje.

sudo ping www.google.com

Ako ste uspješni, trebali biste vidjeti da Google prima podatke.

Osim toga, možete koristiti ifconfig da vidite svoju IP adresu.

sudo ifconfig

Korak 3: Postavite kameru

Pomoću sljedeće naredbe otvorite konfiguracijsko sučelje i omogućite kameru u "opcijama sučelja".

sudo raspi-config

Nakon ponovnog pokretanja možete prikazati status kamere kako biste bili sigurni da je pravilno povezana.

vcgencmd get_camera

Na kraju, instalirajte modul pikamera.

pip install pikamera

Korak 4: Instalirajte Flask

Instalirajte modul tikvice i tišine za Python:

sudo apt-get install python-dev python-pip

python -m pip install flask flask -restful

Zatim ćemo instalirati modul python flask koji se koristi za kreiranje obrazaca.

pip install flask-wtf

Korak 5: Kreirajte klasu obrasca

Napravite direktorij pod nazivom iotProject u koji će se pohraniti sve vaše datoteke.

sudo mkdir iotProject

Kreirajte python datoteku pod nazivom "camControl.py".

sudo nano camControl.py

U ovoj datoteci ćemo stvoriti našu klasu obrasca, koja nam omogućava kreiranje web obrasca s okvirima za tekst i padajućim izbornikom kako bi korisnik mogao promijeniti postavke kamere, ručno pokrenuti/zaustaviti snimanje i snimiti video.

iz flask_wtf import FlaskFormiz wtforms.validators uvoz DataRequired from wtforms import SubmitField iz wtforms import validators, IntegerField, BooleanField, SelectField

klasa camFrame (FlaskForm):

videoDuration = IntegerField ('Vrijeme snimanja (u sekundama)')

osjetljivost = IntegerField ('Osjetljivost pokreta (raspon 2500-10000) n Što je veći broj, kamera je manje osjetljiva', validators = [validators. NumberRange (min = 2500, max = 10000, message = 'Vrijednost izvan raspona')])

options = SelectField ('Options', choices = [('none', 'No action'), ('rec', 'Start Recording'), ('stop', 'Stop Recording'), ('pic', 'Take Picture')])

submit = SubmitField ('Submit')

Korak 6: Kreirajte predložak bočice

Kreirajte predložak bočice
Kreirajte predložak bočice

Da biste kreirali korisničko sučelje, morate dizajnirati predložak Flask koji koristi obrazac koji ste upravo stvorili. Ova datoteka će biti napisana na html -u i pohranjena u fasciklu pod nazivom predlošci, koja bi trebala biti u istom direktoriju kao i vaš obrazac.

Unutar mape sa predlošcima stvorite datoteku pod nazivom index.html. Unutar ove datoteke ponovite gornji kôd.

Korak 7: Renderirajte predložak

Sada je vrijeme za stvaranje datoteke koja prikazuje predložak. Kreirajte datoteku pod nazivom appCam.py (provjerite da više niste u mapi predlošci). Svaki dinamički sadržaj koji se koristi u predlošku mora se koristiti kao imenovani argument u pozivu na render_template ().

import camControlfrom flask import Flask, render_template, request, Response from flask_restful import Resource, Api, reqparse

app = Flask (_ name_)

app.config ['SECRET_KEY'] = '13542' api = Api (aplikacija)

parser = reqparse. RequestParser ()

parser.add_argument ('dur', type = int, help = 'Trajanje videa kada se detektira pokret') parser.add_argument ('sens', type = int, help = 'Nivo pokreta potreban za pokretanje snimanja') parser.add_argument ('opt', type = str, help = 'Ručno snimite video ili snimite sliku')

ažuriranje klase (resurs):

#Stuff za wtforms def post (self): args = parser.parse_args () #rc.input (args ['dur'], args ['sens'], args ['opt']) #upišite u tekstualnu datoteku koju razgovara sa kamerom koja radi paralelno cameraSettingsFile = open ("cameraSettings.txt", 'w') cameraSettingsFile.write (args ['dur'] + '\ n') #write dur cameraSettingsFile.write (args ['sens'] + '\ n') #write sens cameraSettingsFile.write (args ['opt'] + '\ n') #write opt cameraSettingsFile.close () return {'dur': args ['dur'], 'sens': args ['sense'], 'opt': args ['opt']}

@app.route ('/', methods = ['GET', 'POST'])

def index (): "" "Početna stranica kontrolera" "" form = camControl.camFrame () #ovo je obrazac ako request.method == 'POST': print (request.form) args = [i za i u zahtjevu.form.items ()] #rc.input (int (args [0] [1]), int (args [1] [1]), args [2] [1]) cameraSettingsFile = open ("cameraSettings.txt ", 'w') cameraSettingsFile.write (args [0] [1] + '\ n') #write dur cameraSettingsFile.write (args [1] [1] + '\ n') #write sens cameraSettingsFile.write (args [2] [1] + '\ n') #write opt cameraSettingsFile.close () imageDictionary = {"filename": "image.jpg"} return render_template ('index.html', form = form, image = imageDictionary))

api.add_resource (Update, '/update/')

if _name_ == '_main_':

app.run (host = '0.0.0.0', port = 80, debug = True, threaded = True)

Korak 8: Kreirajte klasu operatora kamere

Sada želimo stvoriti datoteku pod nazivom camOperator.py. U njoj ćemo napraviti klasu fotoaparata s metodama upravljanja kamerom, koristeći već dostupne funkcije PiCamera. U sljedećem koraku koristit ćemo instancu ovog objekta gdje ćemo kombinirati funkcionalnost kamere i senzora pokreta.

Metode definirane u ovoj klasi mijenjaju postavke "snimanja" na sigurnosnoj kameri korištenjem unosa osjetljivosti i trajanja koje korisnik daje, uz utvrđivanje zadanih vrijednosti za ove varijable ako korisnički unos nije prisutan.

uvesti RPi. GPIO kao GPIOuvoz vremena uvesti pikameru iz datuma i datuma uvesti datum -vreme

GPIO.setmode (GPIO. BOARD)

GPIO.setup (11, GPIO. IN)

detektiraj = 0

klasa kamereOperater:

def _init _ (samo):

#constructor self.cam = picamera. PiCamera () self.data = self.dur = 10 self.sens = 2500 self.opt = "none"

def zapis (self, dur):

#Zapisi za zadato trajanje koje je postavio kontroler videoName = str (datetime.now ()) videoName = videoName.replace (':', ') videoName = videoName.replace ('. ',') Self.cam.start_recording ('/home/pi/iotProject/videos/' + videoName + '.h264') time.sleep (dur) self.cam.stop_recording ()

def operacija (self, dur, sens):

#Glavni rad kamere koja neprestano provjerava je li čovjek u blizini, ako se čovjek dovoljno dugo zadržava, počinjemo snimati! globalno otkrivanje i = GPIO.input (11) ako je i == 0: #Kada je izlaz sa senzora pokreta LOW detektuje = 0 time.sleep (0.1) elif i == 1: #Kada je izlaz sa senzora pokreta HIGH ispis (" otkriveno kretanje " +str (otkrivanje)) ako se otkrije> = sens*10: self.record (dur) ispis (" SNIMLJENO ") otkrivanje = 0 time.sleep (0.1) otkrivanje += 1

Korak 9: Kreirajte modul zapisa

Posljednji program potreban za ovaj projekt bit će napisan u datoteci pod nazivom rec.py. Ova datoteka govori kameri kada treba snimati, koliko dugo snima i da li/kada treba snimiti sliku. To čini tako što neprestano provjerava i čita korisničke podatke zapisane u tekstualnu datoteku od koraka 5. Ako je datoteka ažurirana, ona prilagođava vrijednosti osjetljivosti i trajanja prema tome, a zatim, ako je snimljen snimak ili slika, sadržaj sprema u pi, bilo u.h264 ili-j.webp

'' 'Radi paralelno sa flask serverom, čita kontrolne varijable koje postavljaju obrasci servera. Kontrolne varijable poslužitelja postavljaju se u zasebnu datoteku nakon podnošenja obrazaca. Rec modul čita ove varijable i ažurira kameru na osnovu njih. '' 'import camOperator iz datuma i datuma uvoza datuma i vremena uvoza

rc = camOperator.cameraOperator ()

cameraSettingsFile = open ("cameraSettings.txt", 'w') cameraSettingsFile.close () #ovdje, otvaramo i zatvaramo u načinu pisanja kako bismo izbrisali sadržaj unutar datoteke prije pokretanja glavne petlje

#Neprekidna petlja koja nadgleda da li su ljudi u blizini. Ako jesu, onda

#kamera počinje snimanje. Ova funkcija radi paralelno sa serverama #serve koji kontroliše ovu kameru. recordInProcess = False while True: #check/record if (recordInProcess == False): rc.operation (rc.dur, rc.sens) #promenite postavke kamere na osnovu servera cameraSettingsFile = open ("cameraSettings.txt", 'r') settingNum = 0 za postavljanje u cameraSettingsFile.readlines (): ako settingNum == 0: #Promjena trajanja rc.dur = int (postavka) elif settingNum == 1: #Promjena osjetljivosti rc.sens = int (postavka) elif settingNum == 2: #Promjena radnje rc.opt = setting settingNum += 1 cameraSettingsFile.close ()

#izvršite radnju

# if rc.opt == "none": # nastavi ako je rc.opt == "rec / n" i recordInProcess == False: print ("Pokretanje naredbe za snimanje iz kontrolera") # Generirajte naziv za video na osnovu trenutnog vremena videoName = "snappedVid _"+str (datetime.now ()) videoName = videoName.replace (':', ') videoName = videoName.replace ('. ',') rc.cam.start_recording ('/home/pi/iotProject /videos/' + videoName +'.h264 ') recordInProcess = True elif rc.opt == "stop / n" i recordInProcess == True: print ("Zaustavljanje naredbe za snimanje iz kontrolera") rc.cam.stop_recording () recordInProcess = False cameraSettingsFile = open ("cameraSettings.txt", 'w') cameraSettingsFile.write (str (rc.dur)+'\ n') cameraSettingsFile.write (str (rc.sens)+'\ n') cameraSettingsFile. write ("none / n") rc.opt = "none / n" elif rc.opt == "pic / n" and recordingInProcess == False: print ("Snimite naredbu pic sa kontrolera") pictureName = "snappedPic_ "+str (datetime.now ()) pictureName = pictureName.replace (':', ') pictureName = pictureName.replace ('. ',') rc.cam.st art_preview () time.sleep (5) rc.cam.capture ('pictures/' + pictureName + '.jpg') rc.cam.stop_preview () cameraSettingsFile = open ("cameraSettings.txt", 'w') cameraSettingsFile. write (str (rc.dur)+'\ n') cameraSettingsFile.write (str (rc.sens)+'\ n') cameraSettingsFile.write ("none / n") rc.opt = "none / n"

Korak 10: Pokrenite server

Pokrenite server
Pokrenite server

SSH u pi i pokrenite poslužitelj pomoću gore prikazane naredbene linije.

Korak 11: Isprobajte

ISPROBAJ!
ISPROBAJ!
ISPROBAJ!
ISPROBAJ!

Pristupite web stranici pomoću IP adrese i trebali biste moći daljinski upravljati kamerom!

Preporučuje se: