Innehållsförteckning:

Pool Pi Guy - AI -driven larmsystem och poolövervakning med Raspberry Pi: 12 steg (med bilder)
Pool Pi Guy - AI -driven larmsystem och poolövervakning med Raspberry Pi: 12 steg (med bilder)

Video: Pool Pi Guy - AI -driven larmsystem och poolövervakning med Raspberry Pi: 12 steg (med bilder)

Video: Pool Pi Guy - AI -driven larmsystem och poolövervakning med Raspberry Pi: 12 steg (med bilder)
Video: КУПИЛ КУСОК ПОДЧЕРЁВКА И ПРИГОТОВИЛ Тако. BBQ. как у La Capital 2024, Juli
Anonim
Pool Pi Guy - AI -driven larmsystem och poolövervakning med Raspberry Pi
Pool Pi Guy - AI -driven larmsystem och poolövervakning med Raspberry Pi

Att ha en pool hemma är kul, men medför ett stort ansvar. Min största oro är att övervaka om någon är nära poolen utan uppsikt (särskilt yngre barn). Min största irritation är att se till att poolvattenledningen aldrig går under pumpen, vilket skulle köra pumpen torr och förstöra den som kostar $ $ $ i reparationer.

Jag har nyligen kommit på hur man använder en Raspberry Pi med OpenCV och TensorFlow, tillsammans med en vattennivåsensor och en magnetventil för att lösa båda problemen - och ha kul att göra det!

Det visar sig också vara ett bra larmsystem - rörelseaktiverad, AI -styrd, oändligt anpassningsbar.

Låt oss dyka in.

Steg 1: Grand Plan

I den här instruktionsboken kommer vi att visa hur du:

  1. Konfigurera en Raspberry Pi med OpenCV och TensorFlow
  2. Anslut en webbkamera via en lång USB -kabel
  3. Skriv en OpenCV -algoritm för att upptäcka rörelse
  4. Använd TensorFlow för objektdetektering
  5. Skapa en webbserver på Raspberry Pi för att visa de intressanta bilderna
  6. Integrera med IFTTT för att utlösa mobilvarningar om en person upptäcks
  7. Fäst en relähatt på Raspberry Pi och anslut den till en magnetventil som skulle tillföra vatten till poolen
  8. Anslut en vattennivåsensor till Raspberry Pi och anslut den med Pi: s GPIO
  9. Skriv en kod för att limma ihop det hela

Steg 2: Inköpslista

Inköpslista
Inköpslista

Alla komponenter är lätt tillgängliga från Amazon. Experimentera och byt komponenter - det är halva nöjet!

  1. Raspberry Pi
  2. Raspberry Pi Power Supply (snåla inte här)
  3. Minneskort (större är bättre)
  4. Case (den här är tillräckligt stor för att rymma både Pi och HAT)
  5. USB -webbkamera (vilken webbkamera som helst, men du vill ha en som får bra bilder och balanserar ljuset bra)
  6. USB -förlängningskabel (vid behov - mät avståndet mellan Pi och var du skulle placera kameran)
  7. Reläbräda HAT (den här har 3 reläer och vi behöver bara en, men du kommer att hitta en användning för de andra snart!)
  8. Solenoid
  9. Magnetmontering 1 och montering 2 (det beror verkligen på vad du passar solenoiden till, men dessa fungerade för mig)
  10. Magnetströmförsörjning (alla 24V AC skulle göra)
  11. Kabel (igen, nästan vilken 2 -trådig kabel som helst - strömmen är minimal)
  12. Vattennivå Float Switch (detta är bara ett exempel, kolla vad som enkelt kan anslutas till din pool)
  13. Några bygelkablar och trådkontakter

Steg 3: Konfigurera din Raspberry Pi

Konfigurera din Raspberry Pi
Konfigurera din Raspberry Pi

Raspberry Pi är en fantastisk liten dator. Det kostar bara $ 35, körs konsekvent och har massor av kompatibel programvara och hårdvara. Det är ganska enkelt att konfigurera det:

  1. Formatera ditt SD -kort. Detta kräver särskild omsorg - Raspberry Pi kan bara starta från ett FAT -formaterat SD -kort. Följ dessa instruktioner.
  2. Anslut Raspberry Pi till ett USB -tangentbord och mus, plus en HDMI -skärm, och följ instruktionerna i Raspberry Pi NOOBS -handledning. Se till att konfigurera WiFi och aktivera SSH -åtkomst. Glöm inte att ställa in ett lösenord för standard -pi -kontot.
  3. I ditt hemnätverk installerar du en statisk IP för Raspberry Pi - det skulle göra det mycket lättare att SSH.
  4. Se till att du har en ssh -klient installerad på din stationära/bärbara dator. För en dator skulle jag rekommendera Putty, som du kan installera härifrån.
  5. Koppla ur USB och HDMI från Raspberry Pi, starta om det och ssh in i det - om allt fungerade borde du se något så här:

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

Programmen som ingår i Debian GNU/Linux -systemet är gratis programvara; de exakta distributionsvillkoren för varje program beskrivs i de enskilda filerna i/usr/share/doc/*/copyright. Debian GNU/Linux levereras med ABSOLUT INGEN GARANTI, i den utsträckning det är tillåtet enligt tillämplig lag. Senaste inloggning: mån 13 maj 10:41:40 2019 från 104.36.248.13 pi@raspberrypi: ~ $

Steg 4: Konfigurera OpenCV

Konfigurera OpenCV
Konfigurera OpenCV

OpenCV är en fantastisk samling av bildmanipuleringsfunktioner för datorsyn. Det gör att vi kan läsa bilder från webbkameran, manipulera dem för att hitta rörelseområden, spara dem och mer. Installation på Raspberry Pi är inte svårt men kräver lite omsorg.

Börja med att installera virtaulenvwrapper: vi kommer att använda python för att göra all vår programmering, och virtualenv skulle hjälpa oss att hålla beroenden åtskilda för OpenCV och TensorFlow vs. Flask eller GPIO:

pi@raspberrypi: ~ $ sudo pip install virtualenvwrapper

Nu kan du köra "mkvirtualenv" för att skapa en ny miljö, "workon" för att arbeta med det och mer.

Så, låt oss skapa en miljö för vår bildmanipulation, med python 3 som standardtolk (det är 2019, det finns ingen anledning att hålla fast vid den äldre python 2):

pi@raspberrypi: ~ $ mkvirtualenv cv -p python3

… (Cv) pi@raspberrypi: ~

Vi är nu redo att installera OpenCV. Vi kommer mestadels att följa den utmärkta handledningen i Learn OpenCV. Följ specifikt deras steg 1 och 2:

sudo apt -y updatesudo apt -y upgrade ## Installera beroenden 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 installera 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 installera 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 installera 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- testa

Nu kan vi bara installera OpenCV med pythonbindningar inuti cv virtualenv (du är fortfarande i det, eller hur?) Med

pip installera opencv-contrib-python

Och det är allt! Vi har OpenCV installerat på vår Raspberry Pi, redo att ta foton och videor, manipulera dem och vara cool.

Kontrollera det genom att öppna en pythontolk och importera opencv och kontrollera att det inte finns några fel:

(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", "upphovsrätt", "krediter" eller "licens" för mer information. >>> importera cv2 >>>

Steg 5: Konfigurera TensorFlow

Konfigurera TensorFlow
Konfigurera TensorFlow

TensorFlow är ett ramverk för maskininlärning / AI som utvecklats och underhålls av Google. Den har omfattande stöd för djupinlärningsmodeller för en mängd olika uppgifter, inklusive objektdetektering i bilder, och är nu ganska enkel att installera på Raspberry Pi. Prestandan för dess lätta modeller på den lilla Pi är cirka 1 bildruta per sekund, vilket är perfekt för en applikation som vår.

Vi kommer i princip att följa den utmärkta handledningen av Edje Electronics, med modifieringar som möjliggjorts av nyare 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 installera kudde lxml jupyter matplotlib cython (cv)) pi@raspberrypi: ~ $ sudo apt-get install python-tk

Nu måste vi sammanställa Googles protobuf. Följ bara instruktionerna i steg 4 i samma utmärkta handledning

Slutligen, klona och konfigurera TensorFlows modelldefinitioner - följ steg 5 i Edje Electronics självstudie

Följ gärna deras exempel i steg 6 också, det är en bra introduktion till objektdetektering på Raspberry Pi.

Steg 6: Rörelsedetektering med OpenCV

Låt oss börja med att testa att OpenCV kan gränssnitt med vår webbkamera: ssh in i Raspberry Pi, gå till cv virtualenv (workon cv), öppna en pythontolk (skriv bara python) och ange följande python -kommandon:

importera 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 någon tur kommer du att se att OpenCV kunde läsa en HD -ram från kameran.

Du kan använda cv2.imwrite (sökväg, ram) för att skriva den ramen till hårddisken och sftp tillbaka den för att ta ett verkligt utseende.

Strategin för att upptäcka rörelse är ganska rak framåt:

  1. Arbeta med ramar med lägre upplösning - det är inte nödvändigt att använda full HD här
  2. Gör bilderna suddiga för att få så lite brus som möjligt.
  3. Håll ett löpande medelvärde för de senaste N -bilderna. För den här applikationen, där bildhastigheten är cirka 1 FPS (bara för att TensorFlow tar lite tid per bildruta), fann jag att N = 60 ger bra resultat. Och eftersom en noggrann implementering inte kräver mer CPU med fler ramar är det OK (det tar mer minne - men det är försumbart när vi arbetar med ramarna med lägre upplösning)
  4. Subtrahera den aktuella bilden från det löpande genomsnittet (var bara försiktig med att skriva - du måste tillåta positiva och negativa värden [-255.. 255], så ramen måste konverteras till int)
  5. Du kan utföra subtraktionen på en gråskalaomvandling av ramen (och genomsnittet), eller göra det separat för var och en av RGB-kanalerna och sedan kombinera resultaten (vilket är den strategi jag valde, vilket gör den känslig för färgändringar)
  6. Använd en tröskel på deltaet och ta bort brus genom erosion och vidgning
  7. Slutligen leta efter konturer av områden med ett delta - dessa områden är där rörelse har skett och den aktuella bilden skiljer sig från genomsnittet för tidigare bilder. Vi kan vidare hitta avgränsningsboxar för dessa konturer om det behövs.

Jag har inkapslat koden för att göra detta i DeltaFinder python -klassen som du kan hitta i min github här

Steg 7: Upptäck objekt med hjälp av TensorFlow

Om du har följt installationsproceduren för TensorFlow har du redan testat att du har TensorFlow installerat och fungerar.

För att upptäcka människor i en allmän utomhusscene fungerar modeller som är förutbildade på COCO -datamängden ganska bra - vilket är exakt den modell vi har laddat ner i slutet av TensorFlow -installationen. Vi behöver bara använda den för slutsats!

Återigen har jag inkapslat modellbelastning och slutsatser i TFClassify -pythonklassen för att göra saker enklare, vilket du kan hitta här.

Steg 8: Skapa en webbserver på Raspberry Pi

Skapa en webbserver på Raspberry Pi
Skapa en webbserver på Raspberry Pi

Det enklaste sättet att komma åt objektdetekteringsresultaten är en webbläsare, så låt oss skapa en webbserver på Raspberry Pi. Vi kan sedan ställa in det för att visa bilder från en given katalog.

Det finns flera alternativ för en webbserverram. Jag valde Flask. Det är extremt konfigurerbart och enkelt att förlänga med Python. Eftersom "skalan" vi behöver är trivial, var det mer än tillräckligt.

Jag föreslår att du installerar det i en ny virtualenv, så:

pi@raspberrypi: ~ $ mkvirtualenv webserv

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

Observera att med en normal nätverksinställning kan den endast nås när din webbläsare är på samma trådlösa LAN som din Raspberry Pi. Du kan skapa en portmappning / NAT -konfiguration på din internetrouter för att tillåta extern åtkomst - men jag rekommenderar det. Koden jag skrev försöker inte ge den säkerhet du skulle behöva när du tillåter allmän internetåtkomst till din Raspberry Pi.

Testa din installation genom att följa snabbstartguiden för kolven

Steg 9: Mobilaviseringar från Raspberry Pi med IFTTT

Mobilaviseringar från Raspberry Pi med IFTTT
Mobilaviseringar från Raspberry Pi med IFTTT

Jag vill verkligen få mobilaviseringar när händelser inträffar. I det här fallet, när en person upptäcks och när vattennivån blir låg. Det enklaste sättet jag hittade på att göra det, utan att behöva skriva en anpassad mobilapp, använder IFTTT. IFTTT står för "If This Then That" och gör det möjligt för många typer av händelser att utlösa många typer av åtgärder. I vårt fall är vi intresserade av IFTTT Maker Webhook -utlösaren. Detta gör att vi kan utlösa en IFTTT -åtgärd genom att göra en HTTP POST -begäran till IFTTT -servern med en särskild nyckel tilldelad vårt konto, tillsammans med data som anger vad som hände. Åtgärden vi vidtar kan vara så enkel som att skapa ett meddelande på vår mobila enhet med IFTTT -mobilappen, eller något mer komplext än så.

Så här gör du:

  1. Skapa ett IFTTT -konto på ifttt.com
  2. När du är inloggad, gå till Webhook -tjänstinställningssidan och ange webbadressen i din webbläsare (något liknande https://maker.ifttt.com/use/. Den webbsidan visar dig din nyckel och webbadressen som ska användas för att utlösa åtgärder.
  3. Skapa en IFTTT -applet som genererar en mobilavisering när Webhook utlöses med detaljer om händelsen:

    1. Klicka på "Mina appar" och sedan på "Ny applet".
    2. Klicka på "+detta" och välj "webhooks". Klicka på "Ta emot en webbförfrågan" för att gå vidare till detaljerna
    3. Ge ditt evenemang ett namn, t.ex. "PoolEvent" och klicka på "Skapa utlösare"
    4. Klicka på "+det" och välj "aviseringar". Välj sedan "Skicka ett rikt meddelande från IFTTT -appen"
    5. För "titel" välj något som "PoolPi"
    6. För "meddelande" skriv "Pool Pi upptäckt:" och klicka på "lägg till ingrediens".. "Värde1".
    7. Gå tillbaka till webbadressen du kopierade i steg 2. Den visar webbadressen som ska användas för att anropa din nyskapade applet. Kopiera den webbadressen och ersätt platshållaren {event} med händelsens namn (i exempel PoolEvent)
  4. Ladda ner, installera och logga in på IFTTT -appen för din mobila enhet
  5. Kör det här python -skriptet på din Raspberry Pi för att se att det fungerar (notera att det kan ta några sekunder eller minuter att utlösa på din mobila enhet):

importförfrågningar

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

Steg 10: Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil

Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil
Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil
Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil
Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil
Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil
Lägg till en relähatt till Raspberry Pi och anslut den till en magnetventil

Innan du fortsätter med detta steg STÄNG AV din Raspberry Pi: ssh till den och skriv "sudo shutdown now", koppla sedan bort den från strömmen

Vårt mål är att slå på och av strömförsörjningen till en magnetventil - en ventil som kan öppna eller stänga vattentillförseln baserat på 24V växelström som den får från en strömförsörjning. Reläer är de elektriska komponenterna som kan öppna eller stänga en krets baserad på en digital signal som vår Raspberry Pi kan ge. Vad vi gör här är att koppla ett relä till dessa digitala signalstift på Raspberry Pi och låta det stänga kretsen mellan 24V växelström och magnetventilen.

Stiften på Raspberry Pi som kan fungera som digital ingång eller utgång kallas GPIO - Input/Output för allmänt ändamål och de är raden med 40 stift på sidan av Pi. Med Pi avstängd och sätt in relähatten ordentligt i den. HATEN jag valde har 3 reläer i den, och vi kommer att använda bara en av dem. Tänk dig allt du kan göra med de andra två:)

Slå på Raspberry Pi igen. Den röda "power" -lampan på reläet HAT bör tändas, vilket indikerar att den får ström från Pi genom GPIO. Låt oss testa att vi kan styra det: ssh in i Pi igen, ange python och skriv:

importera gpiozero

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

Du bör höra ett hörbart "klick" som indikerar att reläet är inkopplat och se en lysdiod tänd som visar att det första reläet är i det anslutna läget. Du kan nu skriva

dev.on ()

Vilket skulle göra reläet till "av" -läget (udda, jag vet …) och avsluta () från python.

Använd nu bygelkablar och den längre kabeln för att ansluta reläet mellan 24V strömförsörjning och magnetventilen. Se diagrammet. Slutligen, anslut magnetventilen till en kran med hjälp av adaptrarna och gör dig redo att testa allt genom att upprepa kommandona ovan - de ska slå på och stänga av vattnet.

Fäst en slang på magnetventilen och sätt den andra änden djupt i poolen. Du har nu ett datorstyrt pool-top-off-system, och det är dags att ansluta en sensor för att tala om när den ska köras.

Steg 11: Anslut en vattennivåsensor

Anslut en vattennivåsensor
Anslut en vattennivåsensor
Anslut en vattennivåsensor
Anslut en vattennivåsensor
Anslut en vattennivåsensor
Anslut en vattennivåsensor
Anslut en vattennivåsensor
Anslut en vattennivåsensor

En vattennivåsensor är helt enkelt en flottör som ansluter en elektrisk krets när flottören är nere och bryter den när den flyter upp. Om du sätter in den i poolen på rätt höjd kommer flottören att vara uppe när vattennivån är tillräcklig men sjunka när det inte finns tillräckligt med vatten.

För att Raspberry Pi ska veta statusen för vattennivåsensorn behöver vi Pi för att känna av en öppen eller sluten krets. Lyckligtvis är det väldigt enkelt: samma GPIO -kontakter som vi använder som digital utgång för att styra reläerna kan fungera som ingångar (därav I i GPIO). Specifikt, om vi ansluter en ledning av sensorn till +3.3V på GPIO-kontakten och den andra sensorkabeln till en stift som vi konfigurerar som neddragningsingång (vilket betyder att den normalt kommer att vara på GND-spänningsnivå), mäter den stiftet en digital "hög" eller "på" spänning endast när vattennivåsensorn stänger kretsen - när vattennivån är låg. Jag använde GPIO pin 16 som ingång, vilket jag markerade i bilden ovan.

Pythonkoden för att konfigurera stiftet som ingång och testa dess nuvarande tillstånd är:

importera gpiozero

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

En potentiell utmaning är att när sensorn bara ändrar tillstånd skulle den svänga snabbt mellan på och av tillstånd. Lösningen på det kallas "debouncing" och letar efter en konsekvent tillståndsförändring innan åtgärder vidtas. GPIOZERO -biblioteket har kod för att göra det, men av någon anledning fungerade den koden inte bra för mig. Jag skrev en enkel loop för att utlösa IFTTT -varningar när en konsekvent tillståndsförändring upptäcks, vilket du kan hitta i mitt förråd här.

Steg 12: Skriv kod för att binda ihop allt

Skriv kod för att binda ihop allt
Skriv kod för att binda ihop allt

Det är allt. Vår installation är klar. Du kan skriva din egen kod för att knyta ihop saker till ett komplett system eller använda koden som jag tillhandahåller. För att göra det skapar du bara katalogstrukturen och klonar förvaret, så här:

mkdir poolpi

cd poolpi git -klon

Redigera därefter filerna med namnet ifttt_url.txt i motion_alert- och water_level -katalogerna för att få webbadressen till din egen IFTTT -webkrok med din hemliga nyckel. Du kan använda två olika webbkrokar för olika åtgärder.

Slutligen vill vi att den här koden ska köras automatiskt. Det enklaste sättet att uppnå det är genom Linux crontab -tjänsten. Vi kan lägga till några crontab -linjer för två huvuduppgifter:

  1. Kör våra tre program: objektdetektorn, vattennivåsensorn och webbservern vid varje omstart
  2. Rensa utdatakatalogen, radera gamla bilder och gamla videofiler (jag valde att ta bort filer äldre än 1 dag och bilder äldre än 7 dagar - experimentera gärna)

För att göra den typen crontab -e som öppnar din nano -textredigerare. Lägg till följande rader längst ner i filen:

0 1 * * * hitta/home/pi/poolpi/output -typ f -name " *.avi" -mtime +1 -delete

0 2 * * * find/home/pi/poolpi/output -type f -name " *.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

Slutligen starta om din Raspberry Pi. Den är nu redo att hålla din pool full och säker.

Tänk på installationen, koden och glöm inte att stjärna mitt github -arkiv och kommentera det instruerbara om du tycker att det är användbart. Jag är alltid ute efter att lära mig mer.

Glad att göra!

IoT -utmaning
IoT -utmaning
IoT -utmaning
IoT -utmaning

Tvåa i IoT -utmaningen

Rekommenderad: