Indholdsfortegnelse:

Pool Pi Guy - AI -drevet alarmsystem og poolovervågning ved hjælp af Raspberry Pi: 12 trin (med billeder)
Pool Pi Guy - AI -drevet alarmsystem og poolovervågning ved hjælp af Raspberry Pi: 12 trin (med billeder)

Video: Pool Pi Guy - AI -drevet alarmsystem og poolovervågning ved hjælp af Raspberry Pi: 12 trin (med billeder)

Video: Pool Pi Guy - AI -drevet alarmsystem og poolovervågning ved hjælp af Raspberry Pi: 12 trin (med billeder)
Video: Autocamper tips - Installation af Smart Shunt og Inverter. 2024, Juli
Anonim
Pool Pi Guy - AI -drevet alarmsystem og poolovervågning ved hjælp af Raspberry Pi
Pool Pi Guy - AI -drevet alarmsystem og poolovervågning ved hjælp af Raspberry Pi

At have en pool derhjemme er sjovt, men medfører et stort ansvar. Min største bekymring er at overvåge, om nogen er i nærheden af poolen uden opsyn (især yngre børn). Min største irritation er at sørge for, at poolvandsledningen aldrig går under pumpeindgangen, hvilket ville køre pumpen tør og ødelægge den, der koster $$$ i reparationer.

Jeg har for nylig fundet ud af, hvordan man bruger en Raspberry Pi med OpenCV og TensorFlow, sammen med en vandstandssensor og en magnetventil til at løse begge problemer - og have det sjovt med at gøre det!

Det viser sig også at være et godt alarmsystem - bevægelsesaktiveret, AI -kontrolleret, uendeligt tilpasselig.

Lad os dykke ned.

Trin 1: Stor plan

I denne instruktive vil vi vise, hvordan du:

  1. Opsæt en Raspberry Pi med OpenCV og TensorFlow
  2. Tilslut et webcam via et langt USB -kabel
  3. Skriv en OpenCV -algoritme til at registrere bevægelse
  4. Brug TensorFlow til genkendelse af objekter
  5. Opret en webserver på Raspberry Pi for at vise de interessante billeder
  6. Integrer med IFTTT for at udløse mobiladvarsler, hvis en person opdages
  7. Fastgør et relæ -HAT til Raspberry Pi og tilslut det til en magnetventil, der tilføjer vand til poolen
  8. Sæt en vandstandssensor på Raspberry Pi og interface med den ved hjælp af Pi's GPIO
  9. Skriv en kode for at lime det hele sammen

Trin 2: Indkøbsliste

Indkøbsliste
Indkøbsliste

Alle komponenter er let tilgængelige fra Amazon. Eksperimentér og udveksle komponenter - det er halvdelen af det sjove!

  1. Hindbær Pi
  2. Raspberry Pi strømforsyning (spar ikke her)
  3. Hukommelseskort (større er bedre)
  4. Etui (denne er stor nok til at huse både Pi og HAT)
  5. USB -webkamera (ethvert webkamera gør, men du vil have et, der får gode billeder og balancerer belysningen godt)
  6. USB forlængerkabel (om nødvendigt - mål afstanden mellem Pi og hvor du vil placere kameraet)
  7. Relæbræt HAT (denne har 3 relæer, og vi har kun brug for en, men du finder snart en brug til de andre!)
  8. Solenoid
  9. Magnetventil 1 og montering 2 (det afhænger virkelig af, hvad du passer magnetventilen til, men disse fungerede for mig)
  10. Magnetisk strømforsyning (enhver 24V AC ville gøre)
  11. Kabel (igen, næsten ethvert 2 -strenget kabel ville gøre - strømmen er minimal)
  12. Vandstandsafbryder (dette er bare et eksempel, tjek hvad der let kan tilsluttes din pool)
  13. Nogle Jumper -ledninger og Wire -stik

Trin 3: Konfigurer din Raspberry Pi

Opsæt din Raspberry Pi
Opsæt din Raspberry Pi

Raspberry Pi er en fantastisk lille computer. Det koster kun $ 35, kører konsekvent og har masser af kompatibel software og hardware. Det er ret let at konfigurere det:

  1. Formater dit SD -kort. Dette kræver særlig pleje - Raspberry Pi kan kun starte fra et FAT -formateret SD -kort. Følg disse instruktioner.
  2. Tilslut Raspberry Pi til et USB -tastatur og mus plus en HDMI -skærm, og følg instruktionerne i Raspberry Pi NOOBS -vejledningen. Sørg for at opsætte WiFi og aktivere SSH -adgang. Glem ikke at konfigurere en adgangskode til standard pi -kontoen.
  3. På dit hjemmenetværks opsætning en statisk IP til Raspberry Pi - det ville gøre det meget lettere at SSH til.
  4. Sørg for, at du har en ssh -klient installeret på din stationære/bærbare computer. Til en pc vil jeg anbefale Putty, som du kan installere herfra.
  5. Afbryd USB og HDMI fra Raspberry Pi, genstart det og ssh ind i det - hvis det hele fungerede, skulle du se sådan noget:

Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l

De programmer, der følger med Debian GNU/Linux -systemet, er gratis software; de nøjagtige distributionsbetingelser for hvert program er beskrevet i de enkelte filer i/usr/share/doc/*/copyright. Debian GNU/Linux leveres ABSOLUT INGEN GARANTI, i det omfang det er tilladt i henhold til gældende lov. Sidste login: Man. 13. maj 10:41:40 2019 fra 104.36.248.13 pi@raspberrypi: ~ $

Trin 4: Opsætning af OpenCV

Opsætning af OpenCV
Opsætning af OpenCV

OpenCV er en fantastisk samling af billedmanipulationsfunktioner til computersyn. Det giver os mulighed for at læse billeder fra webkameraet, manipulere dem med at finde bevægelsesområder, gemme dem og mere. Opsætning på Raspberry Pi er ikke svært, men kræver lidt omhu.

Start med at installere virtaulenvwrapper: vi vil bruge python til at udføre al vores programmering, og virtualenv ville hjælpe os med at holde afhængigheder adskilt for OpenCV og TensorFlow vs. Kolbe eller GPIO:

pi@raspberrypi: ~ $ sudo pip install virtualenvwrapper

Nu kan du udføre "mkvirtualenv" for at oprette et nyt miljø, "workon" til at arbejde med det og mere.

Så lad os skabe et miljø for vores billedmanipulation med python 3 som standardfortolker (det er 2019, der er ingen grund til at holde fast i den ældre python 2):

pi@raspberrypi: ~ $ mkvirtualenv cv -p python3

… (Cv) pi@raspberrypi: ~

Vi er nu klar til at installere OpenCV. Vi vil for det meste følge den fremragende vejledning i Lær OpenCV. Følg specifikt deres trin 1 og 2:

sudo apt -y updatesudo apt -y upgrade ## Installer afhængigheder sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm sudo apt-get -y install git gfortran sudo apt-get -y install libjpeg8-dev libjasper- dev libpng12-dev sudo apt-get -y install libtiff5-dev sudo apt-get -y install libtiff-dev sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev sudo apt-get- y installer libxine2-dev libv4l-dev cd/usr/include/linux sudo ln -s -f../libv4l1-videodev.h videodev.h sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0. 10-dev sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default sudo apt-get -y install libatlas-base-dev sudo apt-get -y install libmp3lame-dev libtheora-dev sudo apt-get -y installer libvorbis-dev libxvidcore-dev libx264-dev sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get -y install libavresample-dev sudo apt-get -y install x264 v4l-utils sudo apt -get -y installer libprotobuf -dev protobuf-compiler sudo apt-get -y install libgoogle-glog-dev libgflags-dev sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen sudo apt-get install libqtgui4 sudo apt-get install libqt4- prøve

Nu kan vi bare installere OpenCV med pythonbindinger inde i cv virtualenv (du er stadig i det, ikke?) Ved hjælp af

pip installer opencv-contrib-python

Og det er det! Vi har OpenCV installeret på vores Raspberry Pi, klar til at tage billeder og videoer, manipulere dem og være seje.

Kontroller det ved at åbne en python -tolk og importere opencv, og kontroller, at der ikke er fejl:

(cv) pi@raspberrypi: ~ $ python

Python 3.5.3 (standard, 27. september 2018, 17:25:39) [GCC 6.3.0 20170516] på linux Skriv "hjælp", "copyright", "credits" eller "licens" for flere oplysninger. >>> import cv2 >>>

Trin 5: Opsætning af TensorFlow

Opsætning af TensorFlow
Opsætning af TensorFlow

TensorFlow er en machine learning / AI -ramme, der er udviklet og vedligeholdt af Google. Det har omfattende understøttelse af deep-learning-modeller til en række forskellige opgaver, herunder objektdetektering i billeder, og er nu ret enkel at installere på Raspberry Pi. Ydeevnen på dens lette modeller på den lille Pi er omkring 1 billede i sekundet, hvilket er helt tilstrækkeligt til en applikation som vores.

Vi vil dybest set følge den fremragende vejledning af Edje Electronics, med ændringer muliggjort af nyere TensorFlow -distributioner:

pi@raspberrypi: ~ $ workon cv

(cv) pi@raspberrypi: ~ $ pip install tensorflow (cv) pi@raspberrypi: ~ $ sudo apt-get install libxml2-dev libxslt-dev (cv) pi@raspberrypi: ~ $ pip install pude lxml jupyter matplotlib cython (cv) pi@raspberrypi: ~ $ sudo apt-get install python-tk

Nu skal vi kompilere Googles protobuf. Følg bare instruktionerne i trin 4 i den samme fremragende vejledning

Endelig klon og konfigurer TensorFlows modeldefinitioner - følg trin 5 i Edje Electronics tutorial

Følg også gerne deres eksempel i trin 6, det er en god introduktion til objektdetektering på Raspberry Pi.

Trin 6: Bevægelsesregistrering ved hjælp af OpenCV

Lad os starte med at teste, at OpenCV kan grænseflade med vores webcam: ssh i Raspberry Pi, gå til cv virtualenv (workon cv), åbne en python -tolk (skriv bare python), og indtast følgende python -kommandoer:

import cv2

cap = cv2. VideoCapture (0) cap.set (cv2. CAP_PROP_FRAME_WIDTH, 1920) cap.set (cv2. CAP_PROP_FRAME_HEIGHT, 1080) ret, frame = cap.read () print ('Read frame size: {} x {}'.format (frame.shape [1], frame.shape [0])

Med et held vil du se, at OpenCV var i stand til at læse en HD -ramme fra kameraet.

Du kan bruge cv2.imwrite (sti, ramme) til at skrive denne ramme til disk og sftp den tilbage for at se et egentligt udseende.

Strategien til at registrere bevægelse er ret ligetil:

  1. Arbejd med rammer med lavere opløsning - det er ikke nødvendigt at betjene fuld HD her
  2. Slør desuden billederne for at sikre så lidt støj som muligt.
  3. Hold et løbende gennemsnit af de sidste N -rammer. For denne applikation, hvor billedhastigheden er omkring 1 FPS (bare fordi TensorFlow tager noget tid pr. Ramme), fandt jeg ud af, at N = 60 giver gode resultater. Og da en omhyggelig implementering ikke kræver mere CPU med flere billeder, der er ok (det kræver mere hukommelse - men det er ubetydeligt, når vi arbejder med billedrammer med lavere opløsning)
  4. Træk det aktuelle billede fra det løbende gennemsnit (bare vær forsigtig med at skrive - du skal tillade positive og negative værdier [-255.. 255], så rammen skal konverteres til int)
  5. Du kan udføre subtraktionen på en gråtonekonvertering af rammen (og gennemsnittet) eller gøre det separat for hver af RGB-kanalerne og derefter kombinere resultaterne (hvilket er den strategi, jeg valgte, hvilket gør den følsom over for farveændringer)
  6. Brug en tærskel på deltaet og fjern støj ved erosion og udvidelse
  7. Kig endelig efter konturer af områder med et delta - disse områder er, hvor bevægelse er sket, og det aktuelle billede er forskelligt fra gennemsnittet af tidligere billeder. Vi kan yderligere finde afgrænsningskasser til disse konturer, hvis det er nødvendigt.

Jeg har indkapslet koden til at gøre dette i DeltaFinder python -klassen, som du kan finde i min github her

Trin 7: Find objekter ved hjælp af TensorFlow

Hvis du har fulgt TensorFlow -installationsproceduren, har du allerede testet, at du har TensorFlow installeret og fungerer.

Med det formål at opdage mennesker i en generel udendørs scene fungerer modeller, der er trænet på COCO -datasættet ganske godt - hvilket er præcis den model, vi har downloadet i slutningen af TensorFlow -installationen. Vi skal bare bruge det til slutning!

Igen har jeg indkapslet modelindlæsning og slutning i TFClassify python -klassen for at gøre tingene lettere, som du kan finde her.

Trin 8: Konfigurer en webserver på Raspberry Pi

Opsæt en webserver på Raspberry Pi
Opsæt en webserver på Raspberry Pi

Den nemmeste måde at få adgang til objektdetekteringsresultaterne er en webbrowser, så lad os oprette en webserver på Raspberry Pi. Vi kan derefter konfigurere det til at vise billeder fra et givet bibliotek.

Der er flere muligheder for en webserverramme. Jeg valgte Flask. Det er ekstremt konfigurerbart og let at udvide med Python. Da den "skala", vi har brug for, er triviel, var det mere end nok.

Jeg foreslår at installere det i en ny virtualenv, så:

pi@raspberrypi: ~ $ mkvirtualenv webserv

(webserv) pi@raspberrypi: ~ $ pip install Flask

Bemærk, at det med en normal netværksopsætning kun kan nås, når din browser er på det samme trådløse LAN som din Raspberry Pi. Du kan oprette en portmapping / NAT -konfiguration på din internetrouter for at tillade ekstern adgang - men jeg anbefaler imod det. Koden, jeg skrev, forsøger ikke at give den sikkerhed, du har brug for, når du tillader generel internetadgang til din Raspberry Pi.

Test din installation ved at følge Flask hurtigstartguide

Trin 9: Mobilmeddelelser fra Raspberry Pi ved hjælp af IFTTT

Mobilmeddelelser fra Raspberry Pi ved hjælp af IFTTT
Mobilmeddelelser fra Raspberry Pi ved hjælp af IFTTT

Jeg vil virkelig gerne have mobilbeskeder, når der sker begivenheder. I dette tilfælde, når en person opdages, og når vandstanden går lavt. Den enkleste måde jeg fandt at gøre det på, uden at skulle skrive en brugerdefineret mobilapp, bruger IFTTT. IFTTT står for "If This Then That" og gør det muligt for mange typer begivenheder at udløse mange typer handlinger. I vores tilfælde er vi interesseret i IFTTT Maker Webhook -udløseren. Dette giver os mulighed for at udløse en IFTTT -handling ved at sende en HTTP POST -anmodning til IFTTT -serveren med en særlig nøgle tildelt vores konto sammen med data, der angiver, hvad der skete. Den handling, vi foretager, kan være lige så simpel som at oprette en meddelelse på vores mobile enhed ved hjælp af IFTTT -mobilappen eller noget mere komplekst end det.

Sådan gør du det:

  1. Opret en IFTTT -konto på ifttt.com
  2. Mens du er logget ind, skal du gå til siden Webhook serviceindstillinger og indtaste webadressen i din browser (noget som https://maker.ifttt.com/use/. Denne webside viser dig din nøgle og den webadresse, der skal bruges til at udløse handlinger.
  3. Opret en IFTTT -applet, der genererer en mobilmeddelelse, når Webhook udløses med detaljerne om begivenheden:

    1. Klik på "Mine appletter" og derefter på "Ny applet".
    2. Klik på "+dette", og vælg "webhooks". Klik på "Modtag en webanmodning" for at gå til detaljerne
    3. Giv dit arrangement et navn, f.eks. "PoolEvent" og klik på "Opret trigger"
    4. Klik på "+det", og vælg "underretninger". Vælg derefter "Send en rig anmeldelse fra IFTTT -appen"
    5. For "titel" vælg noget som "PoolPi"
    6. For "besked" skriv "Pool Pi opdaget:" og klik på "tilføj ingrediens".. "Værdi1".
    7. Gå tilbage til den URL, du kopierede i trin 2. Den viser URL'en, der skal bruges til at påberåbe din nyoprettede applet. Kopiér denne webadresse og erstat pladsholderen {event} med hændelsesnavnet (f.eks. PoolEvent)
  4. Download, installer og log ind på IFTTT -appen til din mobilenhed
  5. Kør dette python -script på din Raspberry Pi for at se, at det fungerer (bemærk, at det kan tage et par sekunder eller minutter at udløse på din mobilenhed):

importanmodninger

requests.post ('https://maker.ifttt.com/trigger/PoolEvent/with/key/', json = {"value1": "Hej notifikationer"})

Trin 10: Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil

Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil
Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil
Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil
Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil
Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil
Tilføj en relæhue til Raspberry Pi og tilslut den til en magnetventil

Inden du fortsætter med dette trin SLUKKE din Raspberry Pi: ssh til den, og skriv "sudo shutdown now", og afbryd derefter strømmen

Vores mål er at tænde og slukke for strømforsyningen til en magnetventil - en ventil, der kan åbne eller lukke vandforsyningen baseret på 24V vekselstrøm, den får fra en strømforsyning. Relæer er de elektriske komponenter, der kan åbne eller lukke et kredsløb baseret på et digitalt signal, som vores Raspberry Pi kan levere. Hvad vi gør her er at tilslutte et relæ til disse digitale signalstifter på Raspberry Pi, og få det til at lukke kredsløbet mellem 24V vekselstrømforsyningen og magnetventilen.

Stifterne på Raspberry Pi, der kan fungere som digital input eller output, kaldes GPIO - General Purpose Input/Output, og de er rækken med 40 ben på siden af Pi. Med Pi slukket, og indsæt relæet HAT godt i den. HAT jeg valgte har 3 relæer i den, og vi vil kun bruge en af dem. Forestil dig alt hvad du kan gøre med de to andre:)

Tænd nu Raspberry Pi igen. Den røde "power" LED på relæet HAT skulle tænde, hvilket indikerer, at den får strøm fra Pi gennem GPIO. Lad os teste, at vi kan kontrollere det: ssh ind i Pi igen, indtast python og skriv:

import gpiozero

dev = gpiozero. DigitalOutputDevice (26, initial_value = True) dev.off ()

Du skal høre et hørbart "klik", der angiver, at relæet er aktiveret, og se en LED tændt, der viser, at det første relæ er i den tilsluttede position. Du kan nu skrive

dev.on ()

Hvilket ville dreje relæet til "off" position (ulige, jeg ved …) og afslutte () fra python.

Brug nu jumperkabler og det længere kabel til at forbinde relæet mellem 24V strømforsyningen og magnetventilen. Se diagrammet. Tilslut endelig magnetventilen til en vandhane ved hjælp af adapterne og gør dig klar til at teste det hele ved at gentage kommandoerne ovenfor - de skal tænde og slukke for vandet.

Sæt en slange på magnetventilen og læg den anden ende dybt i poolen. Du har nu et computerstyret pool-top-off-system, og det er på tide at tilslutte en sensor for at fortælle den, hvornår den skal køre.

Trin 11: Tilslut en vandstandssensor

Tilslut en vandstandssensor
Tilslut en vandstandssensor
Tilslut en vandstandssensor
Tilslut en vandstandssensor
Tilslut en vandstandssensor
Tilslut en vandstandssensor
Tilslut en vandstandssensor
Tilslut en vandstandssensor

En vandstandssensor er simpelthen en flyder, der forbinder et elektrisk kredsløb, når flyderen er nede, og bryder den, når den flyder op. Hvis du sætter det i poolen i den rigtige højde, vil flyderen være oppe, når vandstanden er tilstrækkelig, men falde ned, når der ikke er nok vand.

For at Raspberry Pi kender status for vandstandssensoren, har vi brug for Pi til at registrere et åbent eller lukket kredsløb. Det er heldigvis meget enkelt: De samme GPIO -stik, som vi bruger som digital udgang til at styre relæerne, kan fungere som indgange (deraf I i GPIO). Specifikt, hvis vi forbinder en ledning af sensoren til +3.3V på GPIO-stikket og den anden sensortråd til en pin, som vi konfigurerer som pull-down-indgang (hvilket betyder, at den normalt vil være på GND-spændingsniveau), måles denne pin en digital "høj" eller "tændt" spænding, når vandstandssensoren lukker kredsløbet - når vandstanden er lav. Jeg brugte GPIO pin 16 som input, som jeg markerede på billedet ovenfor.

Python -koden til at konfigurere stiften som input og teste dens aktuelle tilstand er:

import gpiozero

level_input = gpiozero. Button (16) water_low = level_input.is_pressed

En potentiel udfordring er, at når sensoren bare ændrer tilstand, vil den svinge hurtigt mellem til- og frakoblingstilstande. Løsningen på det er kendt som "debouncing" og leder efter en konsekvent tilstandsændring, før der tages handling. GPIOZERO -biblioteket har kode til at gøre det, men af en eller anden grund fungerede koden ikke godt for mig. Jeg skrev en simpel sløjfe for at udløse IFTTT -advarsler, når der registreres en konsekvent tilstandsændring, som du kan finde i mit lager her.

Trin 12: Skriv kode for at binde det hele sammen

Skriv kode for at binde det hele sammen
Skriv kode for at binde det hele sammen

Det er det. Vores opsætning er fuldført. Du kan skrive din egen kode for at binde tingene sammen til et komplet system eller bruge den kode, jeg angiver. For at gøre det skal du bare oprette mappestrukturen og klone lageret sådan:

mkdir poolpi

cd poolpi git -klon

Rediger derefter filerne med navnet ifttt_url.txt i mapperne motion_alert og water_level for at få URL'en til din egen IFTTT -webkrog med din hemmelige nøgle. Du kan bruge to forskellige webkroge til forskellige handlinger.

Endelig ønsker vi, at denne kode kører automatisk. Den nemmeste måde at opnå det på er gennem Linux crontab -tjenesten. Vi kan tilføje nogle crontab -linjer til to hovedopgaver:

  1. Kør vores tre programmer: objektdetektoren, vandstandssensoren og webserveren ved hver genstart
  2. Opryd outputmappen, slet gamle billeder og gamle videofiler (jeg valgte at slette filer ældre end 1 dag og billeder ældre end 7 dage - eksperimentér gerne)

For at gøre den type crontab -e, som åbner din nano -teksteditor. Tilføj følgende linjer til bunden af filen:

0 1 * * * find/home/pi/poolpi/output -type f -navn " *.avi" -mtime +1 -delete

0 2 * * * find/home/pi/poolpi/output -type f -navn " *.jpg" -mtime +7 -delete @reboot python3 /home/pi/poolpi/motion_alert/webserv/webserv.py @reboot python3 /home/pi/poolpi/motion_alert/motion_obj_alert.py @reboot python3 /home/pi/poolpi/water_level/test_water_level.py

Endelig genstart din Raspberry Pi. Den er nu klar til at holde din pool fuld og sikker.

Glem ikke med opsætningen, koden, og glem ikke at markere mit github -lager og kommentere det instruerbare, hvis du finder det nyttigt. Jeg leder altid efter at lære mere.

Glad for at lave!

IoT -udfordring
IoT -udfordring
IoT -udfordring
IoT -udfordring

Runner Up i IoT Challenge

Anbefalede: