Innehållsförteckning:
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-13 06:58
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
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
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
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
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
När det fungerar fungerar det
Steg 6: 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.