Съдържание:

Pool Pi Guy - AI управлявана алармена система и мониторинг на басейна с помощта на Raspberry Pi: 12 стъпки (със снимки)
Pool Pi Guy - AI управлявана алармена система и мониторинг на басейна с помощта на Raspberry Pi: 12 стъпки (със снимки)

Видео: Pool Pi Guy - AI управлявана алармена система и мониторинг на басейна с помощта на Raspberry Pi: 12 стъпки (със снимки)

Видео: Pool Pi Guy - AI управлявана алармена система и мониторинг на басейна с помощта на Raspberry Pi: 12 стъпки (със снимки)
Видео: ФИБРОМИАЛГИЯ: руководство для начинающих, чтобы начать тренироваться 2024, Юли
Anonim
Pool Pi Guy - AI управлявана алармена система и мониторинг на басейна с помощта на Raspberry Pi
Pool Pi Guy - AI управлявана алармена система и мониторинг на басейна с помощта на Raspberry Pi

Наличието на басейн у дома е забавно, но идва с голяма отговорност. Най -голямото ми притеснение е да наблюдавам дали някой е близо до басейна без надзор (особено по -малките деца). Най -голямото ми раздразнение е да се уверя, че водопроводът на басейна никога не пада под входа на помпата, което би изсушило помпата и я унищожи, което струва $$$ при ремонт.

Наскоро разбрах как да използвам Raspberry Pi с OpenCV и TensorFlow, заедно със сензор за нивото на водата и електромагнитен вентил, за да разреша и двата проблема - и да се забавлявате да го правите!

Оказва се, че също е страхотна алармена система - активирана с движение, AI -контролирана, безкрайно персонализирана.

Нека се потопим.

Стъпка 1: Гранд план

В тази инструкция ще покажем как да:

  1. Настройте Raspberry Pi с OpenCV и TensorFlow
  2. Свържете уеб камера чрез дълъг USB кабел
  3. Напишете алгоритъм на OpenCV за откриване на движение
  4. Използвайте TensorFlow за откриване на обекти
  5. Настройте уеб сървър на Raspberry Pi, за да показвате интересните изображения
  6. Интегрирайте се с IFTTT, за да задействате мобилни сигнали в случай на откриване на човек
  7. Прикрепете реле HAT към Raspberry Pi и го свържете към електромагнитен вентил, който би добавил вода към басейна
  8. Прикрепете сензор за нивото на водата към Raspberry Pi и се свържете с него, като използвате GPIO на Pi
  9. Напишете някакъв код, за да залепите всичко заедно

Стъпка 2: Списък за пазаруване

Списък за пазаруване
Списък за пазаруване

Всички компоненти са лесно достъпни от Amazon. Не се колебайте да експериментирате и да обменяте компоненти - това е половината забавление!

  1. Малина Пи
  2. Захранване Raspberry Pi (не спестявайте тук)
  3. Карта с памет (по -голямата е по -добра)
  4. Калъф (този е достатъчно голям, за да побере както Pi, така и HAT)
  5. USB уеб камера (всяка уеб камера ще е подходяща, но искате такава, която получава добри изображения и балансира добре осветлението)
  6. USB удължителен кабел (ако е необходимо - измерете разстоянието между Pi и мястото, където ще поставите камерата)
  7. Релейна платка HAT (тази има 3 релета и имаме нужда само от едно, но скоро ще намерите приложение за другите!)
  8. Соленоид
  9. Соленоиден монтаж 1 и Фитинг 2 (това наистина зависи в зависимост от това, към какво прилягате соленоида, но това работи при мен)
  10. Соленоидно захранване (всеки 24V AC би бил подходящ)
  11. Кабел (отново почти всеки двужилен кабел би бил подходящ - токът е минимален)
  12. Плаващ превключвател за нивото на водата (това е само пример, проверете какво може лесно да бъде свързано към вашия басейн)
  13. Някои джъмперни проводници и тел конектори

Стъпка 3: Настройка на вашия Raspberry Pi

Настройка на вашия Raspberry Pi
Настройка на вашия Raspberry Pi

Raspberry Pi е страхотен малък компютър. Той струва само 35 долара, работи последователно и има много съвместим софтуер и хардуер. Настройването му е доста лесно:

  1. Форматирайте вашата SD карта. Това се нуждае от специални грижи - Raspberry Pi може да се зарежда само от SD карта с формат FAT. Следвайте тези инструкции.
  2. Свържете Raspberry Pi към USB клавиатура и мишка, плюс HDMI дисплей, и следвайте инструкциите в урока Raspberry Pi NOOBS. Не забравяйте да настроите WiFi и да активирате SSH достъпа. Не забравяйте да зададете парола за стандартния пи акаунт.
  3. При настройката на вашата домашна мрежа статичен IP адрес за Raspberry Pi - това би улеснило много SSH.
  4. Уверете се, че имате инсталиран ssh клиент на вашия работен плот/лаптоп. За компютър бих препоръчал Putty, който можете да инсталирате от тук.
  5. Разкачете USB и HDMI от Raspberry Pi, рестартирайте го и го включете - ако всичко работи, трябва да видите нещо подобно:

Linux raspberrypi 4.14.98-v7+ #1200 SMP вт, 12 февруари 20:27:48 GMT 2019 armv7l

Програмите, включени в системата Debian GNU/Linux, са безплатен софтуер; точните условия за разпространение за всяка програма са описани в отделните файлове в/usr/share/doc/*/copyright. Debian GNU/Linux идва с АБСОЛЮТНО БЕЗ ГАРАНЦИЯ, доколкото това е позволено от приложимото законодателство. Последно влизане: Понеделник 13 май 10:41:40 2019 от 104.36.248.13 pi@raspberrypi: ~ $

Стъпка 4: Настройка на OpenCV

Настройка на OpenCV
Настройка на OpenCV

OpenCV е невероятна колекция от функции за манипулиране на изображения за компютърно зрение. Това ще ни позволи да четем изображения от уеб камерата, да ги манипулираме, за да намерим области на движение, да ги запишем и др. Настройката на Raspberry Pi не е трудна, но изисква известни грижи.

Започнете с инсталирането на virtaulenvwrapper: ще използваме python, за да извършим цялото си програмиране, а virtualenv ще ни помогне да поддържаме зависимости отделно за OpenCV и TensorFlow срещу Flask или GPIO:

pi@raspberrypi: ~ $ sudo pip инсталирайте virtualenvwrapper

Сега можете да изпълните "mkvirtualenv", за да създадете нова среда, "workon", за да работите върху нея и др.

Така че, нека създадем среда за нашата манипулация на изображения, с python 3 като интерпретатор по подразбиране (това е 2019 г., няма причина да се придържаме към по -стария python 2):

pi@raspberrypi: ~ $ mkvirtualenv cv -p python3

… (Cv) pi@raspberrypi: ~

Вече сме готови да инсталираме OpenCV. Най -вече ще следваме отличния урок в Learn OpenCV. Следвайте конкретно техните стъпки 1 и 2:

sudo apt -y актуализации sudo apt -y ъпгрейд ## Инсталиране на зависимости sudo apt-get -y инсталиране на изграждане-съществена проверка за инсталиране cmake pkg-config yasm sudo apt-get -y инсталиране на git gfortran sudo apt-get -y инсталиране на 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 инсталирате libxine2-dev libv4l-dev cd/usr/include/linux sudo ln -s -f../libv4l1-videodev.h videodev.h sudo apt-get -y инсталирайте 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 инсталирайте libvorbis-dev libxvidcore-dev libx264-dev sudo apt-get -y инсталирайте libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get -y инсталирайте libavresample-dev sudo apt-get -y инсталирайте x264 v4l-utils sudo apt -get -y инсталирайте libprotobuf -dev protobuf-компилатор sudo apt-get -y инсталирайте libgoogle-glog-dev libgflags-dev sudo apt-get -y инсталирайте libgphoto2-dev libeigen3-dev libhdf5-dev doxygen sudo apt-get инсталирайте libqtgui4 sudo apt-get install libq4 тест

Сега можем просто да инсталираме OpenCV с python връзки вътре в cv virtualenv (все още сте в него, нали?), Като използвате

pip install opencv-contrib-python

И това е! На нашия Raspberry Pi имаме инсталиран OpenCV, готов да заснема снимки и видеоклипове, да ги манипулира и да бъде готин.

Проверете това, като отворите интерпретатор на python и импортирате opencv и проверете дали няма грешки:

(cv) pi@raspberrypi: ~ $ python

Python 3.5.3 (по подразбиране, 27 септември 2018 г., 17:25:39) [GCC 6.3.0 20170516] в Linux Въведете „помощ“, „авторски права“, „кредити“или „лиценз“за повече информация. >>> импортирайте cv2 >>>

Стъпка 5: Настройка на TensorFlow

Настройка на TensorFlow
Настройка на TensorFlow

TensorFlow е рамка за машинно обучение / AI, разработена и поддържана от Google. Той има обширна поддръжка за дълбоко изучаващи се модели за различни задачи, включително откриване на обекти в изображения, и сега е доста лесен за инсталиране на Raspberry Pi. Производителността на неговите леки модели на малкия Pi е около 1 кадър в секунда, което е напълно подходящо за приложение като нашето.

По принцип ще следваме отличния урок на Edje Electronics, с модификации, направени възможни от по -новите дистрибуции на TensorFlow:

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 инсталирайте възглавница lxml jupyter matplotlib cython (cv) pi@raspberrypi: ~ $ sudo apt-get install python-tk

Сега трябва да компилираме протокола на Google. Просто следвайте инструкциите в стъпка 4 от същия отличен урок

И накрая, клонирайте и настройте дефинициите на модела на TensorFlow - следвайте стъпка 5 в урока на Edje Electronics

Чувствайте се свободни да следвате примера им и в стъпка 6, това е чудесно въведение в откриването на обекти на Raspberry Pi.

Стъпка 6: Откриване на движение с помощта на OpenCV

Нека започнем с тестване, че OpenCV може да взаимодейства с нашата уеб камера: ssh в Raspberry Pi, преминете към cv virtualenv (workon cv), отворете интерпретатор на python (просто въведете python) и въведете следните команди на python:

импортиране на 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 ('Прочетете размера на рамката: {} x {}'.format (frame.shape [1], frame.shape [0])

С малко късмет ще видите, че OpenCV успя да прочете HD кадър от камерата.

Можете да използвате cv2.imwrite (път, рамка), за да запишете тази рамка на диск и да я sftp обратно, за да погледнете действително.

Стратегията за откриване на движение е доста права:

  1. Работете върху рамки с по -ниска разделителна способност - тук няма нужда да работите с Full HD
  2. Освен това размажете изображенията, за да осигурите възможно най -малко шум.
  3. Запазете текуща средна стойност на последните N кадъра. За това приложение, където честотата на кадрите е около 1 FPS (само защото TensorFlow отнема известно време на кадър), открих, че N = 60 връща добри резултати. И тъй като внимателното внедряване не отнема повече процесор с повече кадри, което е ОК (отнема повече памет - но това е пренебрежимо, когато работим с кадрите с по -ниска разделителна способност)
  4. Извадете текущото изображение от текущата средна стойност (просто бъдете внимателни с въвеждането - трябва да разрешите положителни и отрицателни стойности [-255.. 255], така че кадърът трябва да се преобразува в int)
  5. Можете да извършите изваждането при преобразуване на кадъра в сива скала (и средното), или да го направите отделно за всеки от RGB каналите и след това да комбинирате резултатите (което е стратегията, която избрах, като я направих чувствителна към промени в цвета)
  6. Използвайте праг на делтата и премахнете шума чрез ерозия и разширяване
  7. Накрая потърсете контури на области с делта - тези области са мястото, където се е случило движение и текущото изображение е различно от средното за предишните изображения. Освен това можем да намерим ограничаващи кутии за тези контури, ако е необходимо.

Инкапсулирах кода, за да направя това в класа DeltaFinder python, който можете да намерите в моя github тук

Стъпка 7: Открийте обекти с помощта на TensorFlow

Ако сте следвали процедурата за инсталиране на TensorFlow, вече сте тествали, че имате инсталиран и работи TensorFlow.

За целите на откриване на хора в обща сцена на открито, моделите, които са предварително обучени в набора от данни COCO, се представят доста добре - точно този модел сме изтеглили в края на инсталацията на TensorFlow. Просто трябва да го използваме за заключение!

Отново, капсулирах зареждането и извода на модела в класа на python TFClassify, за да улесня нещата, които можете да намерите тук.

Стъпка 8: Настройте уеб сървър на Raspberry Pi

Настройте уеб сървър на Raspberry Pi
Настройте уеб сървър на Raspberry Pi

Най -лесният начин за достъп до резултатите от откриването на обекта е уеб браузър, така че нека настроим уеб сървър на Raspberry Pi. След това можем да го настроим да обслужва снимки от дадена директория.

Има няколко опции за рамка на уеб сървър. Избрах Flask. Той е изключително конфигуриран и лесен за разширяване с Python. Тъй като "мащабът", от който се нуждаем, е тривиален, той беше повече от достатъчен.

Предлагам да го инсталирате в нов virtualenv, така че:

pi@raspberrypi: ~ $ mkvirtualenv webserv

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

Обърнете внимание, че при нормална настройка на мрежата тя ще бъде достъпна само когато браузърът ви е в същата безжична локална мрежа като вашия Raspberry Pi. Можете да създадете картографиране на портове / NAT конфигурация на вашия интернет рутер, за да разрешите външен достъп - но аз препоръчвам срещу това. Кодът, който написах, не се опитва да осигури сигурността, от която се нуждаете, когато разрешавате общ интернет достъп до вашия Raspberry Pi.

Тествайте инсталацията си, като следвате ръководството за бърз старт на Flask

Стъпка 9: Известия за мобилни устройства от Raspberry Pi с помощта на IFTTT

Мобилни известия от Raspberry Pi с помощта на IFTTT
Мобилни известия от Raspberry Pi с помощта на IFTTT

Наистина искам да получавам мобилни известия, когато настъпят събития. В този случай, когато човек бъде открит и когато нивото на водата спадне. Най -простият начин, който открих да направя това, без да се налага да пиша персонализирано мобилно приложение, е да използвам IFTTT. IFTTT означава „If This Then That“и позволява на много видове събития да задействат много видове действия. В нашия случай се интересуваме от тригера на IFTTT Maker Webhook. Това ни позволява да задействаме действие IFTTT, като отправим HTTP POST заявка към сървъра IFTTT със специален ключ, присвоен на нашия акаунт, заедно с данни, които определят какво се е случило. Действието, което предприемаме, може да бъде толкова просто, колкото създаването на известие на мобилното ни устройство с помощта на мобилното приложение IFTTT, или нещо по -сложно от това.

Ето как да направите това:

  1. Създайте IFTTT акаунт на ifttt.com
  2. Докато сте влезли, отидете на страницата с настройки на услугата Webhook и въведете URL адреса в браузъра си (нещо като https://maker.ifttt.com/use/. Тази уеб страница ще ви покаже вашия ключ и URL адреса, които да използвате за задействане на действия.
  3. Създайте аплет IFTTT, който ще генерира мобилно известие, когато Webhook се задейства с подробности за събитието:

    1. Кликнете върху „Моите аплети“и след това върху „Нов аплет“.
    2. Кликнете върху „+това“и изберете „уеб куки“. Кликнете върху „Получаване на уеб заявка“, за да преминете към подробностите
    3. Дайте име на вашето събитие, напр. „PoolEvent“и кликнете върху „Създаване на тригер“
    4. Кликнете върху „+това“и изберете „известия“. След това изберете „Изпращане на богато известие от приложението IFTTT“
    5. За "заглавие" изберете нещо като "PoolPi"
    6. За "съобщение" напишете "Pool Pi открит:" и кликнете върху "добавяне на съставка".. "Стойност1".
    7. Върнете се към URL адреса, който сте копирали в стъпка 2. Той ще покаже URL адреса, който да използвате за извикване на новосъздадения ви аплет. Копирайте този URL адрес, като замените заместителя {event} с името на събитието (в нашия пример PoolEvent)
  4. Изтеглете, инсталирайте и влезте в приложението IFTTT за вашето мобилно устройство
  5. Стартирайте този скрипт на Python на вашия Raspberry Pi, за да видите, че работи (имайте предвид, че може да отнеме няколко секунди или минути, за да се задейства на мобилното ви устройство):

заявки за импортиране

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

Стъпка 10: Добавете реле HAT към Raspberry Pi и го свържете към соленоиден вентил

Добавете реле HAT към Raspberry Pi и го свържете към соленоиден клапан
Добавете реле HAT към Raspberry Pi и го свържете към соленоиден клапан
Добавете реле HAT към Raspberry Pi и го свържете към соленоиден клапан
Добавете реле HAT към Raspberry Pi и го свържете към соленоиден клапан
Добавете реле HAT към Raspberry Pi и го свържете към соленоиден клапан
Добавете реле HAT към Raspberry Pi и го свържете към соленоиден клапан

Преди да продължите с тази стъпка ИЗКЛЮЧЕТЕ вашия Raspberry Pi: ssh към него и напишете „sudo shutdown now“, след което го изключете от захранването

Нашата цел е да включим и изключим захранването към електромагнитен вентил - вентил, който може да отваря или затваря водоснабдяването въз основа на 24V AC мощност, която получава от захранване. Релетата са електрическите компоненти, които могат да отворят или затворят верига въз основа на цифров сигнал, който нашата Raspberry Pi може да осигури. Това, което правим тук, е да включим реле към тези цифрови сигнални щифтове на Raspberry Pi и да го затворим във веригата между захранването 24V AC и електромагнитния вентил.

Пиновете на Raspberry Pi, които могат да действат като цифров вход или изход, се наричат GPIO - Общоцелеви вход/изход и те са редът от 40 пина отстрани на Pi. С изключен Pi и поставете релето HAT здраво в него. ШАПКАТА, която избрах, има 3 релета в нея и ще използваме само едно от тях. Представете си всичко, което можете да направите с другите две:)

Сега отново включете Raspberry Pi. Червеният светодиод "захранване" на релето HAT трябва да светне, което показва, че получава захранване от Pi през GPIO. Нека тестваме, че можем да го контролираме: ssh в Pi отново, въведете python и въведете:

импортиране на gpiozero

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

Трябва да чуете звуково "щракване", което показва, че релето е включено, и да видите включен светодиод, показващ, че първото реле е в свързано положение. Вече можете да пишете

dev.on ()

Което ще превърне релето в положение "изключено" (странно, знам …) и излизане () от python.

Сега с помощта на джъмперни кабели и по -дългия кабел свържете релето между 24V захранването и електромагнитния вентил. Вижте диаграмата. И накрая, свържете соленоидния вентил към кран с помощта на адаптерите и се пригответе да тествате всичко, като повторите командите по -горе - те трябва да включват и изключват водата.

Прикрепете маркуч към електромагнитния клапан и поставете другия край дълбоко в басейна. Вече имате компютърно контролирана система за допълване на басейна и е време да свържете сензор, за да му кажете кога да стартира.

Стъпка 11: Свържете датчик за нивото на водата

Свържете датчик за нивото на водата
Свържете датчик за нивото на водата
Свържете датчик за нивото на водата
Свържете датчик за нивото на водата
Свържете датчик за нивото на водата
Свържете датчик за нивото на водата
Свържете датчик за нивото на водата
Свържете датчик за нивото на водата

Сензорът за нивото на водата е просто поплавък, който свързва електрическа верига, когато плувката е спусната, и я прекъсва, когато плува нагоре. Ако го поставите в басейна на правилната височина, поплавъкът ще се покачи, когато нивото на водата е достатъчно, но ще падне, когато няма достатъчно вода.

За да може Raspberry Pi да знае състоянието на сензора за нивото на водата, ние се нуждаем от Pi, за да усетим отворена или затворена верига. За щастие това е много просто: същите GPIO конектори, които използваме като цифров изход за управление на релетата, могат да действат като входове (оттук I в GPIO). По-конкретно, ако свържем един проводник на сензора към +3.3V на GPIO конектора, а другия сензорен проводник към щифт, който конфигурираме като падащ вход (което означава, че обикновено ще бъде при ниво на напрежение GND), този щифт ще измерва цифрово "високо" или "включено" напрежение само когато сензорът за нивото на водата затвори веригата - когато нивото на водата е ниско. Използвах GPIO пин 16 като вход, който маркирах на изображението по -горе.

Кодът на python за конфигуриране на щифта като вход и тестване на текущото му състояние е:

импортиране на gpiozero

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

Едно потенциално предизвикателство е, че когато сензорът просто промени състоянието си, той ще се колебае бързо между състоянията на включване и изключване. Решението за това е известно като „деблокиране“и търси последователна промяна на състоянието, преди да предприеме действия. Библиотеката GPIOZERO има код за това, но по някаква причина този код не работи добре за мен. Написах прост цикъл за задействане на IFTTT сигнали при откриване на последователна промяна в състоянието, която можете да намерите в моето хранилище тук.

Стъпка 12: Напишете код, за да свържете всичко заедно

Напишете код, за да свържете всичко заедно
Напишете код, за да свържете всичко заедно

Това е. Нашата настройка е завършена. Можете да напишете свой собствен код, за да свържете нещата в една пълна система, или да използвате предоставения от мен код. За да направите това, просто създайте структурата на директориите и клонирайте хранилището по следния начин:

mkdir poolpi

cd poolpi git clone

След това редактирайте файловете с име ifttt_url.txt в директории motion_alert и water_level, за да имат URL адреса за вашата собствена уеб кука IFTTT с вашия секретен ключ. Можете да използвате две различни уеб куки за различни действия.

И накрая, искаме този код да работи автоматично. Най -лесният начин да постигнете това е чрез услугата crontab на Linux. Можем да добавим няколко реда за две основни задачи:

  1. Стартирайте нашите три програми: детектор на обекти, сензор за нивото на водата и уеб сървър при всяко рестартиране
  2. Почистете изходната директория, изтрийте стари снимки и стари видео файлове (избрах да изтрия файлове, по -стари от 1 ден и снимки, по -стари от 7 дни - не се колебайте да експериментирате)

За да направите това, въведете crontab -e, което ще отвори вашия nano текстов редактор. Добавете следните редове в долната част на файла:

0 1 * * * find/home/pi/poolpi/output -type 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

Накрая рестартирайте вашия Raspberry Pi. Вече е готов да поддържа вашия басейн пълен и безопасен.

Помислете за настройката, кода и не забравяйте да маркирате моето хранилище на github със звезда и да коментирате инструкциите, ако намерите това за полезно. Винаги гледам да науча повече.

Приятно правене!

IoT Challenge
IoT Challenge
IoT Challenge
IoT Challenge

На второ място в IoT Challenge

Препоръчано: