Raspberry Pi: обнаружение движения с помощью PIR-датчика на Python
Узнайте, как использовать PIR-датчик движения с Raspberry Pi для обнаружения движения. Мы покажем, как подключить датчик к GPIO Raspberry Pi и написать Python-скрипт, который выполняет определённое действие при обнаружении движения. Для написания Python-скрипта мы будем использовать интерфейс gpiozero.
В этом руководстве мы рассмотрим следующие основные темы:
Предварительные требования
Прежде чем продолжить изучение данного руководства, проверьте следующие предварительные требования.
Ознакомьтесь с платой Raspberry Pi — если вы ещё не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.
Вы должны знать, как запускать и создавать Python-файлы на Raspberry Pi. Мы предпочитаем программировать Raspberry Pi удалённо через SSH, используя расширение в VS Code. У нас есть подробное руководство на эту тему: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.
Разберитесь, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Справочник по распиновке Raspberry Pi: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_
Знакомство с PIR-датчиком движения
PIR-датчик движения обнаруживает изменения инфракрасного излучения в своём поле зрения. Это делает его идеальным для обнаружения людей или животных, потому что он будет улавливать живые существа (или объекты, излучающие тепло), которые перемещаются в пределах его зоны действия, но не неподвижные объекты.
Вы можете запрограммировать Pi реагировать на изменения инфракрасного излучения, инициируя событие, такое как включение света, подача сигнала тревоги, :doc:`отправка уведомления </raspberry/rnt/raspberry-pi-send-email-python-smtp-server/index>`_ или, как мы сделаем в этом проекте, простой вывод сообщения в командную оболочку.
PIR-датчик движения выдаёт сигнал HIGH на выводе Data при обнаружении движения или сигнал LOW, если движение не обнаружено. У него всего три вывода: VCC, GND и Data.
Подключение PIR-датчика движения к Raspberry Pi
PIR-датчик движения имеет три вывода: VCC, GND и Data. Вы должны подключить VCC к выводу 3V3, GND к выводу GND, а вывод Data — к подходящему GPIO Raspberry Pi — мы подключим его к GPIO 18 (:doc:`посмотрите распиновку Raspberry Pi </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_).
PIR-датчик движения |
Raspberry Pi |
|---|---|
Vin/3v3 |
3.3V |
Data |
GPIO 18 (или другой GPIO по вашему выбору) |
GND |
GND |
Мы будем использовать PIR-датчик движения AM312 Mini, потому что он работает от 3.3В, что идеально подходит для Raspberry Pi.
Вот список компонентов, которые вам понадобятся для этого проекта:
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Обнаружение движения с помощью Raspberry Pi и gpiozero
После подключения PIR-датчика движения к GPIO Raspberry Pi мы можем написать Python-скрипт для определения состояния датчика и, таким образом, проверки — обнаружено движение или нет. Для написания этого скрипта мы будем использовать библиотеку gpiozero.
Библиотека gpiozero предоставляет набор интерфейсов для повседневных компонентов, таких как светодиоды, кнопки, потенциометры, датчики и многое другое.
Она предоставляет интерфейс под названием MotionSensor, разработанный специально для датчиков движения. Он поставляется с несколькими свойствами и функциями, которые удобно использовать с такого рода датчиками.
Библиотека gpiozero должна быть уже установлена, если вы используете Raspberry Pi OS — если нет, вы можете выполнить:
python3 -m pip install gpiozero
Обнаружение движения — Python-скрипт
Следующий скрипт выводит разные сообщения в командную оболочку в зависимости от того, обнаруживает датчик движение или нет. Создайте новый Python-файл с именем motion-sensor.py и скопируйте следующий код.
# Complete Project Details: https://RandomNerdTutorials.com/raspberry-pi-detect-motion-pir-python/
from gpiozero import MotionSensor
from signal import pause
pir = MotionSensor(18)
def motion_function():
print("Motion Detected")
def no_motion_function():
print("Motion stopped")
pir.when_motion = motion_function
pir.when_no_motion = no_motion_function
pause()
Как работает код
Продолжайте чтение, чтобы узнать, как работает код.
Импорт библиотек
Сначала вы импортируете компонент MotionSensor из библиотеки gpiozero для работы с датчиком движения. Затем вам также нужно импортировать функцию pause() из модуля signal, чтобы ваша программа продолжала работать и могла обнаруживать события движения.
from gpiozero import MotionSensor
from signal import pause
Объявление датчика движения
Далее вы создаёте объект MotionSensor с именем pir, который ссылается на GPIO 18 — это GPIO, к которому подключён датчик движения. Измените номер, если вы используете другой GPIO.
pir = MotionSensor(18)
Когда вы создаёте и используете этот объект MotionSensor, ваша программа знает, что к GPIO 18 подключён PIR-датчик движения.
Вы можете передать другие полезные аргументы классу MotionSensor, но значения по умолчанию должны работать отлично. Если ваш PIR-датчик движения работает не так, как ожидалось, вы можете попробовать поэкспериментировать с его свойствами.
MotionSensor(pin, *, queue_len=1, sample_rate=10, threshold=0.5, partial=False, pin_factory=None)
Вот что означают эти параметры:
pin: GPIO, к которому подключён датчик.
queue_len: длина очереди, используемой для хранения значений, считанных с датчика. Значение по умолчанию — 1, что отключает очередь. Если ваш датчик движения особенно «нервный», вы можете увеличить это значение.
sample_rate: значение по умолчанию — 10 — это количество значений, считываемых с датчика и добавляемых во внутреннюю очередь в секунду.
threshold: по умолчанию — 0.5 секунды. Когда среднее значение всех элементов во внутренней очереди превышает это значение, датчик будет считаться активным — это означает, что движение было обнаружено.
partial: когда False (по умолчанию), объект не будет возвращать значение для is_active до тех пор, пока внутренняя очередь не заполнится значениями. Установите это значение в True, только если вам требуются значения сразу после создания объекта.
pin_factory: это расширенная функция, которую вам, вероятно, не нужно будет использовать или беспокоиться о ней.
Обнаружение событий движения
Вы можете использовать обработчики when_motion и when_no_motion для обнаружения того, обнаружил ли датчик движение или нет, и назначить функцию, которая будет выполняться при обнаружении каждого события.
when_motion
В следующей строке, когда обнаружено движение (when_motion), выполняется функция motion_function, которая выведет сообщение в командную оболочку, указывающее, что движение было обнаружено. Вы можете вызвать любую функцию, чтобы выполнить любое другое действие.
pir.when_motion = motion_function
Вот определение функции motion_function:
def motion_function():
print("Motion Detected")
when_no_motion
Вы можете сделать что-то подобное для случая, когда датчик перестаёт обнаруживать движение. В этом случае, когда обнаруживается событие when_no_motion, мы вызываем функцию no_motion_function, которая выводит сообщение в командную оболочку.
pir.when_no_motion = no_motion_function
Вот определение no_motion_function:
def no_motion_function():
print("Motion stopped")
Вместо простого вывода сообщений в командную оболочку вы можете связать любую другую функцию, которую необходимо выполнить при обнаружении этих событий движения, например, включение/выключение светодиода, отправку уведомления и т.д.
Поддержание работы программы
В конце мы вызываем функцию pause(). Она поддерживает работу программы даже после того, как весь код был выполнен, для обнаружения событий — в данном случае она непрерывно проверяет состояние датчика движения.
pause()
Подведём итоги…
1) Для обнаружения движения с помощью PIR-датчика движения с Raspberry Pi вы можете использовать интерфейс MotionSensor библиотеки gpiozero. Сначала его нужно импортировать так:
from gpiozero import MotionSensor
2) Определите GPIO, к которому подключён датчик движения:
pir = MotionSensor(GPIO_NUMBER_OF_YOUR_CHOICE)
3) Затем используйте обработчики событий when_motion() и when_no_motion() для запуска функции при обнаружении или прекращении движения:
pir.when_motion = FUNCTION_TO_RUN_WHEN_MOTION_IS_DETECTED
pir.when_no_motion = FUNCTION_TO_RUN_WHEN_MOTION_STOPS
Демонстрация
Сохраните ваш Python-файл. Затем запустите его на Raspberry Pi. Выполните следующую команду:
python motion-sensor.py
Проведите рукой перед PIR-датчиком движения.
Вы должны увидеть сообщение в командной оболочке, указывающее, что движение было обнаружено.
Через несколько секунд, если датчик больше не обнаруживает движение, вы увидите сообщение о том, что движение прекратилось.
Вы можете остановить выполнение программы, нажав CTRL + C.
Другие полезные методы
Интерфейс MotionSensor предоставляет другие полезные дополнительные методы.
wait_for_motion(timeout): приостанавливает выполнение скрипта до обнаружения движения или до истечения таймаута. По умолчанию таймаут отсутствует, поэтому программа будет ждать на этой строке кода бесконечно, пока не будет обнаружено движение.
wait_for_no_motion(timeout): приостанавливает выполнение скрипта до тех пор, пока датчик движения не перестанет обнаруживать движение или пока не истечёт таймаут.
motion_detected: возвращает True, если текущее значение превышает пороговое (движение обнаружено), или False в противном случае.
Заключение
В этом руководстве вы узнали, как использовать PIR-датчик движения с Raspberry Pi и выполнять различные действия в зависимости от того, обнаружено движение или нет, используя библиотеку gpiozero.
У нас есть ещё одно руководство, которое показывает, как отправить уведомление по электронной почте при обнаружении движения:
Мы надеемся, что это руководство было для вас полезным. Если вы начинающий пользователь Raspberry Pi, вы можете начать со следующих руководств:
:doc:`Начало работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_
:doc:`Справочник по распиновке Raspberry Pi </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_
Вы можете посмотреть все наши проекты для Raspberry Pi по следующей ссылке: