Innehållsförteckning:

Cat-a-way-Computer Vision Cat Sprinkler: 6 steg (med bilder)
Cat-a-way-Computer Vision Cat Sprinkler: 6 steg (med bilder)

Video: Cat-a-way-Computer Vision Cat Sprinkler: 6 steg (med bilder)

Video: Cat-a-way-Computer Vision Cat Sprinkler: 6 steg (med bilder)
Video: A satisfying chemical reaction 2024, November
Anonim
Cat-a-way-Computer Vision Cat Sprinkler
Cat-a-way-Computer Vision Cat Sprinkler

Problem - Katter som använder din trädgård som toalett

Lösning - Spendera för mycket tid på att konstruera en kattsprinkler med automatisk YouTube -uppladdningsfunktion

Detta är inte ett steg för steg, utan en översikt över konstruktion och lite kod

#BeforeYouCallPETA - Katterna mår bra, det är ett lågtryckssprinkler precis som regn, så att de kan springa ut innan det ens svänger runt dem. Projektet är inte att blötlägga en katt, utan att visa dem bort innan de fyller min trädgård med kattversionen av Barkers Eggs.

Steg 1: Huvudartiklar som krävs

Huvudartiklar krävs
Huvudartiklar krävs

Raspberry Pi zero & SD -kort

Raspberry Pi -kamera

Relä

555 timer … (eller en arduino och ett annat relä om dina 555 timers inte kommer)

Solenoid

Sprinkler

Något slags hus för elektroniken

En vilja att slå en metaforisk spik med en 6 ton lång slägga

En kamera med så liten upplösning att du knappt kan se vattnet, men kan fortfarande se katterna springa efter skydd

Steg 2: Systemet

Image
Image

1, Pi -kamera upptäcker ett kattstort objekt som rör sig för några kameraramar (beskrivs i nästa steg)

2, Pi sätter igång sprinkler

3, Cat springer för lock

4, Video laddas upp automatiskt till youtube för att se nöje

Steg 3: Kodningstid

Sätta ihop det
Sätta ihop det

Med hjälp av openCV med hjälp av ramsubtraktion kan du hitta områden i ramen som förändras över tiden, med några fiffiga funktioner kan du ta reda på hur stora dessa förändringar är och om de kvarstår över tiden, och viktigast av allt ta reda på om de är kattstorlekar.

Det finns en hel del självstudier om ramsubtraktion som går in i detalj om du gör en snabb Google -sökning.

Översikt över hur koden fungerar

1, kameran fortsätter att ta ramar och jämföra dem med den senaste

2, Om en kattstorleksform detekteras noteras den

3, Om kattstorleksändringen kvarstår över cirka 4 ramar använder pi: n sitt GPIO för att driva relä för att starta arduino

4, Arduino sänder en signal för att driva det andra reläet i 5 sekunder som aktiverar solenoiden

5, solenoiden när den drivs tillåter vatten till sprinklern

6, medan sprinklern är aktiv slutar kameran att upptäcka och spela in video

7, Video laddas upp till Youtube

8, stillbilder laddas upp till dropbox för finjusteringssystem

Obs - Varför jag slutade använda 2 reläer och en arduino för att slå på en solenoid i 5 sekunder …..

1, pi kan inte starta och stoppa solenoiden medan du spelar in videon när python -scrips pausar tills videon är klar, därav behovet av arduino (eller 555 timer) för att låta solenoiden öppna och stänga oberoende av skriptet medan videon spelar fortfarande in.

2, Det första reläet och arduino kan ersättas med en 555 timer men det kom inte i posten i tid för detta projekt, 555 skulle spara mycket tid och steg.

3, Pi kan inte utlösa solenoiden direkt eftersom Pi GPIO fungerar på 3,3v och 51mA max, och solenoiden vill att 5V och mycket mer än 51mA ska utlösas.

4, varje ram kan beskäras för att ta bort rörelsedetektering i oönskade områden, till exempel en grannträdgård. Underlåtenhet att göra detta kommer att resultera i att grannen ger förvirrade blickar in i din trädgård eftersom sprinklern slocknar varje gång han vill gå in i hans skjul.

5, jag har nog missat något uppenbart och slösat bort min tid på att sätta upp det så här.

Kod nedan

import cv2import numpy som np import argparse #cat importtid import RPi. GPIO som GPIO import os import dropbox från picamera.array import PiRGBArray från picamera import PiCamera #------------------ ------------------------------ Ladda upp till youtube ----------------- ---------------------- def HDtoYoutube (): ctime = time.strftime ("_%H-%M-%S") cdate = time.strftime ("_%d-%m-%Y") vidname = ctime + cdate #Trigger relay GPIO.output (11, True) time.sleep (.5) GPIO.output (11, False) print ("Ta video") försök: #Take Video os.system ('raspivid -w 1640 -h 922 -o vid {0}.h264 -t 15000'.format (vidname)) #Upload to youtube print ("Upload to YouTube") os. system ('sudo youtube-upload --title = "Cat Got Wet {0}" --client-secrets = client_secret.json vid {0}.h264'.format (vidname)) #Remove video file when done os.remove ('vid {0}.h264'.format (vidnamn)) print ("Video uppladdad och borttagen från Pi") utom: skicka #-------------------- ---------------------------- Stillbilder till dropbox ------------------- -------------------- def St. illsToDropbox (): print ("Överför fortfarande till Dropbox -funktion") access_token = 'Ah ah ah, du sa inte det magiska ordet … Ah ah ah, du sa inte det magiska ordet' ctime = time.strftime (" %H:%M:%S ") cdate = time.strftime ("%d-%m-%Y ") försök: filnamn =" /Motion/{0}/DetectedAt_{1}.jpg".format(cdate, ctime) print (filnamn) klient = dropbox.client. DropboxClient (access_token) image = open ("ToDropbox.jpg", 'rb') client.put_file (filnamn, bild) image.close () os.remove ("ToDropbox.jpg ") utom: passera #------------------------------------------ ------ Upptäck rörelse ----------------------------------------- def DetectMotion (): #Define vars min_area = 400 tolarance = 25 #change in pixel bluramount = 21 timetoforget = 0.5 kernel = np.ones ((5, 5), np.uint8) #used for dialate MotionCounter = 0 MinTargetArea = 600 # minsta storlek för att upptäcka MaxTargetArea = 5000 #Största storlek att upptäcka nu = time.time () then = time.time () #initialize camera camera = PiCamera () camera.resolution = (640, 480) camera.framerate = 10 raw Capture = PiRGBArray (kamera, storlek = (640, 480)) #uppvärmningstid för kamera.sömn (1) #Ta tag i den första bilden och förbered den för att gå in i cv2.acumulate weight camera.capture (rawCapture, format = "bgr") snitt = rawCapture.array #Skär ut oönskad region PolyCrop = np.array (

#HowToTriggerRealProgrammersWithBadCode

Steg 4: Sätta ihop det

Sätta ihop det
Sätta ihop det
Sätta ihop det
Sätta ihop det
Sätta ihop det
Sätta ihop det

Krama in elen i ett vattentätt hölje, skruva fast saker i väggar och använd massor av tejp och varmt lim

Steg 5: Resultat

Image
Image
Resultat
Resultat

När det fungerar fungerar det

Steg 6: Falska positiva

Falska positiva
Falska positiva

När det inte gör det sprutar kattskuggor, din fru och din dotter.

Tips - Sätt en strömbrytare vid dörren som pausar rörelsedetekteringsprogrammet ….. glöm sedan att använda den och bli blöt när du lägger ut papperskorgarna.

Hoppas att jag gjorde några experter på programmering, elektronik och DIY krymper med alla misstag jag förmodligen gjort, och hoppas särskilt att du tyckte om alla mina stavfel.

Rekommenderad: