Raspberry Pi: обнаружение движения с помощью PIR-датчика на Python
Узнайте, как использовать PIR-датчик движения с Raspberry Pi для обнаружения движения. Мы покажем, как подключить датчик к GPIO Raspberry Pi и написать Python-скрипт, который выполняет определённое действие при обнаружении движения. Для написания Python-скрипта мы будем использовать интерфейс gpiozero.
В этом руководстве мы рассмотрим следующие основные темы:
Предварительные требования
Прежде чем продолжить изучение данного руководства, проверьте следующие предварительные требования.
Ознакомьтесь с платой Raspberry Pi — если вы ещё не знакомы с Raspberry Pi, вы можете прочитать наше руководство по началу работы с Raspberry Pi.
Вы должны знать, как запускать и создавать Python-файлы на Raspberry Pi. Мы предпочитаем программировать Raspberry Pi удалённо через SSH, используя расширение в VS Code. У нас есть подробное руководство на эту тему: Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH).
Разберитесь, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: Справочник по распиновке Raspberry Pi: как использовать GPIO Raspberry Pi?
Знакомство с PIR-датчиком движения
PIR-датчик движения обнаруживает изменения инфракрасного излучения в своём поле зрения. Это делает его идеальным для обнаружения людей или животных, потому что он будет улавливать живые существа (или объекты, излучающие тепло), которые перемещаются в пределах его зоны действия, но не неподвижные объекты.
Вы можете запрограммировать Pi реагировать на изменения инфракрасного излучения, инициируя событие, такое как включение света, подача сигнала тревоги, отправка уведомления или, как мы сделаем в этом проекте, простой вывод сообщения в командную оболочку.
PIR-датчик движения выдаёт сигнал HIGH на выводе Data при обнаружении движения или сигнал LOW, если движение не обнаружено. У него всего три вывода: VCC, GND и Data.
Подключение PIR-датчика движения к Raspberry Pi
PIR-датчик движения имеет три вывода: VCC, GND и Data. Вы должны подключить VCC к выводу 3V3, GND к выводу GND, а вывод Data — к подходящему GPIO Raspberry Pi — мы подключим его к GPIO 18 (посмотрите распиновку Raspberry Pi).
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, вы можете начать со следующих руководств:
Вы можете посмотреть все наши проекты для Raspberry Pi по следующей ссылке: