Raspberry Pi: обнаружение движения с помощью PIR-датчика на Python

Узнайте, как использовать PIR-датчик движения с Raspberry Pi для обнаружения движения. Мы покажем, как подключить датчик к GPIO Raspberry Pi и написать Python-скрипт, который выполняет определённое действие при обнаружении движения. Для написания Python-скрипта мы будем использовать интерфейс gpiozero.

Raspberry Pi — обнаружение движения с помощью PIR-датчика движения и Python-скрипта

В этом руководстве мы рассмотрим следующие основные темы:

  1. Знакомство с PIR-датчиком движения

  2. Подключение PIR-датчика движения к Raspberry Pi

  3. Обнаружение движения с помощью Raspberry Pi и gpiozero

Предварительные требования

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

  1. Ознакомьтесь с платой Raspberry Pi — если вы ещё не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать Python-файлы на Raspberry Pi. Мы предпочитаем программировать Raspberry Pi удалённо через SSH, используя расширение в VS Code. У нас есть подробное руководство на эту тему: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.

  3. Разберитесь, как использовать 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-датчик движения AM312 — распиновка с подписями

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, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключение PIR-датчика движения к Raspberry Pi

Обнаружение движения с помощью 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-датчиком движения.

Тестирование PIR-датчика движения с Raspberry Pi

Вы должны увидеть сообщение в командной оболочке, указывающее, что движение было обнаружено.

Через несколько секунд, если датчик больше не обнаруживает движение, вы увидите сообщение о том, что движение прекратилось.

Raspberry Pi с PIR-датчиком движения — тестирование в командной оболочке

Вы можете остановить выполнение программы, нажав CTRL + C.

Другие полезные методы

Интерфейс MotionSensor предоставляет другие полезные дополнительные методы.

  • wait_for_motion(timeout): приостанавливает выполнение скрипта до обнаружения движения или до истечения таймаута. По умолчанию таймаут отсутствует, поэтому программа будет ждать на этой строке кода бесконечно, пока не будет обнаружено движение.

  • wait_for_no_motion(timeout): приостанавливает выполнение скрипта до тех пор, пока датчик движения не перестанет обнаруживать движение или пока не истечёт таймаут.

  • motion_detected: возвращает True, если текущее значение превышает пороговое (движение обнаружено), или False в противном случае.

Заключение

В этом руководстве вы узнали, как использовать PIR-датчик движения с Raspberry Pi и выполнять различные действия в зависимости от того, обнаружено движение или нет, используя библиотеку gpiozero.

У нас есть ещё одно руководство, которое показывает, как отправить уведомление по электронной почте при обнаружении движения:

Мы надеемся, что это руководство было для вас полезным. Если вы начинающий пользователь Raspberry Pi, вы можете начать со следующих руководств:

Вы можете посмотреть все наши проекты для Raspberry Pi по следующей ссылке: