„Raspberry Pi“apsaugos kamera: 11 žingsnių (su nuotraukomis)
„Raspberry Pi“apsaugos kamera: 11 žingsnių (su nuotraukomis)
Anonim
„Raspberry Pi“apsaugos kamera
„Raspberry Pi“apsaugos kamera

Tai žingsnis po žingsnio instrukcija, kaip sukurti „IoT“judesio aktyvuotą apsaugos kamerą naudojant „Raspberry Pi“. Sužinosite, kaip sukurti kolbos žiniatinklio serverį ir formą, leidžiančią vartotojui reguliuoti fotoaparato jautrumą ir įrašymo laiką, rankiniu būdu pradėti/sustabdyti įrašymą ir (arba) padaryti nuotrauką, kuri bus išsaugota vietoje.

Prekės

  • Raspberry Pi 3
  • Pi kamera
  • PIR judesio jutiklis
  • SD kortelė
  • Maitinimo šaltinis

1 žingsnis: Surinkite aparatūrą

Surinkite aparatūrą
Surinkite aparatūrą
Surinkite aparatūrą
Surinkite aparatūrą
Surinkite aparatūrą
Surinkite aparatūrą
Surinkite aparatūrą
Surinkite aparatūrą

Kai „Pi“yra išjungtas, įdėkite „micro-SD“kortelę į „Pi“. Įkiškite fotoaparato modulio juostos kabelį į fotoaparato modulio prievadą „Pi“. Tada prijunkite 3 PRI judesio detektoriaus kaiščius (pažymėtus VCC, OUT ir GND) prie „Pi“GPIO kaiščių. Prijunkite VCC prie 5,5 V maitinimo, GND prie žemės, o OUT prie Pi 11 kaiščio.

2 veiksmas: įsitikinkite, kad jūsų „Pi“yra prijungtas prie interneto

Įsitikinkite, kad jūsų „Pi“yra prijungtas prie interneto
Įsitikinkite, kad jūsų „Pi“yra prijungtas prie interneto

Dabar įjunkite „Pi“prijungdami jį prie maitinimo šaltinio ir patikrinkite, ar esate prisijungę prie interneto naudodami ping komandą. Jei nežinote, kaip prijungti „Pi“prie interneto, spustelėkite čia.

sudo ping www.google.com

Jei jums sekasi, turėtumėte pamatyti, kad „Google“gauna duomenis.

Be to, galite naudoti ifconfig, kad pamatytumėte savo IP adresą.

sudo ifconfig

3 veiksmas: nustatykite fotoaparatą

Naudokite šią komandą, kad atidarytumėte konfigūracijos sąsają, ir įjunkite fotoaparatą „sąsajos parinktyse“.

sudo raspi-config

Po perkrovimo galite rodyti fotoaparato būseną, kad įsitikintumėte, jog ji tinkamai prijungta.

vcgencmd get_camera

Galiausiai įdiekite „picamera“modulį.

pip įdiegti picamera

4 žingsnis: įdiekite kolbą

Įdiekite „Python“kolbą ir kolbą atpalaiduojantį modulį:

sudo apt-get įdiegti python-dev python-pip

python -m pip įdiegti kolbos kolba

Toliau įdiegsime python kolbos modulį, naudojamą formoms kurti.

pip įdiegti kolbą-wtf

5 veiksmas: sukurkite formos klasę

Sukurkite katalogą „iotProject“, kuriame bus saugomi visi failai.

sudo mkdir iotProject

Sukurkite „Python“failą pavadinimu „camControl.py“.

sudo nano camControl.py

Šiame faile sukursime savo formos klasę, kuri leis mums sukurti žiniatinklio formą su teksto laukais ir išskleidžiamuoju meniu, kad vartotojas galėtų pakeisti fotoaparato nustatymus, rankiniu būdu pradėti/sustabdyti įrašymą ir užfiksuoti vaizdo įrašą.

iš „flask_wtf“importavimo „FlaskFormfrom“iš „wtforms.validators“importuoja duomenis

klasės „camFrame“(„FlaskForm“):

videoDuration = IntegerField („Įrašymo laikas (sekundėmis)“)

jautrumas = IntegerField ('Judesio jautrumas (diapazonas 2500–10000) n Kuo didesnis skaičius, tuo fotoaparatas mažiau jautrus “, validatoriai = [validators. NumberRange (min = 2500, max = 10000, message = 'Value out of Range'])

options = SelectField ('Parinktys', pasirinkimai = [('nėra', 'Jokių veiksmų'), ('rec', 'Start Recording'), ('stop', 'Stop Recording'), („nuotrauka“, „Fotografuoti“)])

pateikti = SubmitField ('Pateikti')

6 žingsnis: sukurkite kolbos šabloną

Sukurkite kolbos šabloną
Sukurkite kolbos šabloną

Norėdami sukurti vartotojo sąsają, turite sukurti kolbos šabloną, kuriame būtų naudojama ką tik sukurta forma. Šis failas bus parašytas html ir saugomas aplanke, vadinamame šablonais, kuris turėtų būti tame pačiame kataloge kaip ir jūsų forma.

Šablonų aplanko viduje sukurkite failą pavadinimu index.html. Šiame faile pakartokite aukščiau parodytą kodą.

7 žingsnis: pateikite šabloną

Dabar atėjo laikas sukurti failą, kuris atvaizduoja šabloną. Sukurkite failą pavadinimu appCam.py (įsitikinkite, kad nebėra šablonų aplanke). Bet koks dinaminis turinys, naudojamas šablone, turi būti naudojamas kaip įvardytas argumentas raginant render_template ().

importuoti camControl iš kolbos importo kolba, render_template, request, Response from flask_restful import Resource, Api, reqparse

programa = kolba (_ vardas_)

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

parseris = reqparse. RequestParser ()

parser.add_argument ('dur', type = int, help = 'Vaizdo įrašo trukmė, kai aptinkamas judesys') parser.add_argument ('sens', type = int, help = 'Judėjimo lygis, reikalingas įrašui suaktyvinti') parser.add_argument ('opt', type = str, help = 'Rankiniu būdu įrašykite vaizdo įrašą arba užfiksuokite vaizdą')

klasės atnaujinimas (šaltinis):

#Stuff for wtforms def post (self): args = parser.parse_args () #rc.input (args ['dur'], args ['sens'], args ['opt']) #įrašykite į tekstinį failą, kuris kalbasi su lygiagrečiai veikiančia kamera + '\ n') #write sens cameraSettingsFile.write (args ['opt'] + '\ n') #write opt cameraSettingsFile.close () return {'dur': args ['dur'], 'sens': args ['sense'], 'opt': args ['opt']}

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

def index (): "" "Valdiklio pagrindinis puslapis" "" form = camControl.camFrame () #tai yra forma, jei request.method == 'POST': print (request.form) args = [i for i in request.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 = forma, image = imageDictionary)

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

jei _vardas_ == '_main_':

app.run (priegloba = '0.0.0.0', prievadas = 80, derinimas = tiesa, sriegis = tiesa)

8 veiksmas: sukurkite fotoaparato operatoriaus klasę

Dabar norime sukurti failą, pavadintą camOperator.py. Jame sudarysime fotoaparato klasę su fotoaparato valdymo metodais, naudodami jau turimas „PiCamera“funkcijas. Kitame žingsnyje naudosime šio objekto egzempliorių, kuriame sujungsime fotoaparato ir judesio jutiklio funkcijas.

Šioje klasėje apibrėžti metodai pakeičia apsaugos kameros „įrašymo“nustatymus, naudojant vartotojo pateiktus jautrumo ir trukmės įvestis, tuo pačiu nustatant numatytąsias šių kintamųjų reikšmes, jei nėra vartotojo įvesties.

importuoti RPi. GPIO kaip GPIOimportuoti laiko importavimą picamera iš datetime import data datetime

GPIO.setmode (GPIO. BOARD)

GPIO.setup (11, GPIO. IN)

aptikti = 0

klasės kamera Operatorius:

def _init _ (savarankiškai):

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

def rekordas (savarankiškas, sunkus):

#Records už nurodytą trukmę, kurią nustatė valdiklis '/home/pi/iotProject/videos/' + videoName + '.h264') time.sleep (dur) self.cam.stop_recording ()

def operacija (savarankiškas, sunkus, senas):

#Pagrindinis fotoaparato veikimas, kuris nuolat tikrina, ar šalia yra žmogus, ar žmogus lieka pakankamai ilgai, pradedame įrašinėti! visuotinis aptikimas i = GPIO.input (11), jei i == 0: #Kai judesio jutiklio išvestis yra LOW detekcija = 0 laiko. miego (0,1) elif i == 1: #Kai iš judesio jutiklio išvedamas HIGH print (" aptiktas judesys " +str (aptikti)), jei aptinkama> = sens*10: self.record (dur) print (" RECORDED ") aptikti = 0 laiko. miego (0,1) aptikti += 1

9 veiksmas: sukurkite įrašų modulį

Paskutinė šiam projektui reikalinga programa bus įrašyta į failą pavadinimu rec.py. Šis failas nurodo fotoaparatui, kada įrašyti, kiek laiko įrašyti ir ar/kada fotografuoti. Tai daroma nuolat tikrinant ir skaitant vartotojo duomenis, įrašytus į tekstinį failą nuo 5 veiksmo. Jei failas buvo atnaujintas, jis atitinkamai pakoreguoja jautrumo ir trukmės vertes, o tada, kai padaromas įrašas ar nuotrauka, jis išsaugo turinį pi, arba.h264, arba-j.webp

'' 'Veikia lygiagrečiai su kolbos serveriu, nuskaito serverio formų nustatytus valdymo kintamuosius. Pateikus formas, serverio valdymo kintamieji nustatomi atskirame faile. Rec modulis skaito šiuos kintamuosius ir pagal juos atnaujina fotoaparatą. »importuoti„ camOperator “nuo datos ir laiko importavimo datos importavimo laiko

rc = camOperator.cameraOperator ()

cameraSettingsFile = open ("cameraSettings.txt", 'w') cameraSettingsFile.close () #čia, atidarome ir uždarome rašymo režimu, kad ištrintume failo turinį prieš paleidžiant pagrindinę kilpą

#Nuolatinė kilpa, kuri stebi, ar netoliese yra žmonių. Jei jie yra, tada

#kamera pradeda įrašinėti. Ši funkcija veikia kartu su kolba #serveris, valdanti šią kamerą. recordInProcess = Netiesa, o tiesa: #patikrinkite/įrašykite, jei (recordInProcess == False): rc.operation (rc.dur, rc.sens) #pakeiskite fotoaparato nustatymus pagal serverio cameraSettingsFile = open ("cameraSettings.txt"), 'r') settingNum = 0 nustatymui kamerojeSettingsFile.readlines (): if settingNum == 0: #Duration change rc.dur = int (setting) elif settingNum == 1: #Sensitivity change rc.sens = int (setting) elif settingNum == 2: #Action change rc.opt = setting settingNum += 1 cameraSettingsFile.close ()

#vykdykite veiksmą

# if rc.opt == "none": # tęsti, jei rc.opt == "rec / n" ir įrašymasInProcess == Netiesa: print ("Vykdoma įrašo komanda iš valdiklio") #Generuoti vaizdo įrašo pavadinimą pagal dabartinį vaizdo įrašo pavadinimą = "snappedVid _"+str (datetime.now ()) videoName = videoName.replace (':', ') videoName = videoName.replace ('. ',') rc.cam.start_recording ('/home/pi/iotProject /videos/' + videoName +'.h264 ') recordInProcess = Tikras elifas rc.opt == "stop / n" ir įrašymasInProcess == Tiesa: spausdinti ("Sustabdyti įrašymo komandą iš valdiklio") 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 recordInProcess == False: print ("Snap a pic command from the controller") pictureName = "snappedPic_ "+str (datetime.now ()) pictureName = pictureName.replace (':', ') pictureName = pictureName.replace ('. ',') rc.cam.st art_preview () time.sleep (5) rc.cam.capture ('images/' + pictureName + '.jpg') rc.cam.stop_preview () cameraSettingsFile = open ("cameraSettings.txt", 'w') cameraSettingsFile. rašyti (str (rc.dur)+'\ n') cameraSettingsFile.write (str (rc.sens)+'\ n') cameraSettingsFile.write ("none / n") rc.opt = "none / n"

10 veiksmas: paleiskite serverį

Paleiskite serverį
Paleiskite serverį

SSH į pi ir paleiskite serverį naudodami aukščiau pateiktą komandinę eilutę.

11 žingsnis: Išbandykite

IŠBANDYK!
IŠBANDYK!
IŠBANDYK!
IŠBANDYK!

Pasiekite tinklalapį naudodami IP adresą ir turėtumėte turėti galimybę nuotoliniu būdu valdyti fotoaparatą!

Rekomenduojamas: